| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import optparse |
| import unittest |
| |
| from telemetry import android |
| from telemetry import benchmark |
| from telemetry.testing import options_for_unittests |
| from telemetry.internal import story_runner |
| from telemetry import page |
| from telemetry.page import legacy_page_test |
| from telemetry.page import shared_page_state |
| from telemetry import story as story_module |
| from telemetry.web_perf import timeline_based_measurement |
| |
| |
| class DummyPageTest(legacy_page_test.LegacyPageTest): |
| def ValidateAndMeasurePage(self, *_): |
| pass |
| |
| |
| class TestBenchmark(benchmark.Benchmark): |
| def __init__(self, story): |
| super(TestBenchmark, self).__init__() |
| self._story_set = story_module.StorySet() |
| self._story_set.AddStory(story) |
| |
| def CreatePageTest(self, _): |
| return DummyPageTest() |
| |
| def CreateStorySet(self, _): |
| return self._story_set |
| |
| |
| class BenchmarkTest(unittest.TestCase): |
| |
| def testPageTestWithIncompatibleStory(self): |
| b = TestBenchmark(story_module.Story( |
| shared_state_class=shared_page_state.SharedPageState)) |
| with self.assertRaisesRegexp( |
| Exception, 'containing only telemetry.page.Page stories'): |
| b.Run(options_for_unittests.GetCopy()) |
| |
| state_class = story_module.SharedState |
| b = TestBenchmark(story_module.Story( |
| shared_state_class=state_class)) |
| with self.assertRaisesRegexp( |
| Exception, 'containing only telemetry.page.Page stories'): |
| b.Run(options_for_unittests.GetCopy()) |
| |
| b = TestBenchmark(android.AndroidStory(start_intent=None)) |
| with self.assertRaisesRegexp( |
| Exception, 'containing only telemetry.page.Page stories'): |
| b.Run(options_for_unittests.GetCopy()) |
| |
| def testPageTestWithCompatibleStory(self): |
| original_run_fn = story_runner.Run |
| was_run = [False] |
| def RunStub(*arg, **kwargs): |
| del arg, kwargs |
| was_run[0] = True |
| story_runner.Run = RunStub |
| |
| try: |
| options = options_for_unittests.GetCopy() |
| options.output_formats = ['none'] |
| options.suppress_gtest_report = True |
| parser = optparse.OptionParser() |
| benchmark.AddCommandLineArgs(parser) |
| options.MergeDefaultValues(parser.get_default_values()) |
| |
| b = TestBenchmark(page.Page(url='about:blank')) |
| b.Run(options) |
| finally: |
| story_runner.Run = original_run_fn |
| |
| self.assertTrue(was_run[0]) |
| |
| def testOverriddenTbmOptionsAndPageTestRaises(self): |
| class FakeTimelineBasedMeasurementOptions(object): |
| pass |
| |
| class OverrideBothBenchmark(benchmark.Benchmark): |
| def CreatePageTest(self, _): |
| return DummyPageTest() |
| def CreateTimelineBasedMeasurementOptions(self): |
| return FakeTimelineBasedMeasurementOptions() |
| |
| assertion_regex = ( |
| 'Cannot override both CreatePageTest and ' |
| 'CreateTimelineBasedMeasurementOptions') |
| with self.assertRaisesRegexp(AssertionError, assertion_regex): |
| OverrideBothBenchmark() |
| |
| def testBenchmarkMakesTbmTestByDefault(self): |
| class DefaultTbmBenchmark(benchmark.Benchmark): |
| pass |
| |
| self.assertIsInstance( |
| DefaultTbmBenchmark().CreatePageTest(options=None), |
| timeline_based_measurement.TimelineBasedMeasurement) |
| |
| def testUnknownTestTypeRaises(self): |
| class UnknownTestType(object): |
| pass |
| class UnknownTestTypeBenchmark(benchmark.Benchmark): |
| test = UnknownTestType |
| |
| type_error_regex = ( |
| '"UnknownTestType" is not a PageTest or a TimelineBasedMeasurement') |
| with self.assertRaisesRegexp(TypeError, type_error_regex): |
| UnknownTestTypeBenchmark().CreatePageTest(options=None) |
| |
| def testOverriddenTbmOptionsAndPageTestTestAttributeRaises(self): |
| class FakeTimelineBasedMeasurementOptions(object): |
| pass |
| |
| class OverrideOptionsOnPageTestBenchmark(benchmark.Benchmark): |
| test = DummyPageTest |
| def CreateTimelineBasedMeasurementOptions(self): |
| return FakeTimelineBasedMeasurementOptions() |
| |
| assertion_regex = ( |
| 'Cannot override CreateTimelineBasedMeasurementOptions ' |
| 'with a PageTest') |
| with self.assertRaisesRegexp(AssertionError, assertion_regex): |
| OverrideOptionsOnPageTestBenchmark().CreatePageTest(options=None) |
| |
| def testBenchmarkPredicate(self): |
| class PredicateBenchmark(TestBenchmark): |
| @classmethod |
| def ValueCanBeAddedPredicate(cls, value, is_first_result): |
| return False |
| |
| original_run_fn = story_runner.Run |
| validPredicate = [False] |
| |
| def RunStub(test, story_set_module, finder_options, results, |
| *args, **kwargs): # pylint: disable=unused-argument |
| predicate = results._value_can_be_added_predicate |
| valid = predicate == PredicateBenchmark.ValueCanBeAddedPredicate |
| validPredicate[0] = valid |
| |
| story_runner.Run = RunStub |
| |
| try: |
| options = options_for_unittests.GetCopy() |
| options.output_formats = ['none'] |
| options.suppress_gtest_report = True |
| parser = optparse.OptionParser() |
| benchmark.AddCommandLineArgs(parser) |
| options.MergeDefaultValues(parser.get_default_values()) |
| |
| b = PredicateBenchmark(page.Page(url='about:blank')) |
| b.Run(options) |
| finally: |
| story_runner.Run = original_run_fn |
| |
| self.assertTrue(validPredicate[0]) |