113481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com// Tests the --gtest_repeat=number flag.
3313481Sgiacomo.travaglini@arm.com
3413481Sgiacomo.travaglini@arm.com#include <stdlib.h>
3513481Sgiacomo.travaglini@arm.com#include <iostream>
3613481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com// Indicates that this translation unit is part of Google Test's
3913481Sgiacomo.travaglini@arm.com// implementation.  It must come before gtest-internal-inl.h is
4013481Sgiacomo.travaglini@arm.com// included, or there will be a compiler error.  This trick is to
4113481Sgiacomo.travaglini@arm.com// prevent a user from accidentally including gtest-internal-inl.h in
4213481Sgiacomo.travaglini@arm.com// his code.
4313481Sgiacomo.travaglini@arm.com#define GTEST_IMPLEMENTATION_ 1
4413481Sgiacomo.travaglini@arm.com#include "src/gtest-internal-inl.h"
4513481Sgiacomo.travaglini@arm.com#undef GTEST_IMPLEMENTATION_
4613481Sgiacomo.travaglini@arm.com
4713481Sgiacomo.travaglini@arm.comnamespace testing {
4813481Sgiacomo.travaglini@arm.com
4913481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(death_test_style);
5013481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(filter);
5113481Sgiacomo.travaglini@arm.comGTEST_DECLARE_int32_(repeat);
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.com}  // namespace testing
5413481Sgiacomo.travaglini@arm.com
5513481Sgiacomo.travaglini@arm.comusing testing::GTEST_FLAG(death_test_style);
5613481Sgiacomo.travaglini@arm.comusing testing::GTEST_FLAG(filter);
5713481Sgiacomo.travaglini@arm.comusing testing::GTEST_FLAG(repeat);
5813481Sgiacomo.travaglini@arm.com
5913481Sgiacomo.travaglini@arm.comnamespace {
6013481Sgiacomo.travaglini@arm.com
6113481Sgiacomo.travaglini@arm.com// We need this when we are testing Google Test itself and therefore
6213481Sgiacomo.travaglini@arm.com// cannot use Google Test assertions.
6313481Sgiacomo.travaglini@arm.com#define GTEST_CHECK_INT_EQ_(expected, actual) \
6413481Sgiacomo.travaglini@arm.com  do {\
6513481Sgiacomo.travaglini@arm.com    const int expected_val = (expected);\
6613481Sgiacomo.travaglini@arm.com    const int actual_val = (actual);\
6713481Sgiacomo.travaglini@arm.com    if (::testing::internal::IsTrue(expected_val != actual_val)) {\
6813481Sgiacomo.travaglini@arm.com      ::std::cout << "Value of: " #actual "\n"\
6913481Sgiacomo.travaglini@arm.com                  << "  Actual: " << actual_val << "\n"\
7013481Sgiacomo.travaglini@arm.com                  << "Expected: " #expected "\n"\
7113481Sgiacomo.travaglini@arm.com                  << "Which is: " << expected_val << "\n";\
7213481Sgiacomo.travaglini@arm.com      ::testing::internal::posix::Abort();\
7313481Sgiacomo.travaglini@arm.com    }\
7413481Sgiacomo.travaglini@arm.com  } while (::testing::internal::AlwaysFalse())
7513481Sgiacomo.travaglini@arm.com
7613481Sgiacomo.travaglini@arm.com
7713481Sgiacomo.travaglini@arm.com// Used for verifying that global environment set-up and tear-down are
7813481Sgiacomo.travaglini@arm.com// inside the gtest_repeat loop.
7913481Sgiacomo.travaglini@arm.com
8013481Sgiacomo.travaglini@arm.comint g_environment_set_up_count = 0;
8113481Sgiacomo.travaglini@arm.comint g_environment_tear_down_count = 0;
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.comclass MyEnvironment : public testing::Environment {
8413481Sgiacomo.travaglini@arm.com public:
8513481Sgiacomo.travaglini@arm.com  MyEnvironment() {}
8613481Sgiacomo.travaglini@arm.com  virtual void SetUp() { g_environment_set_up_count++; }
8713481Sgiacomo.travaglini@arm.com  virtual void TearDown() { g_environment_tear_down_count++; }
8813481Sgiacomo.travaglini@arm.com};
8913481Sgiacomo.travaglini@arm.com
9013481Sgiacomo.travaglini@arm.com// A test that should fail.
9113481Sgiacomo.travaglini@arm.com
9213481Sgiacomo.travaglini@arm.comint g_should_fail_count = 0;
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.comTEST(FooTest, ShouldFail) {
9513481Sgiacomo.travaglini@arm.com  g_should_fail_count++;
9613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, 1) << "Expected failure.";
9713481Sgiacomo.travaglini@arm.com}
9813481Sgiacomo.travaglini@arm.com
9913481Sgiacomo.travaglini@arm.com// A test that should pass.
10013481Sgiacomo.travaglini@arm.com
10113481Sgiacomo.travaglini@arm.comint g_should_pass_count = 0;
10213481Sgiacomo.travaglini@arm.com
10313481Sgiacomo.travaglini@arm.comTEST(FooTest, ShouldPass) {
10413481Sgiacomo.travaglini@arm.com  g_should_pass_count++;
10513481Sgiacomo.travaglini@arm.com}
10613481Sgiacomo.travaglini@arm.com
10713481Sgiacomo.travaglini@arm.com// A test that contains a thread-safe death test and a fast death
10813481Sgiacomo.travaglini@arm.com// test.  It should pass.
10913481Sgiacomo.travaglini@arm.com
11013481Sgiacomo.travaglini@arm.comint g_death_test_count = 0;
11113481Sgiacomo.travaglini@arm.com
11213481Sgiacomo.travaglini@arm.comTEST(BarDeathTest, ThreadSafeAndFast) {
11313481Sgiacomo.travaglini@arm.com  g_death_test_count++;
11413481Sgiacomo.travaglini@arm.com
11513481Sgiacomo.travaglini@arm.com  GTEST_FLAG(death_test_style) = "threadsafe";
11613481Sgiacomo.travaglini@arm.com  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com  GTEST_FLAG(death_test_style) = "fast";
11913481Sgiacomo.travaglini@arm.com  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
12013481Sgiacomo.travaglini@arm.com}
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
12313481Sgiacomo.travaglini@arm.comint g_param_test_count = 0;
12413481Sgiacomo.travaglini@arm.com
12513481Sgiacomo.travaglini@arm.comconst int kNumberOfParamTests = 10;
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.comclass MyParamTest : public testing::TestWithParam<int> {};
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.comTEST_P(MyParamTest, ShouldPass) {
13013481Sgiacomo.travaglini@arm.com  // TODO(vladl@google.com): Make parameter value checking robust
13113481Sgiacomo.travaglini@arm.com  //                         WRT order of tests.
13213481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
13313481Sgiacomo.travaglini@arm.com  g_param_test_count++;
13413481Sgiacomo.travaglini@arm.com}
13513481Sgiacomo.travaglini@arm.comINSTANTIATE_TEST_CASE_P(MyParamSequence,
13613481Sgiacomo.travaglini@arm.com                        MyParamTest,
13713481Sgiacomo.travaglini@arm.com                        testing::Range(0, kNumberOfParamTests));
13813481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
13913481Sgiacomo.travaglini@arm.com
14013481Sgiacomo.travaglini@arm.com// Resets the count for each test.
14113481Sgiacomo.travaglini@arm.comvoid ResetCounts() {
14213481Sgiacomo.travaglini@arm.com  g_environment_set_up_count = 0;
14313481Sgiacomo.travaglini@arm.com  g_environment_tear_down_count = 0;
14413481Sgiacomo.travaglini@arm.com  g_should_fail_count = 0;
14513481Sgiacomo.travaglini@arm.com  g_should_pass_count = 0;
14613481Sgiacomo.travaglini@arm.com  g_death_test_count = 0;
14713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
14813481Sgiacomo.travaglini@arm.com  g_param_test_count = 0;
14913481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
15013481Sgiacomo.travaglini@arm.com}
15113481Sgiacomo.travaglini@arm.com
15213481Sgiacomo.travaglini@arm.com// Checks that the count for each test is expected.
15313481Sgiacomo.travaglini@arm.comvoid CheckCounts(int expected) {
15413481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
15513481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
15613481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
15713481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
15813481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
15913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
16013481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
16113481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
16213481Sgiacomo.travaglini@arm.com}
16313481Sgiacomo.travaglini@arm.com
16413481Sgiacomo.travaglini@arm.com// Tests the behavior of Google Test when --gtest_repeat is not specified.
16513481Sgiacomo.travaglini@arm.comvoid TestRepeatUnspecified() {
16613481Sgiacomo.travaglini@arm.com  ResetCounts();
16713481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
16813481Sgiacomo.travaglini@arm.com  CheckCounts(1);
16913481Sgiacomo.travaglini@arm.com}
17013481Sgiacomo.travaglini@arm.com
17113481Sgiacomo.travaglini@arm.com// Tests the behavior of Google Test when --gtest_repeat has the given value.
17213481Sgiacomo.travaglini@arm.comvoid TestRepeat(int repeat) {
17313481Sgiacomo.travaglini@arm.com  GTEST_FLAG(repeat) = repeat;
17413481Sgiacomo.travaglini@arm.com
17513481Sgiacomo.travaglini@arm.com  ResetCounts();
17613481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
17713481Sgiacomo.travaglini@arm.com  CheckCounts(repeat);
17813481Sgiacomo.travaglini@arm.com}
17913481Sgiacomo.travaglini@arm.com
18013481Sgiacomo.travaglini@arm.com// Tests using --gtest_repeat when --gtest_filter specifies an empty
18113481Sgiacomo.travaglini@arm.com// set of tests.
18213481Sgiacomo.travaglini@arm.comvoid TestRepeatWithEmptyFilter(int repeat) {
18313481Sgiacomo.travaglini@arm.com  GTEST_FLAG(repeat) = repeat;
18413481Sgiacomo.travaglini@arm.com  GTEST_FLAG(filter) = "None";
18513481Sgiacomo.travaglini@arm.com
18613481Sgiacomo.travaglini@arm.com  ResetCounts();
18713481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
18813481Sgiacomo.travaglini@arm.com  CheckCounts(0);
18913481Sgiacomo.travaglini@arm.com}
19013481Sgiacomo.travaglini@arm.com
19113481Sgiacomo.travaglini@arm.com// Tests using --gtest_repeat when --gtest_filter specifies a set of
19213481Sgiacomo.travaglini@arm.com// successful tests.
19313481Sgiacomo.travaglini@arm.comvoid TestRepeatWithFilterForSuccessfulTests(int repeat) {
19413481Sgiacomo.travaglini@arm.com  GTEST_FLAG(repeat) = repeat;
19513481Sgiacomo.travaglini@arm.com  GTEST_FLAG(filter) = "*-*ShouldFail";
19613481Sgiacomo.travaglini@arm.com
19713481Sgiacomo.travaglini@arm.com  ResetCounts();
19813481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
19913481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
20013481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
20113481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
20213481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
20313481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
20413481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
20513481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
20613481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
20713481Sgiacomo.travaglini@arm.com}
20813481Sgiacomo.travaglini@arm.com
20913481Sgiacomo.travaglini@arm.com// Tests using --gtest_repeat when --gtest_filter specifies a set of
21013481Sgiacomo.travaglini@arm.com// failed tests.
21113481Sgiacomo.travaglini@arm.comvoid TestRepeatWithFilterForFailedTests(int repeat) {
21213481Sgiacomo.travaglini@arm.com  GTEST_FLAG(repeat) = repeat;
21313481Sgiacomo.travaglini@arm.com  GTEST_FLAG(filter) = "*ShouldFail";
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com  ResetCounts();
21613481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
21713481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
21813481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
21913481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
22013481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
22113481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(0, g_death_test_count);
22213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
22313481Sgiacomo.travaglini@arm.com  GTEST_CHECK_INT_EQ_(0, g_param_test_count);
22413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
22513481Sgiacomo.travaglini@arm.com}
22613481Sgiacomo.travaglini@arm.com
22713481Sgiacomo.travaglini@arm.com}  // namespace
22813481Sgiacomo.travaglini@arm.com
22913481Sgiacomo.travaglini@arm.comint main(int argc, char **argv) {
23013481Sgiacomo.travaglini@arm.com  testing::InitGoogleTest(&argc, argv);
23113481Sgiacomo.travaglini@arm.com  testing::AddGlobalTestEnvironment(new MyEnvironment);
23213481Sgiacomo.travaglini@arm.com
23313481Sgiacomo.travaglini@arm.com  TestRepeatUnspecified();
23413481Sgiacomo.travaglini@arm.com  TestRepeat(0);
23513481Sgiacomo.travaglini@arm.com  TestRepeat(1);
23613481Sgiacomo.travaglini@arm.com  TestRepeat(5);
23713481Sgiacomo.travaglini@arm.com
23813481Sgiacomo.travaglini@arm.com  TestRepeatWithEmptyFilter(2);
23913481Sgiacomo.travaglini@arm.com  TestRepeatWithEmptyFilter(3);
24013481Sgiacomo.travaglini@arm.com
24113481Sgiacomo.travaglini@arm.com  TestRepeatWithFilterForSuccessfulTests(3);
24213481Sgiacomo.travaglini@arm.com
24313481Sgiacomo.travaglini@arm.com  TestRepeatWithFilterForFailedTests(4);
24413481Sgiacomo.travaglini@arm.com
24513481Sgiacomo.travaglini@arm.com  // It would be nice to verify that the tests indeed loop forever
24613481Sgiacomo.travaglini@arm.com  // when GTEST_FLAG(repeat) is negative, but this test will be quite
24713481Sgiacomo.travaglini@arm.com  // complicated to write.  Since this flag is for interactive
24813481Sgiacomo.travaglini@arm.com  // debugging only and doesn't affect the normal test result, such a
24913481Sgiacomo.travaglini@arm.com  // test would be an overkill.
25013481Sgiacomo.travaglini@arm.com
25113481Sgiacomo.travaglini@arm.com  printf("PASS\n");
25213481Sgiacomo.travaglini@arm.com  return 0;
25313481Sgiacomo.travaglini@arm.com}
254