141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Copyright 2009 Google Inc. All rights reserved.
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Redistribution and use in source and binary forms, with or without
441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// modification, are permitted provided that the following conditions are
541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// met:
641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions of source code must retain the above copyright
841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// notice, this list of conditions and the following disclaimer.
941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions in binary form must reproduce the above
1041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// copyright notice, this list of conditions and the following disclaimer
1141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in the documentation and/or other materials provided with the
1241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// distribution.
1341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Neither the name of Google Inc. nor the names of its
1441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// contributors may be used to endorse or promote products derived from
1541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// this software without specific prior written permission.
1641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
1741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
2941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Author: vladl@google.com (Vlad Losev)
3041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The Google C++ Testing Framework (Google Test)
3241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This file verifies Google Test event listeners receive events at the
3441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// right times.
3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/gtest.h"
3741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <vector>
3841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::AddGlobalTestEnvironment;
4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::Environment;
4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::InitGoogleTest;
4241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::Test;
4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::TestCase;
4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::TestEventListener;
4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::TestInfo;
4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::TestPartResult;
4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::UnitTest;
4841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Used by tests to register their events.
50fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughesstd::vector<std::string>* g_events = NULL;
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace testing {
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace internal {
5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass EventRecordingListener : public TestEventListener {
5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
57fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes  explicit EventRecordingListener(const char* name) : name_(name) {}
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
6141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestProgramStart"));
6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                                    int iteration) {
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    Message message;
6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    message << GetFullMethodName("OnTestIterationStart")
6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot            << "(" << iteration << ")";
6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(message.GetString());
7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
8141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestCaseStart"));
8241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
8341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestStart(const TestInfo& /*test_info*/) {
8541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestStart"));
8641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestPartResult"));
9041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestEnd(const TestInfo& /*test_info*/) {
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestEnd"));
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
9941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
10241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
10641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
10741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
10941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                                  int iteration) {
11041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    Message message;
11141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    message << GetFullMethodName("OnTestIterationEnd")
11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot            << "("  << iteration << ")";
11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(message.GetString());
11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private:
121fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes  std::string GetFullMethodName(const char* name) {
122fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    return name_ + "." + name;
12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
125fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes  std::string name_;
12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass EnvironmentInvocationCatcher : public Environment {
12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void SetUp() {
131fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    g_events->push_back("Environment::SetUp");
13241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
135fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    g_events->push_back("Environment::TearDown");
13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ListenerTest : public Test {
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void SetUpTestCase() {
142fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    g_events->push_back("ListenerTest::SetUpTestCase");
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static void TearDownTestCase() {
146fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    g_events->push_back("ListenerTest::TearDownTestCase");
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void SetUp() {
150fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    g_events->push_back("ListenerTest::SetUp");
15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
154fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes    g_events->push_back("ListenerTest::TearDown");
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(ListenerTest, DoesFoo) {
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Test execution order within a test case is not guaranteed so we are not
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // recording the test name.
161fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes  g_events->push_back("ListenerTest::* Test Body");
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  SUCCEED();  // Triggers OnTestPartResult.
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_F(ListenerTest, DoesBar) {
166fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes  g_events->push_back("ListenerTest::* Test Body");
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  SUCCEED();  // Triggers OnTestPartResult.
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace internal
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace testing
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::internal::EnvironmentInvocationCatcher;
17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::internal::EventRecordingListener;
17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
177fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughesvoid VerifyResults(const std::vector<std::string>& data,
17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   const char* const* expected_data,
17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   int expected_data_size) {
18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const int actual_size = data.size();
18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // If the following assertion fails, a new entry will be appended to
18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // data.  Hence we save data.size() first.
18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(expected_data_size, actual_size);
18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Compares the common prefix.
18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const int shorter_size = expected_data_size <= actual_size ?
18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      expected_data_size : actual_size;
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  int i = 0;
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  for (; i < shorter_size; ++i) {
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ASSERT_STREQ(expected_data[i], data[i].c_str())
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        << "at position " << i;
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Prints extra elements in the actual data.
19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  for (; i < actual_size; ++i) {
19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    printf("  Actual event #%d: %s\n", i, data[i].c_str());
19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotint main(int argc, char **argv) {
201fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes  std::vector<std::string> events;
20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  g_events = &events;
20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  InitGoogleTest(&argc, argv);
20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UnitTest::GetInstance()->listeners().Append(
20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      new EventRecordingListener("1st"));
20741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UnitTest::GetInstance()->listeners().Append(
20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      new EventRecordingListener("2nd"));
20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
21141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  GTEST_CHECK_(events.size() == 0)
21341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      << "AddGlobalTestEnvironment should not generate any events itself.";
21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ::testing::GTEST_FLAG(repeat) = 2;
21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  int ret_val = RUN_ALL_TESTS();
21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const char* const expected_events[] = {
21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestProgramStart",
22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestProgramStart",
22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestIterationStart(0)",
22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestIterationStart(0)",
22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsSetUpStart",
22441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsSetUpStart",
22541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "Environment::SetUp",
22641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsSetUpEnd",
22741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsSetUpEnd",
22841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestCaseStart",
22941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestCaseStart",
23041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::SetUpTestCase",
23141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestStart",
23241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestStart",
23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::SetUp",
23441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::* Test Body",
23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestPartResult",
23641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestPartResult",
23741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::TearDown",
23841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestEnd",
23941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestEnd",
24041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestStart",
24141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestStart",
24241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::SetUp",
24341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::* Test Body",
24441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestPartResult",
24541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestPartResult",
24641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::TearDown",
24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestEnd",
24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestEnd",
24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::TearDownTestCase",
25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestCaseEnd",
25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestCaseEnd",
25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsTearDownStart",
25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsTearDownStart",
25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "Environment::TearDown",
25541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsTearDownEnd",
25641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsTearDownEnd",
25741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestIterationEnd(0)",
25841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestIterationEnd(0)",
25941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestIterationStart(1)",
26041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestIterationStart(1)",
26141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsSetUpStart",
26241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsSetUpStart",
26341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "Environment::SetUp",
26441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsSetUpEnd",
26541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsSetUpEnd",
26641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestCaseStart",
26741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestCaseStart",
26841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::SetUpTestCase",
26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestStart",
27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestStart",
27141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::SetUp",
27241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::* Test Body",
27341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestPartResult",
27441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestPartResult",
27541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::TearDown",
27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestEnd",
27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestEnd",
27841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestStart",
27941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestStart",
28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::SetUp",
28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::* Test Body",
28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestPartResult",
28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestPartResult",
28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::TearDown",
28541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestEnd",
28641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestEnd",
28741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "ListenerTest::TearDownTestCase",
28841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestCaseEnd",
28941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestCaseEnd",
29041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsTearDownStart",
29141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsTearDownStart",
29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "Environment::TearDown",
29341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnEnvironmentsTearDownEnd",
29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnEnvironmentsTearDownEnd",
29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestIterationEnd(1)",
29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestIterationEnd(1)",
29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "2nd.OnTestProgramEnd",
29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    "1st.OnTestProgramEnd"
29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  };
30041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  VerifyResults(events,
30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                expected_events,
30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                sizeof(expected_events)/sizeof(expected_events[0]));
30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // We need to check manually for ad hoc test failures that happen after
30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // RUN_ALL_TESTS finishes.
30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (UnitTest::GetInstance()->Failed())
30741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ret_val = 1;
30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return ret_val;
31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
311