| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import abc |
| import copy |
| import csv |
| from typing import Optional, Type |
| from unittest import mock |
| |
| from crossbench.benchmarks.jetstream.jetstream_2 import (JetStream2Benchmark, |
| JetStream2Probe, |
| JetStream2Story) |
| from crossbench.env import (HostEnvironment, HostEnvironmentConfig, |
| ValidationMode) |
| from crossbench.runner.runner import Runner |
| from tests.crossbench.benchmarks import helper |
| from tests.crossbench.mock_browser import JsInvocation |
| |
| |
| class JetStream2BaseTestCase( |
| helper.PressBaseBenchmarkTestCase, metaclass=abc.ABCMeta): |
| |
| @property |
| @abc.abstractmethod |
| def benchmark_cls(self) -> Type[JetStream2Benchmark]: |
| pass |
| |
| @property |
| @abc.abstractmethod |
| def story_cls(self) -> Type[JetStream2Story]: |
| pass |
| |
| @property |
| @abc.abstractmethod |
| def probe_cls(self) -> Type[JetStream2Probe]: |
| pass |
| |
| def test_run_throw(self): |
| self._test_run(throw=True) |
| |
| def test_run_default(self): |
| self._test_run() |
| for browser in self.browsers: |
| urls = self.filter_splashscreen_urls(browser.url_list) |
| self.assertIn(self.story_cls.URL, urls) |
| self.assertNotIn(self.story_cls.URL_LOCAL, urls) |
| |
| def test_run_custom_url(self): |
| custom_url = "http://test.example.com/jetstream" |
| self._test_run(custom_url) |
| for browser in self.browsers: |
| urls = self.filter_splashscreen_urls(browser.url_list) |
| self.assertIn(custom_url, urls) |
| self.assertNotIn(self.story_cls.URL, urls) |
| self.assertNotIn(self.story_cls.URL_LOCAL, urls) |
| |
| def _test_run(self, custom_url: Optional[str] = None, throw: bool = False): |
| repetitions = 3 |
| stories = self.story_cls.from_names(["WSL"], url=custom_url) |
| example_story_data = { |
| "firstIteration": 1, |
| "average": 0.1, |
| "worst4": 1.1, |
| "score": 1 |
| } |
| # The order should match Runner.get_runs |
| for _ in range(repetitions): |
| for _ in stories: |
| jetstream_probe_results = { |
| story.name: example_story_data for story in stories |
| } |
| for browser in self.browsers: |
| # Page is ready |
| browser.expect_js(result=True) |
| # filter benchmarks |
| browser.expect_js() |
| # UI is updated and ready, |
| browser.expect_js(result=True) |
| # Start running benchmark |
| browser.expect_js() |
| # Wait until done |
| browser.expect_js(result=True) |
| browser.expect_js(result=jetstream_probe_results) |
| for browser in self.browsers: |
| browser.expected_js = copy.deepcopy(browser.expected_js) |
| |
| benchmark = self.benchmark_cls(stories, custom_url=custom_url) # pytype: disable=not-instantiable |
| self.assertTrue(len(benchmark.describe()) > 0) |
| runner = Runner( |
| self.out_dir, |
| self.browsers, |
| benchmark, |
| env_config=HostEnvironmentConfig(), |
| env_validation_mode=ValidationMode.SKIP, |
| platform=self.platform, |
| repetitions=repetitions, |
| throw=throw) |
| with mock.patch.object( |
| HostEnvironment, "validate_url", return_value=True) as cm: |
| runner.run() |
| cm.assert_called_once() |
| for browser in self.browsers: |
| urls = self.filter_splashscreen_urls(browser.url_list) |
| self.assertEqual(len(urls), repetitions) |
| self.assertTrue(browser.was_js_invoked(self.probe_cls.JS)) |
| |
| csv_file = self.out_dir / f"{self.probe_cls.NAME}.csv" |
| with csv_file.open(encoding="utf-8") as f: |
| csv_data = list(csv.DictReader(f, delimiter="\t")) |
| self.assertListEqual(list(csv_data[0].keys()), ["label", "dev", "stable"]) |
| self.assertDictEqual(csv_data[1], { |
| "label": "version", |
| "dev": "102.22.33.44", |
| "stable": "100.22.33.44", |
| }) |
| |
| with self.assertLogs(level='INFO') as cm: |
| for probe in runner.probes: |
| for run in runner.runs: |
| probe.log_run_result(run) |
| output = "\n".join(cm.output) |
| self.assertIn("JetStream results", output) |
| |
| with self.assertLogs(level='INFO') as cm: |
| for probe in runner.probes: |
| probe.log_browsers_result(runner.browser_group) |
| output = "\n".join(cm.output) |
| self.assertIn("JetStream results", output) |
| self.assertIn("102.22.33.44", output) |
| self.assertIn("100.22.33.44", output) |
| |
| |
| # TODO: introduce JetStreamBaseTestCase |
| class JetStream3BaseTestCase(JetStream2BaseTestCase, metaclass=abc.ABCMeta): |
| pass |