| # 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. |
| |
| """Run the first page of every benchmark that has a composable measurement. |
| |
| Ideally this test would be comprehensive, but the above serves as a |
| kind of smoke test. |
| """ |
| |
| import os |
| import unittest |
| |
| from telemetry import benchmark as benchmark_module |
| from telemetry.core import discover |
| from telemetry.page import page_test |
| from telemetry.unittest import options_for_unittests |
| from telemetry.unittest import progress_reporter |
| |
| |
| def SmokeTestGenerator(benchmark): |
| # NOTE TO SHERIFFS: DO NOT DISABLE THIS TEST. |
| # |
| # This smoke test dynamically tests all benchmarks. So disabling it for one |
| # failing or flaky benchmark would disable a much wider swath of coverage |
| # than is usally intended. Instead, if a particular benchmark is failing, |
| # disable it in tools/perf/benchmarks/*. |
| @benchmark_module.Disabled('chromeos') # crbug.com/351114 |
| def BenchmarkSmokeTest(self): |
| # Only measure a single page so that this test cycles reasonably quickly. |
| benchmark.options['pageset_repeat'] = 1 |
| benchmark.options['page_repeat'] = 1 |
| |
| class SinglePageBenchmark(benchmark): # pylint: disable=W0232 |
| def CreatePageSet(self, options): |
| # pylint: disable=E1002 |
| ps = super(SinglePageBenchmark, self).CreatePageSet(options) |
| for p in ps.pages: |
| if not p.disabled: |
| p.skip_waits = True |
| ps.pages = [p] |
| break |
| return ps |
| |
| # Set the benchmark's default arguments. |
| options = options_for_unittests.GetCopy() |
| options.output_format = 'none' |
| options.suppress_gtest_report = True |
| parser = options.CreateParser() |
| |
| benchmark.AddCommandLineArgs(parser) |
| benchmark_module.AddCommandLineArgs(parser) |
| benchmark.SetArgumentDefaults(parser) |
| options.MergeDefaultValues(parser.get_default_values()) |
| |
| benchmark.ProcessCommandLineArgs(None, options) |
| benchmark_module.ProcessCommandLineArgs(None, options) |
| |
| self.assertEqual(0, SinglePageBenchmark().Run(options), |
| msg='Failed: %s' % benchmark) |
| |
| return BenchmarkSmokeTest |
| |
| |
| def load_tests(_, _2, _3): |
| suite = progress_reporter.TestSuite() |
| |
| benchmarks_dir = os.path.dirname(__file__) |
| top_level_dir = os.path.dirname(benchmarks_dir) |
| measurements_dir = os.path.join(top_level_dir, 'measurements') |
| |
| all_measurements = discover.DiscoverClasses( |
| measurements_dir, top_level_dir, page_test.PageTest, |
| pattern='*.py').values() |
| all_benchmarks = discover.DiscoverClasses( |
| benchmarks_dir, top_level_dir, benchmark_module.Benchmark, |
| pattern='*.py').values() |
| for benchmark in all_benchmarks: |
| if benchmark.PageTestClass() not in all_measurements: |
| # If the benchmark is not in measurements, then it is not composable. |
| # Ideally we'd like to test these as well, but the non-composable |
| # benchmarks are usually long-running benchmarks. |
| continue |
| |
| # TODO(tonyg): Smoke doesn't work with session_restore yet. |
| if benchmark.Name().startswith('session_restore'): |
| continue |
| |
| if hasattr(benchmark, 'generated_profile_archive'): |
| # We'd like to test these, but don't know how yet. |
| continue |
| |
| class BenchmarkSmokeTest(unittest.TestCase): |
| pass |
| setattr(BenchmarkSmokeTest, benchmark.Name(), SmokeTestGenerator(benchmark)) |
| suite.addTest(BenchmarkSmokeTest(benchmark.Name())) |
| |
| return suite |