| Index: source/libvpx/third_party/googletest/src/test/gtest_shuffle_test.py
|
| ===================================================================
|
| --- source/libvpx/third_party/googletest/src/test/gtest_shuffle_test.py (revision 232233)
|
| +++ source/libvpx/third_party/googletest/src/test/gtest_shuffle_test.py (working copy)
|
| @@ -1,325 +0,0 @@
|
| -#!/usr/bin/env python
|
| -#
|
| -# Copyright 2009 Google Inc. All Rights Reserved.
|
| -#
|
| -# Redistribution and use in source and binary forms, with or without
|
| -# modification, are permitted provided that the following conditions are
|
| -# met:
|
| -#
|
| -# * Redistributions of source code must retain the above copyright
|
| -# notice, this list of conditions and the following disclaimer.
|
| -# * Redistributions in binary form must reproduce the above
|
| -# copyright notice, this list of conditions and the following disclaimer
|
| -# in the documentation and/or other materials provided with the
|
| -# distribution.
|
| -# * Neither the name of Google Inc. nor the names of its
|
| -# contributors may be used to endorse or promote products derived from
|
| -# this software without specific prior written permission.
|
| -#
|
| -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -"""Verifies that test shuffling works."""
|
| -
|
| -__author__ = 'wan@google.com (Zhanyong Wan)'
|
| -
|
| -import os
|
| -import gtest_test_utils
|
| -
|
| -# Command to run the gtest_shuffle_test_ program.
|
| -COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_shuffle_test_')
|
| -
|
| -# The environment variables for test sharding.
|
| -TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
|
| -SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
|
| -
|
| -TEST_FILTER = 'A*.A:A*.B:C*'
|
| -
|
| -ALL_TESTS = []
|
| -ACTIVE_TESTS = []
|
| -FILTERED_TESTS = []
|
| -SHARDED_TESTS = []
|
| -
|
| -SHUFFLED_ALL_TESTS = []
|
| -SHUFFLED_ACTIVE_TESTS = []
|
| -SHUFFLED_FILTERED_TESTS = []
|
| -SHUFFLED_SHARDED_TESTS = []
|
| -
|
| -
|
| -def AlsoRunDisabledTestsFlag():
|
| - return '--gtest_also_run_disabled_tests'
|
| -
|
| -
|
| -def FilterFlag(test_filter):
|
| - return '--gtest_filter=%s' % (test_filter,)
|
| -
|
| -
|
| -def RepeatFlag(n):
|
| - return '--gtest_repeat=%s' % (n,)
|
| -
|
| -
|
| -def ShuffleFlag():
|
| - return '--gtest_shuffle'
|
| -
|
| -
|
| -def RandomSeedFlag(n):
|
| - return '--gtest_random_seed=%s' % (n,)
|
| -
|
| -
|
| -def RunAndReturnOutput(extra_env, args):
|
| - """Runs the test program and returns its output."""
|
| -
|
| - environ_copy = os.environ.copy()
|
| - environ_copy.update(extra_env)
|
| -
|
| - return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output
|
| -
|
| -
|
| -def GetTestsForAllIterations(extra_env, args):
|
| - """Runs the test program and returns a list of test lists.
|
| -
|
| - Args:
|
| - extra_env: a map from environment variables to their values
|
| - args: command line flags to pass to gtest_shuffle_test_
|
| -
|
| - Returns:
|
| - A list where the i-th element is the list of tests run in the i-th
|
| - test iteration.
|
| - """
|
| -
|
| - test_iterations = []
|
| - for line in RunAndReturnOutput(extra_env, args).split('\n'):
|
| - if line.startswith('----'):
|
| - tests = []
|
| - test_iterations.append(tests)
|
| - elif line.strip():
|
| - tests.append(line.strip()) # 'TestCaseName.TestName'
|
| -
|
| - return test_iterations
|
| -
|
| -
|
| -def GetTestCases(tests):
|
| - """Returns a list of test cases in the given full test names.
|
| -
|
| - Args:
|
| - tests: a list of full test names
|
| -
|
| - Returns:
|
| - A list of test cases from 'tests', in their original order.
|
| - Consecutive duplicates are removed.
|
| - """
|
| -
|
| - test_cases = []
|
| - for test in tests:
|
| - test_case = test.split('.')[0]
|
| - if not test_case in test_cases:
|
| - test_cases.append(test_case)
|
| -
|
| - return test_cases
|
| -
|
| -
|
| -def CalculateTestLists():
|
| - """Calculates the list of tests run under different flags."""
|
| -
|
| - if not ALL_TESTS:
|
| - ALL_TESTS.extend(
|
| - GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0])
|
| -
|
| - if not ACTIVE_TESTS:
|
| - ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0])
|
| -
|
| - if not FILTERED_TESTS:
|
| - FILTERED_TESTS.extend(
|
| - GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0])
|
| -
|
| - if not SHARDED_TESTS:
|
| - SHARDED_TESTS.extend(
|
| - GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
|
| - SHARD_INDEX_ENV_VAR: '1'},
|
| - [])[0])
|
| -
|
| - if not SHUFFLED_ALL_TESTS:
|
| - SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations(
|
| - {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0])
|
| -
|
| - if not SHUFFLED_ACTIVE_TESTS:
|
| - SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(1)])[0])
|
| -
|
| - if not SHUFFLED_FILTERED_TESTS:
|
| - SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0])
|
| -
|
| - if not SHUFFLED_SHARDED_TESTS:
|
| - SHUFFLED_SHARDED_TESTS.extend(
|
| - GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
|
| - SHARD_INDEX_ENV_VAR: '1'},
|
| - [ShuffleFlag(), RandomSeedFlag(1)])[0])
|
| -
|
| -
|
| -class GTestShuffleUnitTest(gtest_test_utils.TestCase):
|
| - """Tests test shuffling."""
|
| -
|
| - def setUp(self):
|
| - CalculateTestLists()
|
| -
|
| - def testShufflePreservesNumberOfTests(self):
|
| - self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS))
|
| - self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS))
|
| - self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS))
|
| - self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS))
|
| -
|
| - def testShuffleChangesTestOrder(self):
|
| - self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS)
|
| - self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS)
|
| - self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS,
|
| - SHUFFLED_FILTERED_TESTS)
|
| - self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS,
|
| - SHUFFLED_SHARDED_TESTS)
|
| -
|
| - def testShuffleChangesTestCaseOrder(self):
|
| - self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS),
|
| - GetTestCases(SHUFFLED_ALL_TESTS))
|
| - self.assert_(
|
| - GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS),
|
| - GetTestCases(SHUFFLED_ACTIVE_TESTS))
|
| - self.assert_(
|
| - GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS),
|
| - GetTestCases(SHUFFLED_FILTERED_TESTS))
|
| - self.assert_(
|
| - GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS),
|
| - GetTestCases(SHUFFLED_SHARDED_TESTS))
|
| -
|
| - def testShuffleDoesNotRepeatTest(self):
|
| - for test in SHUFFLED_ALL_TESTS:
|
| - self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test),
|
| - '%s appears more than once' % (test,))
|
| - for test in SHUFFLED_ACTIVE_TESTS:
|
| - self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test),
|
| - '%s appears more than once' % (test,))
|
| - for test in SHUFFLED_FILTERED_TESTS:
|
| - self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test),
|
| - '%s appears more than once' % (test,))
|
| - for test in SHUFFLED_SHARDED_TESTS:
|
| - self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test),
|
| - '%s appears more than once' % (test,))
|
| -
|
| - def testShuffleDoesNotCreateNewTest(self):
|
| - for test in SHUFFLED_ALL_TESTS:
|
| - self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,))
|
| - for test in SHUFFLED_ACTIVE_TESTS:
|
| - self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,))
|
| - for test in SHUFFLED_FILTERED_TESTS:
|
| - self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,))
|
| - for test in SHUFFLED_SHARDED_TESTS:
|
| - self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,))
|
| -
|
| - def testShuffleIncludesAllTests(self):
|
| - for test in ALL_TESTS:
|
| - self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,))
|
| - for test in ACTIVE_TESTS:
|
| - self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,))
|
| - for test in FILTERED_TESTS:
|
| - self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,))
|
| - for test in SHARDED_TESTS:
|
| - self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,))
|
| -
|
| - def testShuffleLeavesDeathTestsAtFront(self):
|
| - non_death_test_found = False
|
| - for test in SHUFFLED_ACTIVE_TESTS:
|
| - if 'DeathTest.' in test:
|
| - self.assert_(not non_death_test_found,
|
| - '%s appears after a non-death test' % (test,))
|
| - else:
|
| - non_death_test_found = True
|
| -
|
| - def _VerifyTestCasesDoNotInterleave(self, tests):
|
| - test_cases = []
|
| - for test in tests:
|
| - [test_case, _] = test.split('.')
|
| - if test_cases and test_cases[-1] != test_case:
|
| - test_cases.append(test_case)
|
| - self.assertEqual(1, test_cases.count(test_case),
|
| - 'Test case %s is not grouped together in %s' %
|
| - (test_case, tests))
|
| -
|
| - def testShuffleDoesNotInterleaveTestCases(self):
|
| - self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS)
|
| - self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS)
|
| - self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS)
|
| - self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS)
|
| -
|
| - def testShuffleRestoresOrderAfterEachIteration(self):
|
| - # Get the test lists in all 3 iterations, using random seed 1, 2,
|
| - # and 3 respectively. Google Test picks a different seed in each
|
| - # iteration, and this test depends on the current implementation
|
| - # picking successive numbers. This dependency is not ideal, but
|
| - # makes the test much easier to write.
|
| - [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
|
| - GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
|
| -
|
| - # Make sure running the tests with random seed 1 gets the same
|
| - # order as in iteration 1 above.
|
| - [tests_with_seed1] = GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(1)])
|
| - self.assertEqual(tests_in_iteration1, tests_with_seed1)
|
| -
|
| - # Make sure running the tests with random seed 2 gets the same
|
| - # order as in iteration 2 above. Success means that Google Test
|
| - # correctly restores the test order before re-shuffling at the
|
| - # beginning of iteration 2.
|
| - [tests_with_seed2] = GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(2)])
|
| - self.assertEqual(tests_in_iteration2, tests_with_seed2)
|
| -
|
| - # Make sure running the tests with random seed 3 gets the same
|
| - # order as in iteration 3 above. Success means that Google Test
|
| - # correctly restores the test order before re-shuffling at the
|
| - # beginning of iteration 3.
|
| - [tests_with_seed3] = GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(3)])
|
| - self.assertEqual(tests_in_iteration3, tests_with_seed3)
|
| -
|
| - def testShuffleGeneratesNewOrderInEachIteration(self):
|
| - [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
|
| - GetTestsForAllIterations(
|
| - {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
|
| -
|
| - self.assert_(tests_in_iteration1 != tests_in_iteration2,
|
| - tests_in_iteration1)
|
| - self.assert_(tests_in_iteration1 != tests_in_iteration3,
|
| - tests_in_iteration1)
|
| - self.assert_(tests_in_iteration2 != tests_in_iteration3,
|
| - tests_in_iteration2)
|
| -
|
| - def testShuffleShardedTestsPreservesPartition(self):
|
| - # If we run M tests on N shards, the same M tests should be run in
|
| - # total, regardless of the random seeds used by the shards.
|
| - [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
|
| - SHARD_INDEX_ENV_VAR: '0'},
|
| - [ShuffleFlag(), RandomSeedFlag(1)])
|
| - [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
|
| - SHARD_INDEX_ENV_VAR: '1'},
|
| - [ShuffleFlag(), RandomSeedFlag(20)])
|
| - [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
|
| - SHARD_INDEX_ENV_VAR: '2'},
|
| - [ShuffleFlag(), RandomSeedFlag(25)])
|
| - sorted_sharded_tests = tests1 + tests2 + tests3
|
| - sorted_sharded_tests.sort()
|
| - sorted_active_tests = []
|
| - sorted_active_tests.extend(ACTIVE_TESTS)
|
| - sorted_active_tests.sort()
|
| - self.assertEqual(sorted_active_tests, sorted_sharded_tests)
|
| -
|
| -if __name__ == '__main__':
|
| - gtest_test_utils.Main()
|
|
|