mirror of
https://github.com/google/googletest.git
synced 2024-12-29 03:33:40 +08:00
Adds the command line flags needed for test shuffling. Most code by Josh Kelley.
This commit is contained in:
parent
89080477ae
commit
8bdb31e054
@ -119,6 +119,9 @@ GTEST_DECLARE_string_(output);
|
|||||||
// test.
|
// test.
|
||||||
GTEST_DECLARE_bool_(print_time);
|
GTEST_DECLARE_bool_(print_time);
|
||||||
|
|
||||||
|
// This flag specifies the random number seed.
|
||||||
|
GTEST_DECLARE_int32_(random_seed);
|
||||||
|
|
||||||
// This flag sets how many times the tests are repeated. The default value
|
// This flag sets how many times the tests are repeated. The default value
|
||||||
// is 1. If the value is -1 the tests are repeating forever.
|
// is 1. If the value is -1 the tests are repeating forever.
|
||||||
GTEST_DECLARE_int32_(repeat);
|
GTEST_DECLARE_int32_(repeat);
|
||||||
@ -127,6 +130,9 @@ GTEST_DECLARE_int32_(repeat);
|
|||||||
// stack frames in failure stack traces.
|
// stack frames in failure stack traces.
|
||||||
GTEST_DECLARE_bool_(show_internal_stack_frames);
|
GTEST_DECLARE_bool_(show_internal_stack_frames);
|
||||||
|
|
||||||
|
// When this flag is specified, tests' order is randomized on every run.
|
||||||
|
GTEST_DECLARE_bool_(shuffle);
|
||||||
|
|
||||||
// This flag specifies the maximum number of stack frames to be
|
// This flag specifies the maximum number of stack frames to be
|
||||||
// printed in a failure message.
|
// printed in a failure message.
|
||||||
GTEST_DECLARE_int32_(stack_trace_depth);
|
GTEST_DECLARE_int32_(stack_trace_depth);
|
||||||
@ -798,6 +804,9 @@ class UnitTest {
|
|||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
const TestInfo* current_test_info() const;
|
const TestInfo* current_test_info() const;
|
||||||
|
|
||||||
|
// Returns the random seed used at the start of the current test run.
|
||||||
|
int random_seed() const;
|
||||||
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
#if GTEST_HAS_PARAM_TEST
|
||||||
// Returns the ParameterizedTestCaseRegistry object used to keep track of
|
// Returns the ParameterizedTestCaseRegistry object used to keep track of
|
||||||
// value-parameterized tests and instantiate and register them.
|
// value-parameterized tests and instantiate and register them.
|
||||||
|
@ -332,7 +332,7 @@ GtestBinary(env_without_rtti, 'gtest_no_rtti_test', None,
|
|||||||
# Use the GTEST_BUILD_SAMPLES build variable to control building of samples.
|
# Use the GTEST_BUILD_SAMPLES build variable to control building of samples.
|
||||||
# In your SConstruct file, add
|
# In your SConstruct file, add
|
||||||
# vars = Variables()
|
# vars = Variables()
|
||||||
# vars.Add(BoolVariable('GTEST_BUILD_SAMPLES', 'Build samples', True))
|
# vars.Add(BoolVariable('GTEST_BUILD_SAMPLES', 'Build samples', False))
|
||||||
# my_environment = Environment(variables = vars, ...)
|
# my_environment = Environment(variables = vars, ...)
|
||||||
# Then, in the command line use GTEST_BUILD_SAMPLES=true to enable them.
|
# Then, in the command line use GTEST_BUILD_SAMPLES=true to enable them.
|
||||||
if env.get('GTEST_BUILD_SAMPLES', False):
|
if env.get('GTEST_BUILD_SAMPLES', False):
|
||||||
|
@ -87,9 +87,42 @@ const char kFilterFlag[] = "filter";
|
|||||||
const char kListTestsFlag[] = "list_tests";
|
const char kListTestsFlag[] = "list_tests";
|
||||||
const char kOutputFlag[] = "output";
|
const char kOutputFlag[] = "output";
|
||||||
const char kPrintTimeFlag[] = "print_time";
|
const char kPrintTimeFlag[] = "print_time";
|
||||||
|
const char kRandomSeedFlag[] = "random_seed";
|
||||||
const char kRepeatFlag[] = "repeat";
|
const char kRepeatFlag[] = "repeat";
|
||||||
|
const char kShuffleFlag[] = "shuffle";
|
||||||
const char kThrowOnFailureFlag[] = "throw_on_failure";
|
const char kThrowOnFailureFlag[] = "throw_on_failure";
|
||||||
|
|
||||||
|
// A valid random seed must be in [1, kMaxRandomSeed].
|
||||||
|
const unsigned int kMaxRandomSeed = 99999;
|
||||||
|
|
||||||
|
// Returns the current time in milliseconds.
|
||||||
|
TimeInMillis GetTimeInMillis();
|
||||||
|
|
||||||
|
// Returns a random seed in range [1, kMaxRandomSeed] based on the
|
||||||
|
// given --gtest_random_seed flag value.
|
||||||
|
inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
|
||||||
|
const unsigned int raw_seed = (random_seed_flag == 0) ?
|
||||||
|
static_cast<unsigned int>(GetTimeInMillis()) :
|
||||||
|
static_cast<unsigned int>(random_seed_flag);
|
||||||
|
|
||||||
|
// Normalizes the actual seed to range [1, kMaxRandomSeed] such that
|
||||||
|
// it's easy to type.
|
||||||
|
const int normalized_seed =
|
||||||
|
static_cast<int>((raw_seed - 1U) % kMaxRandomSeed) + 1;
|
||||||
|
return normalized_seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the first valid random seed after 'seed'. The behavior is
|
||||||
|
// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is
|
||||||
|
// considered to be 1.
|
||||||
|
inline int GetNextRandomSeed(int seed) {
|
||||||
|
GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
|
||||||
|
<< "Invalid random seed " << seed << " - must be in [1, "
|
||||||
|
<< kMaxRandomSeed << "].";
|
||||||
|
const int next_seed = seed + 1;
|
||||||
|
return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
|
||||||
|
}
|
||||||
|
|
||||||
// This class saves the values of all Google Test flags in its c'tor, and
|
// This class saves the values of all Google Test flags in its c'tor, and
|
||||||
// restores them in its d'tor.
|
// restores them in its d'tor.
|
||||||
class GTestFlagSaver {
|
class GTestFlagSaver {
|
||||||
@ -107,7 +140,9 @@ class GTestFlagSaver {
|
|||||||
list_tests_ = GTEST_FLAG(list_tests);
|
list_tests_ = GTEST_FLAG(list_tests);
|
||||||
output_ = GTEST_FLAG(output);
|
output_ = GTEST_FLAG(output);
|
||||||
print_time_ = GTEST_FLAG(print_time);
|
print_time_ = GTEST_FLAG(print_time);
|
||||||
|
random_seed_ = GTEST_FLAG(random_seed);
|
||||||
repeat_ = GTEST_FLAG(repeat);
|
repeat_ = GTEST_FLAG(repeat);
|
||||||
|
shuffle_ = GTEST_FLAG(shuffle);
|
||||||
throw_on_failure_ = GTEST_FLAG(throw_on_failure);
|
throw_on_failure_ = GTEST_FLAG(throw_on_failure);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +159,9 @@ class GTestFlagSaver {
|
|||||||
GTEST_FLAG(list_tests) = list_tests_;
|
GTEST_FLAG(list_tests) = list_tests_;
|
||||||
GTEST_FLAG(output) = output_;
|
GTEST_FLAG(output) = output_;
|
||||||
GTEST_FLAG(print_time) = print_time_;
|
GTEST_FLAG(print_time) = print_time_;
|
||||||
|
GTEST_FLAG(random_seed) = random_seed_;
|
||||||
GTEST_FLAG(repeat) = repeat_;
|
GTEST_FLAG(repeat) = repeat_;
|
||||||
|
GTEST_FLAG(shuffle) = shuffle_;
|
||||||
GTEST_FLAG(throw_on_failure) = throw_on_failure_;
|
GTEST_FLAG(throw_on_failure) = throw_on_failure_;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
@ -141,7 +178,9 @@ class GTestFlagSaver {
|
|||||||
String output_;
|
String output_;
|
||||||
bool print_time_;
|
bool print_time_;
|
||||||
bool pretty_;
|
bool pretty_;
|
||||||
|
internal::Int32 random_seed_;
|
||||||
internal::Int32 repeat_;
|
internal::Int32 repeat_;
|
||||||
|
bool shuffle_;
|
||||||
bool throw_on_failure_;
|
bool throw_on_failure_;
|
||||||
} GTEST_ATTRIBUTE_UNUSED_;
|
} GTEST_ATTRIBUTE_UNUSED_;
|
||||||
|
|
||||||
@ -884,6 +923,9 @@ class UnitTestImpl {
|
|||||||
friend class ReplaceDeathTestFactory;
|
friend class ReplaceDeathTestFactory;
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
|
// Gets the random seed used at the start of the current test run.
|
||||||
|
int random_seed() const { return random_seed_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class ::testing::UnitTest;
|
friend class ::testing::UnitTest;
|
||||||
|
|
||||||
@ -932,7 +974,7 @@ class UnitTestImpl {
|
|||||||
// This points to the TestCase for the currently running test. It
|
// This points to the TestCase for the currently running test. It
|
||||||
// changes as Google Test goes through one test case after another.
|
// changes as Google Test goes through one test case after another.
|
||||||
// When no test is running, this is set to NULL and Google Test
|
// When no test is running, this is set to NULL and Google Test
|
||||||
// stores assertion results in ad_hoc_test_result_. Initally NULL.
|
// stores assertion results in ad_hoc_test_result_. Initially NULL.
|
||||||
TestCase* current_test_case_;
|
TestCase* current_test_case_;
|
||||||
|
|
||||||
// This points to the TestInfo for the currently running test. It
|
// This points to the TestInfo for the currently running test. It
|
||||||
@ -963,6 +1005,9 @@ class UnitTestImpl {
|
|||||||
// desired.
|
// desired.
|
||||||
OsStackTraceGetterInterface* os_stack_trace_getter_;
|
OsStackTraceGetterInterface* os_stack_trace_getter_;
|
||||||
|
|
||||||
|
// The random number seed used at the beginning of the test run.
|
||||||
|
int random_seed_;
|
||||||
|
|
||||||
// How long the test took to run, in milliseconds.
|
// How long the test took to run, in milliseconds.
|
||||||
TimeInMillis elapsed_time_;
|
TimeInMillis elapsed_time_;
|
||||||
|
|
||||||
|
57
src/gtest.cc
57
src/gtest.cc
@ -217,23 +217,35 @@ GTEST_DEFINE_bool_(
|
|||||||
"True iff " GTEST_NAME_
|
"True iff " GTEST_NAME_
|
||||||
" should display elapsed time in text output.");
|
" should display elapsed time in text output.");
|
||||||
|
|
||||||
|
GTEST_DEFINE_int32_(
|
||||||
|
random_seed,
|
||||||
|
internal::Int32FromGTestEnv("random_seed", 0),
|
||||||
|
"Random number seed to use when shuffling test orders. Must be in range "
|
||||||
|
"[1, 99999], or 0 to use a seed based on the current time.");
|
||||||
|
|
||||||
GTEST_DEFINE_int32_(
|
GTEST_DEFINE_int32_(
|
||||||
repeat,
|
repeat,
|
||||||
internal::Int32FromGTestEnv("repeat", 1),
|
internal::Int32FromGTestEnv("repeat", 1),
|
||||||
"How many times to repeat each test. Specify a negative number "
|
"How many times to repeat each test. Specify a negative number "
|
||||||
"for repeating forever. Useful for shaking out flaky tests.");
|
"for repeating forever. Useful for shaking out flaky tests.");
|
||||||
|
|
||||||
|
GTEST_DEFINE_bool_(
|
||||||
|
show_internal_stack_frames, false,
|
||||||
|
"True iff " GTEST_NAME_ " should include internal stack frames when "
|
||||||
|
"printing test failure stack traces.");
|
||||||
|
|
||||||
|
GTEST_DEFINE_bool_(
|
||||||
|
shuffle,
|
||||||
|
internal::BoolFromGTestEnv("shuffle", false),
|
||||||
|
"True iff " GTEST_NAME_
|
||||||
|
" should randomize tests' order on every run.");
|
||||||
|
|
||||||
GTEST_DEFINE_int32_(
|
GTEST_DEFINE_int32_(
|
||||||
stack_trace_depth,
|
stack_trace_depth,
|
||||||
internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
|
internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
|
||||||
"The maximum number of stack frames to print when an "
|
"The maximum number of stack frames to print when an "
|
||||||
"assertion fails. The valid range is 0 through 100, inclusive.");
|
"assertion fails. The valid range is 0 through 100, inclusive.");
|
||||||
|
|
||||||
GTEST_DEFINE_bool_(
|
|
||||||
show_internal_stack_frames, false,
|
|
||||||
"True iff " GTEST_NAME_ " should include internal stack frames when "
|
|
||||||
"printing test failure stack traces.");
|
|
||||||
|
|
||||||
GTEST_DEFINE_bool_(
|
GTEST_DEFINE_bool_(
|
||||||
throw_on_failure,
|
throw_on_failure,
|
||||||
internal::BoolFromGTestEnv("throw_on_failure", false),
|
internal::BoolFromGTestEnv("throw_on_failure", false),
|
||||||
@ -774,9 +786,10 @@ String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
|
|||||||
return String("");
|
return String("");
|
||||||
}
|
}
|
||||||
|
|
||||||
static TimeInMillis GetTimeInMillis() {
|
// Returns the current time in milliseconds.
|
||||||
|
TimeInMillis GetTimeInMillis() {
|
||||||
#if defined(_WIN32_WCE) || defined(__BORLANDC__)
|
#if defined(_WIN32_WCE) || defined(__BORLANDC__)
|
||||||
// Difference between 1970-01-01 and 1601-01-01 in miliseconds.
|
// Difference between 1970-01-01 and 1601-01-01 in milliseconds.
|
||||||
// http://analogous.blogspot.com/2005/04/epoch.html
|
// http://analogous.blogspot.com/2005/04/epoch.html
|
||||||
const TimeInMillis kJavaEpochToWinFileTimeDelta =
|
const TimeInMillis kJavaEpochToWinFileTimeDelta =
|
||||||
static_cast<TimeInMillis>(116444736UL) * 100000UL;
|
static_cast<TimeInMillis>(116444736UL) * 100000UL;
|
||||||
@ -2719,6 +2732,12 @@ void PrettyUnitTestResultPrinter::OnUnitTestStart(const UnitTest& unit_test) {
|
|||||||
internal::posix::GetEnv(kTestTotalShards));
|
internal::posix::GetEnv(kTestTotalShards));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GTEST_FLAG(shuffle)) {
|
||||||
|
ColoredPrintf(COLOR_YELLOW,
|
||||||
|
"Note: Randomizing tests' orders with a seed of %d .\n",
|
||||||
|
unit_test.random_seed());
|
||||||
|
}
|
||||||
|
|
||||||
ColoredPrintf(COLOR_GREEN, "[==========] ");
|
ColoredPrintf(COLOR_GREEN, "[==========] ");
|
||||||
printf("Running %s from %s.\n",
|
printf("Running %s from %s.\n",
|
||||||
FormatTestCount(unit_test.test_to_run_count()).c_str(),
|
FormatTestCount(unit_test.test_to_run_count()).c_str(),
|
||||||
@ -3193,6 +3212,9 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
|
|||||||
unit_test.failed_test_count(),
|
unit_test.failed_test_count(),
|
||||||
unit_test.disabled_test_count(),
|
unit_test.disabled_test_count(),
|
||||||
internal::FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
|
internal::FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
|
||||||
|
if (GTEST_FLAG(shuffle)) {
|
||||||
|
fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
|
||||||
|
}
|
||||||
fprintf(out, "name=\"AllTests\">\n");
|
fprintf(out, "name=\"AllTests\">\n");
|
||||||
for (int i = 0; i < unit_test.total_test_case_count(); ++i)
|
for (int i = 0; i < unit_test.total_test_case_count(); ++i)
|
||||||
PrintXmlTestCase(out, *unit_test.GetTestCase(i));
|
PrintXmlTestCase(out, *unit_test.GetTestCase(i));
|
||||||
@ -3539,6 +3561,9 @@ const TestInfo* UnitTest::current_test_info() const {
|
|||||||
return impl_->current_test_info();
|
return impl_->current_test_info();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the random seed used at the start of the current test run.
|
||||||
|
int UnitTest::random_seed() const { return impl_->random_seed(); }
|
||||||
|
|
||||||
#if GTEST_HAS_PARAM_TEST
|
#if GTEST_HAS_PARAM_TEST
|
||||||
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
||||||
// value-parameterized tests and instantiate and register them.
|
// value-parameterized tests and instantiate and register them.
|
||||||
@ -3604,6 +3629,7 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
|
|||||||
ad_hoc_test_result_(),
|
ad_hoc_test_result_(),
|
||||||
result_printer_(NULL),
|
result_printer_(NULL),
|
||||||
os_stack_trace_getter_(NULL),
|
os_stack_trace_getter_(NULL),
|
||||||
|
random_seed_(0),
|
||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
elapsed_time_(0),
|
elapsed_time_(0),
|
||||||
internal_run_death_test_flag_(NULL),
|
internal_run_death_test_flag_(NULL),
|
||||||
@ -3747,6 +3773,9 @@ int UnitTestImpl::RunAllTests() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
random_seed_ = GTEST_FLAG(shuffle) ?
|
||||||
|
GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
|
||||||
|
|
||||||
// True iff at least one test has failed.
|
// True iff at least one test has failed.
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
|
|
||||||
@ -3796,6 +3825,11 @@ int UnitTestImpl::RunAllTests() {
|
|||||||
failed = true;
|
failed = true;
|
||||||
}
|
}
|
||||||
ClearResult();
|
ClearResult();
|
||||||
|
|
||||||
|
if (GTEST_FLAG(shuffle)) {
|
||||||
|
// Picks a new random seed for each run.
|
||||||
|
random_seed_ = GetNextRandomSeed(random_seed_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns 0 if all tests passed, or 1 other wise.
|
// Returns 0 if all tests passed, or 1 other wise.
|
||||||
@ -4262,8 +4296,15 @@ static const char kColorEncodedHelpMessage[] =
|
|||||||
" matches any substring; ':' separates two patterns.\n"
|
" matches any substring; ':' separates two patterns.\n"
|
||||||
" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n"
|
" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n"
|
||||||
" Run all disabled tests too.\n"
|
" Run all disabled tests too.\n"
|
||||||
|
"\n"
|
||||||
|
"Test Execution:\n"
|
||||||
" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
|
" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
|
||||||
" Run the tests repeatedly; use a negative count to repeat forever.\n"
|
" Run the tests repeatedly; use a negative count to repeat forever.\n"
|
||||||
|
" @G--" GTEST_FLAG_PREFIX_ "shuffle\n"
|
||||||
|
" Randomize tests' orders on every run. To be implemented.\n"
|
||||||
|
" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
|
||||||
|
" Random number seed to use for shuffling test orders (between 1 and\n"
|
||||||
|
" 99999, or 0 to use a seed based on the current time).\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Test Output:\n"
|
"Test Output:\n"
|
||||||
" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
|
" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
|
||||||
@ -4332,7 +4373,9 @@ void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
|
|||||||
ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) ||
|
ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) ||
|
||||||
ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) ||
|
ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) ||
|
||||||
ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) ||
|
ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) ||
|
||||||
|
ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) ||
|
||||||
ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) ||
|
ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) ||
|
||||||
|
ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) ||
|
||||||
ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure))
|
ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure))
|
||||||
) {
|
) {
|
||||||
// Yes. Shift the remainder of the argv list left by one. Note
|
// Yes. Shift the remainder of the argv list left by one. Note
|
||||||
|
@ -57,6 +57,8 @@ HELP_REGEX = re.compile(
|
|||||||
FLAG_PREFIX + r'filter=.*' +
|
FLAG_PREFIX + r'filter=.*' +
|
||||||
FLAG_PREFIX + r'also_run_disabled_tests.*' +
|
FLAG_PREFIX + r'also_run_disabled_tests.*' +
|
||||||
FLAG_PREFIX + r'repeat=.*' +
|
FLAG_PREFIX + r'repeat=.*' +
|
||||||
|
FLAG_PREFIX + r'shuffle.*' +
|
||||||
|
FLAG_PREFIX + r'random_seed=.*' +
|
||||||
FLAG_PREFIX + r'color=.*' +
|
FLAG_PREFIX + r'color=.*' +
|
||||||
FLAG_PREFIX + r'print_time.*' +
|
FLAG_PREFIX + r'print_time.*' +
|
||||||
FLAG_PREFIX + r'output=.*' +
|
FLAG_PREFIX + r'output=.*' +
|
||||||
|
@ -46,8 +46,10 @@ TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
|
|||||||
|| testing::GTEST_FLAG(list_tests)
|
|| testing::GTEST_FLAG(list_tests)
|
||||||
|| testing::GTEST_FLAG(output) != "unknown"
|
|| testing::GTEST_FLAG(output) != "unknown"
|
||||||
|| testing::GTEST_FLAG(print_time)
|
|| testing::GTEST_FLAG(print_time)
|
||||||
|
|| testing::GTEST_FLAG(random_seed)
|
||||||
|| testing::GTEST_FLAG(repeat) > 0
|
|| testing::GTEST_FLAG(repeat) > 0
|
||||||
|| testing::GTEST_FLAG(show_internal_stack_frames)
|
|| testing::GTEST_FLAG(show_internal_stack_frames)
|
||||||
|
|| testing::GTEST_FLAG(shuffle)
|
||||||
|| testing::GTEST_FLAG(stack_trace_depth) > 0
|
|| testing::GTEST_FLAG(stack_trace_depth) > 0
|
||||||
|| testing::GTEST_FLAG(throw_on_failure);
|
|| testing::GTEST_FLAG(throw_on_failure);
|
||||||
EXPECT_TRUE(dummy || !dummy); // Suppresses warning that dummy is unused.
|
EXPECT_TRUE(dummy || !dummy); // Suppresses warning that dummy is unused.
|
||||||
@ -142,8 +144,10 @@ using testing::GTEST_FLAG(filter);
|
|||||||
using testing::GTEST_FLAG(list_tests);
|
using testing::GTEST_FLAG(list_tests);
|
||||||
using testing::GTEST_FLAG(output);
|
using testing::GTEST_FLAG(output);
|
||||||
using testing::GTEST_FLAG(print_time);
|
using testing::GTEST_FLAG(print_time);
|
||||||
|
using testing::GTEST_FLAG(random_seed);
|
||||||
using testing::GTEST_FLAG(repeat);
|
using testing::GTEST_FLAG(repeat);
|
||||||
using testing::GTEST_FLAG(show_internal_stack_frames);
|
using testing::GTEST_FLAG(show_internal_stack_frames);
|
||||||
|
using testing::GTEST_FLAG(shuffle);
|
||||||
using testing::GTEST_FLAG(stack_trace_depth);
|
using testing::GTEST_FLAG(stack_trace_depth);
|
||||||
using testing::GTEST_FLAG(throw_on_failure);
|
using testing::GTEST_FLAG(throw_on_failure);
|
||||||
using testing::IsNotSubstring;
|
using testing::IsNotSubstring;
|
||||||
@ -158,6 +162,7 @@ using testing::TPRT_FATAL_FAILURE;
|
|||||||
using testing::TPRT_NONFATAL_FAILURE;
|
using testing::TPRT_NONFATAL_FAILURE;
|
||||||
using testing::TPRT_SUCCESS;
|
using testing::TPRT_SUCCESS;
|
||||||
using testing::UnitTest;
|
using testing::UnitTest;
|
||||||
|
using testing::internal::kMaxRandomSeed;
|
||||||
using testing::internal::kTestTypeIdInGoogleTest;
|
using testing::internal::kTestTypeIdInGoogleTest;
|
||||||
using testing::internal::AppendUserMessage;
|
using testing::internal::AppendUserMessage;
|
||||||
using testing::internal::CodePointToUtf8;
|
using testing::internal::CodePointToUtf8;
|
||||||
@ -165,6 +170,8 @@ using testing::internal::EqFailure;
|
|||||||
using testing::internal::FloatingPoint;
|
using testing::internal::FloatingPoint;
|
||||||
using testing::internal::GetCurrentOsStackTraceExceptTop;
|
using testing::internal::GetCurrentOsStackTraceExceptTop;
|
||||||
using testing::internal::GetFailedPartCount;
|
using testing::internal::GetFailedPartCount;
|
||||||
|
using testing::internal::GetNextRandomSeed;
|
||||||
|
using testing::internal::GetRandomSeedFromFlag;
|
||||||
using testing::internal::GetTestTypeId;
|
using testing::internal::GetTestTypeId;
|
||||||
using testing::internal::GetTypeId;
|
using testing::internal::GetTypeId;
|
||||||
using testing::internal::GetUnitTestImpl;
|
using testing::internal::GetUnitTestImpl;
|
||||||
@ -187,6 +194,43 @@ using testing::internal::WideStringToUtf8;
|
|||||||
// This line tests that we can define tests in an unnamed namespace.
|
// This line tests that we can define tests in an unnamed namespace.
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
TEST(GetRandomSeedFromFlagTest, HandlesZero) {
|
||||||
|
const int seed = GetRandomSeedFromFlag(0);
|
||||||
|
EXPECT_LE(1, seed);
|
||||||
|
EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {
|
||||||
|
EXPECT_EQ(1, GetRandomSeedFromFlag(1));
|
||||||
|
EXPECT_EQ(2, GetRandomSeedFromFlag(2));
|
||||||
|
EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));
|
||||||
|
EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
|
||||||
|
GetRandomSeedFromFlag(kMaxRandomSeed));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {
|
||||||
|
const int seed1 = GetRandomSeedFromFlag(-1);
|
||||||
|
EXPECT_LE(1, seed1);
|
||||||
|
EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));
|
||||||
|
|
||||||
|
const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);
|
||||||
|
EXPECT_LE(1, seed2);
|
||||||
|
EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(GetNextRandomSeedTest, WorksForValidInput) {
|
||||||
|
EXPECT_EQ(2, GetNextRandomSeed(1));
|
||||||
|
EXPECT_EQ(3, GetNextRandomSeed(2));
|
||||||
|
EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
|
||||||
|
GetNextRandomSeed(kMaxRandomSeed - 1));
|
||||||
|
EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));
|
||||||
|
|
||||||
|
// We deliberately don't test GetNextRandomSeed() with invalid
|
||||||
|
// inputs, as that requires death tests, which are expensive. This
|
||||||
|
// is fine as GetNextRandomSeed() is internal and has a
|
||||||
|
// straightforward definition.
|
||||||
|
}
|
||||||
|
|
||||||
static void ClearCurrentTestPartResults() {
|
static void ClearCurrentTestPartResults() {
|
||||||
TestResultAccessor::ClearTestPartResults(
|
TestResultAccessor::ClearTestPartResults(
|
||||||
GetUnitTestImpl()->current_test_result());
|
GetUnitTestImpl()->current_test_result());
|
||||||
@ -1460,7 +1504,9 @@ class GTestFlagSaverTest : public Test {
|
|||||||
GTEST_FLAG(list_tests) = false;
|
GTEST_FLAG(list_tests) = false;
|
||||||
GTEST_FLAG(output) = "";
|
GTEST_FLAG(output) = "";
|
||||||
GTEST_FLAG(print_time) = true;
|
GTEST_FLAG(print_time) = true;
|
||||||
|
GTEST_FLAG(random_seed) = 0;
|
||||||
GTEST_FLAG(repeat) = 1;
|
GTEST_FLAG(repeat) = 1;
|
||||||
|
GTEST_FLAG(shuffle) = false;
|
||||||
GTEST_FLAG(throw_on_failure) = false;
|
GTEST_FLAG(throw_on_failure) = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1483,7 +1529,9 @@ class GTestFlagSaverTest : public Test {
|
|||||||
EXPECT_FALSE(GTEST_FLAG(list_tests));
|
EXPECT_FALSE(GTEST_FLAG(list_tests));
|
||||||
EXPECT_STREQ("", GTEST_FLAG(output).c_str());
|
EXPECT_STREQ("", GTEST_FLAG(output).c_str());
|
||||||
EXPECT_TRUE(GTEST_FLAG(print_time));
|
EXPECT_TRUE(GTEST_FLAG(print_time));
|
||||||
|
EXPECT_EQ(0, GTEST_FLAG(random_seed));
|
||||||
EXPECT_EQ(1, GTEST_FLAG(repeat));
|
EXPECT_EQ(1, GTEST_FLAG(repeat));
|
||||||
|
EXPECT_FALSE(GTEST_FLAG(shuffle));
|
||||||
EXPECT_FALSE(GTEST_FLAG(throw_on_failure));
|
EXPECT_FALSE(GTEST_FLAG(throw_on_failure));
|
||||||
|
|
||||||
GTEST_FLAG(also_run_disabled_tests) = true;
|
GTEST_FLAG(also_run_disabled_tests) = true;
|
||||||
@ -1495,7 +1543,9 @@ class GTestFlagSaverTest : public Test {
|
|||||||
GTEST_FLAG(list_tests) = true;
|
GTEST_FLAG(list_tests) = true;
|
||||||
GTEST_FLAG(output) = "xml:foo.xml";
|
GTEST_FLAG(output) = "xml:foo.xml";
|
||||||
GTEST_FLAG(print_time) = false;
|
GTEST_FLAG(print_time) = false;
|
||||||
|
GTEST_FLAG(random_seed) = 1;
|
||||||
GTEST_FLAG(repeat) = 100;
|
GTEST_FLAG(repeat) = 100;
|
||||||
|
GTEST_FLAG(shuffle) = true;
|
||||||
GTEST_FLAG(throw_on_failure) = true;
|
GTEST_FLAG(throw_on_failure) = true;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
@ -4657,7 +4707,9 @@ struct Flags {
|
|||||||
list_tests(false),
|
list_tests(false),
|
||||||
output(""),
|
output(""),
|
||||||
print_time(true),
|
print_time(true),
|
||||||
|
random_seed(0),
|
||||||
repeat(1),
|
repeat(1),
|
||||||
|
shuffle(false),
|
||||||
throw_on_failure(false) {}
|
throw_on_failure(false) {}
|
||||||
|
|
||||||
// Factory methods.
|
// Factory methods.
|
||||||
@ -4726,6 +4778,14 @@ struct Flags {
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Creates a Flags struct where the gtest_random_seed flag has
|
||||||
|
// the given value.
|
||||||
|
static Flags RandomSeed(Int32 random_seed) {
|
||||||
|
Flags flags;
|
||||||
|
flags.random_seed = random_seed;
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
// Creates a Flags struct where the gtest_repeat flag has the given
|
// Creates a Flags struct where the gtest_repeat flag has the given
|
||||||
// value.
|
// value.
|
||||||
static Flags Repeat(Int32 repeat) {
|
static Flags Repeat(Int32 repeat) {
|
||||||
@ -4734,6 +4794,14 @@ struct Flags {
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Creates a Flags struct where the gtest_shuffle flag has
|
||||||
|
// the given value.
|
||||||
|
static Flags Shuffle(bool shuffle) {
|
||||||
|
Flags flags;
|
||||||
|
flags.shuffle = shuffle;
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
// Creates a Flags struct where the gtest_throw_on_failure flag has
|
// Creates a Flags struct where the gtest_throw_on_failure flag has
|
||||||
// the given value.
|
// the given value.
|
||||||
static Flags ThrowOnFailure(bool throw_on_failure) {
|
static Flags ThrowOnFailure(bool throw_on_failure) {
|
||||||
@ -4751,7 +4819,9 @@ struct Flags {
|
|||||||
bool list_tests;
|
bool list_tests;
|
||||||
const char* output;
|
const char* output;
|
||||||
bool print_time;
|
bool print_time;
|
||||||
|
Int32 random_seed;
|
||||||
Int32 repeat;
|
Int32 repeat;
|
||||||
|
bool shuffle;
|
||||||
bool throw_on_failure;
|
bool throw_on_failure;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -4768,7 +4838,9 @@ class InitGoogleTestTest : public Test {
|
|||||||
GTEST_FLAG(list_tests) = false;
|
GTEST_FLAG(list_tests) = false;
|
||||||
GTEST_FLAG(output) = "";
|
GTEST_FLAG(output) = "";
|
||||||
GTEST_FLAG(print_time) = true;
|
GTEST_FLAG(print_time) = true;
|
||||||
|
GTEST_FLAG(random_seed) = 0;
|
||||||
GTEST_FLAG(repeat) = 1;
|
GTEST_FLAG(repeat) = 1;
|
||||||
|
GTEST_FLAG(shuffle) = false;
|
||||||
GTEST_FLAG(throw_on_failure) = false;
|
GTEST_FLAG(throw_on_failure) = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4794,7 +4866,9 @@ class InitGoogleTestTest : public Test {
|
|||||||
EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
|
EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
|
||||||
EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
|
EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
|
||||||
EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));
|
EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));
|
||||||
|
EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));
|
||||||
EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
|
EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
|
||||||
|
EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));
|
||||||
EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));
|
EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4901,7 +4975,7 @@ TEST_F(InitGoogleTestTest, FilterNonEmpty) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tests parsing --gtest_break_on_failure.
|
// Tests parsing --gtest_break_on_failure.
|
||||||
TEST_F(InitGoogleTestTest, BreakOnFailureNoDef) {
|
TEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) {
|
||||||
const char* argv[] = {
|
const char* argv[] = {
|
||||||
"foo.exe",
|
"foo.exe",
|
||||||
"--gtest_break_on_failure",
|
"--gtest_break_on_failure",
|
||||||
@ -5117,7 +5191,7 @@ TEST_F(InitGoogleTestTest, ListTestsFalse_f) {
|
|||||||
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false));
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests parsing --gtest_break_on_failure=F.
|
// Tests parsing --gtest_list_tests=F.
|
||||||
TEST_F(InitGoogleTestTest, ListTestsFalse_F) {
|
TEST_F(InitGoogleTestTest, ListTestsFalse_F) {
|
||||||
const char* argv[] = {
|
const char* argv[] = {
|
||||||
"foo.exe",
|
"foo.exe",
|
||||||
@ -5278,6 +5352,22 @@ TEST_F(InitGoogleTestTest, PrintTimeFalse_F) {
|
|||||||
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false));
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests parsing --gtest_random_seed=number
|
||||||
|
TEST_F(InitGoogleTestTest, RandomSeed) {
|
||||||
|
const char* argv[] = {
|
||||||
|
"foo.exe",
|
||||||
|
"--gtest_random_seed=1000",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* argv2[] = {
|
||||||
|
"foo.exe",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests parsing --gtest_repeat=number
|
// Tests parsing --gtest_repeat=number
|
||||||
TEST_F(InitGoogleTestTest, Repeat) {
|
TEST_F(InitGoogleTestTest, Repeat) {
|
||||||
const char* argv[] = {
|
const char* argv[] = {
|
||||||
@ -5342,9 +5432,57 @@ TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) {
|
|||||||
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::AlsoRunDisabledTests(false));
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::AlsoRunDisabledTests(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests parsing --gtest_shuffle.
|
||||||
|
TEST_F(InitGoogleTestTest, ShuffleWithoutValue) {
|
||||||
|
const char* argv[] = {
|
||||||
|
"foo.exe",
|
||||||
|
"--gtest_shuffle",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* argv2[] = {
|
||||||
|
"foo.exe",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests parsing --gtest_shuffle=0.
|
||||||
|
TEST_F(InitGoogleTestTest, ShuffleFalse_0) {
|
||||||
|
const char* argv[] = {
|
||||||
|
"foo.exe",
|
||||||
|
"--gtest_shuffle=0",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* argv2[] = {
|
||||||
|
"foo.exe",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests parsing a --gtest_shuffle flag that has a "true"
|
||||||
|
// definition.
|
||||||
|
TEST_F(InitGoogleTestTest, ShuffleTrue) {
|
||||||
|
const char* argv[] = {
|
||||||
|
"foo.exe",
|
||||||
|
"--gtest_shuffle=1",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* argv2[] = {
|
||||||
|
"foo.exe",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests parsing --gtest_throw_on_failure.
|
// Tests parsing --gtest_throw_on_failure.
|
||||||
TEST_F(InitGoogleTestTest, ThrowOnFailureNoDef) {
|
TEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) {
|
||||||
const char* argv[] = {
|
const char* argv[] = {
|
||||||
"foo.exe",
|
"foo.exe",
|
||||||
"--gtest_throw_on_failure",
|
"--gtest_throw_on_failure",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user