# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """ An adapter class for CBB to interact with the crossbench runner. The goal is to abstract out the crossbench runner interface details and provide an integration point for CBB. Any breaking changes in the function definitions here need to be coordinated with corresponding changes in CBB in google3 """ from __future__ import annotations import datetime as dt from typing import TYPE_CHECKING, List, Optional, Type from selenium import webdriver import crossbench.benchmarks.all as benchmarks import crossbench.browsers.browser import crossbench.browsers.webdriver as cb_webdriver import crossbench.env import crossbench.runner.runner from crossbench import path as pth from crossbench.runner.run import Run if TYPE_CHECKING: from crossbench.benchmarks.base import PressBenchmark from crossbench.runner.groups.session import BrowserSessionRunGroup from crossbench.stories.press_benchmark import PressBenchmarkStory from crossbench.stories.story import Story press_benchmarks: List[Type[PressBenchmark]] = [ benchmarks.Speedometer20Benchmark, benchmarks.Speedometer21Benchmark, benchmarks.Speedometer30Benchmark, benchmarks.MotionMark12Benchmark, benchmarks.MotionMark13Benchmark, benchmarks.JetStream20Benchmark, benchmarks.JetStream21Benchmark, benchmarks.JetStream22Benchmark, benchmarks.JetStream30Benchmark, ] press_benchmarks_dict = {cls.NAME: cls for cls in press_benchmarks} def get_pressbenchmark_cls( benchmark_name: str) -> Optional[Type[PressBenchmark]]: """Returns the class of the specified pressbenchmark. Args: benchmark_name: Name of the benchmark. Returns: An instance of the benchmark implementation """ return press_benchmarks_dict.get(benchmark_name) def get_pressbenchmark_story_cls( benchmark_name: str) -> Optional[Type[PressBenchmarkStory]]: """Returns the class of the specified pressbenchmark story. Args: benchmark_name: Name of the benchmark. Returns: An instance of the benchmark default story """ benchmark_cls = get_pressbenchmark_cls(benchmark_name) if benchmark_cls is not None: return benchmark_cls.DEFAULT_STORY_CLS return None def create_remote_webdriver(driver: webdriver.Remote ) -> cb_webdriver.RemoteWebDriver: """Creates a remote webdriver instance for the driver. Args: driver: Remote web driver instance. """ browser = cb_webdriver.RemoteWebDriver("default", driver) browser.version = driver.capabilities["browserVersion"] return browser def get_probe_result_file(benchmark_name: str, browser: crossbench.browsers.browser.Browser, output_dir: pth.LocalPathLike, probe_name: Optional[str] = None) -> Optional[str]: """Returns the path to the probe result file. Args: benchmark_name: Name of the benchmark. browser: Browser instance. output_dir: Path to the directory where the output of the benchmark execution was written. probe_name: Optional name of the probe for the result file. If not specified, the first probe from the default benchmark story will be used.""" output_dir_path = pth.LocalPath(output_dir) if probe_name is None: if benchmark_name not in press_benchmarks_dict: return None benchmark_cls = press_benchmarks_dict[benchmark_name] probe_cls = benchmark_cls.PROBES[0] probe_name = probe_cls.NAME result_file: pth.LocalPath = ( output_dir_path / browser.unique_name / "stories" / f"{probe_name}.json") return str(result_file) class CbbRunner(crossbench.runner.runner.Runner): def create_run(self, browser_session: BrowserSessionRunGroup, story: Story, repetition: int, is_warmup: bool, temperature: str, index: int, name: str, timeout: dt.timedelta, throw: bool) -> Run: return CbbRun(self, browser_session, story, repetition, is_warmup, temperature, index, name, timeout, throw) class CbbRun(Run): def _create_session_dir(self) -> None: # Don't create symlink loops and skip this step pass def run_benchmark(output_folder: pth.LocalPathLike, browser_list: List[crossbench.browsers.browser.Browser], benchmark: PressBenchmark) -> None: """Runs the benchmark using crossbench runner. Args: output_folder: Path to the directory where the output of the benchmark execution will be written. browser_list: List of browsers to run the benchmark on. benchmark: The Benchmark instance to run. """ runner = CbbRunner( out_dir=pth.LocalPath(output_folder), browsers=browser_list, benchmark=benchmark, env_validation_mode=crossbench.env.ValidationMode.SKIP) runner.run()