Index: telemetry/telemetry/testing/browser_test_runner_unittest.py |
diff --git a/telemetry/telemetry/testing/browser_test_runner_unittest.py b/telemetry/telemetry/testing/browser_test_runner_unittest.py |
index a9e96cc50b924d9c41df9fdf78ba19b626bdc477..cdfbdc300bf7f6367be54c28a9faf736b82659f4 100644 |
--- a/telemetry/telemetry/testing/browser_test_runner_unittest.py |
+++ b/telemetry/telemetry/testing/browser_test_runner_unittest.py |
@@ -77,3 +77,92 @@ class BrowserTestRunnerTest(unittest.TestCase): |
alphabetical_tests.sort() |
self.baseTest( |
mockInitDependencyManager, 'Alphabetical', [], alphabetical_tests) |
+ |
+ def shardingRangeTestHelper(self, total_shards, num_tests): |
+ shard_ranges = [] |
+ for shard_index in xrange(0, total_shards): |
+ shard_ranges.append(browser_test_runner.TestRangeForShard( |
+ total_shards, shard_index, num_tests)) |
+ # Make assertions about ranges |
+ num_tests_run = 0 |
+ for i in xrange(0, len(shard_ranges)): |
+ cur_range = shard_ranges[i] |
+ if i < num_tests: |
+ self.assertGreater(cur_range[1], cur_range[0]) |
+ num_tests_run += (cur_range[1] - cur_range[0]) |
+ else: |
+ # Not enough tests to go around all of the shards. |
+ self.assertEquals(cur_range[0], cur_range[1]) |
+ # Make assertions about non-overlapping ranges |
+ for i in xrange(1, len(shard_ranges)): |
+ prev_range = shard_ranges[i - 1] |
+ cur_range = shard_ranges[i] |
+ self.assertEquals(prev_range[1], cur_range[0]) |
+ # Assert that we run all of the tests (very important) |
+ self.assertEquals(num_tests_run, num_tests) |
+ |
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') |
+ def testShardsWithPrimeNumTests(self, _): |
+ for total_shards in xrange(1, 20): |
+ # Nice non-prime number |
+ self.shardingRangeTestHelper(total_shards, 101) |
+ |
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') |
+ def testShardsWithDivisibleNumTests(self, _): |
+ for total_shards in xrange(1, 6): |
+ self.shardingRangeTestHelper(total_shards, 8) |
+ |
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') |
+ def testShardBoundaryConditions(self, _): |
+ self.shardingRangeTestHelper(1, 0) |
+ self.shardingRangeTestHelper(1, 1) |
+ self.shardingRangeTestHelper(2, 1) |
+ |
+ def baseShardingTest(self, total_shards, shard_index, failures, successes): |
+ options = browser_test_runner.TestRunOptions() |
+ options.verbosity = 0 |
+ config = project_config.ProjectConfig( |
+ top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), |
+ client_configs=['a', 'b', 'c'], |
+ benchmark_dirs=[ |
+ os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] |
+ ) |
+ temp_file = tempfile.NamedTemporaryFile(delete=False) |
+ temp_file.close() |
+ temp_file_name = temp_file.name |
+ try: |
+ browser_test_runner.Run( |
+ config, options, |
+ ['SimpleShardingTest', |
+ '--write-abbreviated-json-results-to=%s' % temp_file_name, |
+ '--total-shards=%d' % total_shards, |
+ '--shard-index=%d' % shard_index]) |
+ with open(temp_file_name) as f: |
+ test_result = json.load(f) |
+ self.assertEquals(test_result['failures'], failures) |
+ self.assertEquals(test_result['successes'], successes) |
+ self.assertEquals(test_result['valid'], True) |
+ finally: |
+ os.remove(temp_file_name) |
+ |
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') |
+ def testShardedTestRun(self, _): |
+ self.baseShardingTest(3, 0, [], [ |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.Test1', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.Test2', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.Test3', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_0', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_1', |
+ ]) |
+ self.baseShardingTest(3, 1, [], [ |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_3', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_4', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_5', |
+ ]) |
+ self.baseShardingTest(3, 2, [], [ |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_7', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_8', |
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_9', |
+ ]) |