1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2009 Google Inc. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: vladl@google.com (Vlad Losev)
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The Google C++ Testing Framework (Google Test)
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file verifies Google Test event listeners receive events at the
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// right times.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::AddGlobalTestEnvironment;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::Environment;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::InitGoogleTest;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::Test;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::TestCase;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::TestEventListener;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::TestInfo;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::TestPartResult;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::UnitTest;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::internal::String;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Used by tests to register their events.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::vector<String>* g_events = NULL;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass EventRecordingListener : public TestEventListener {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EventRecordingListener(const char* name) : name_(name) {}
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestProgramStart"));
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    int iteration) {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Message message;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message << GetFullMethodName("OnTestIterationStart")
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            << "(" << iteration << ")";
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(message.GetString());
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestCaseStart"));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestStart(const TestInfo& /*test_info*/) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestStart"));
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestPartResult"));
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestEnd(const TestInfo& /*test_info*/) {
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestEnd"));
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int iteration) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Message message;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message << GetFullMethodName("OnTestIterationEnd")
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            << "("  << iteration << ")";
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(message.GetString());
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  String GetFullMethodName(const char* name) {
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Message message;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message << name_ << "." << name;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return message.GetString();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  String name_;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass EnvironmentInvocationCatcher : public Environment {
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(String("Environment::SetUp"));
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(String("Environment::TearDown"));
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ListenerTest : public Test {
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void SetUpTestCase() {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(String("ListenerTest::SetUpTestCase"));
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void TearDownTestCase() {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(String("ListenerTest::TearDownTestCase"));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(String("ListenerTest::SetUp"));
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_events->push_back(String("ListenerTest::TearDown"));
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ListenerTest, DoesFoo) {
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test execution order within a test case is not guaranteed so we are not
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // recording the test name.
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_events->push_back(String("ListenerTest::* Test Body"));
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SUCCEED();  // Triggers OnTestPartResult.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ListenerTest, DoesBar) {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_events->push_back(String("ListenerTest::* Test Body"));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SUCCEED();  // Triggers OnTestPartResult.
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::internal::EnvironmentInvocationCatcher;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing ::testing::internal::EventRecordingListener;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid VerifyResults(const std::vector<String>& data,
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const char* const* expected_data,
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int expected_data_size) {
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int actual_size = data.size();
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the following assertion fails, a new entry will be appended to
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // data.  Hence we save data.size() first.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected_data_size, actual_size);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Compares the common prefix.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int shorter_size = expected_data_size <= actual_size ?
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      expected_data_size : actual_size;
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int i = 0;
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (; i < shorter_size; ++i) {
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_STREQ(expected_data[i], data[i].c_str())
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        << "at position " << i;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Prints extra elements in the actual data.
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (; i < actual_size; ++i) {
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    printf("  Actual event #%d: %s\n", i, data[i].c_str());
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint main(int argc, char **argv) {
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<String> events;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_events = &events;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InitGoogleTest(&argc, argv);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UnitTest::GetInstance()->listeners().Append(
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new EventRecordingListener("1st"));
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UnitTest::GetInstance()->listeners().Append(
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new EventRecordingListener("2nd"));
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_CHECK_(events.size() == 0)
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << "AddGlobalTestEnvironment should not generate any events itself.";
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ::testing::GTEST_FLAG(repeat) = 2;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ret_val = RUN_ALL_TESTS();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* const expected_events[] = {
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestProgramStart",
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestProgramStart",
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestIterationStart(0)",
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestIterationStart(0)",
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsSetUpStart",
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsSetUpStart",
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "Environment::SetUp",
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsSetUpEnd",
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsSetUpEnd",
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestCaseStart",
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestCaseStart",
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::SetUpTestCase",
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestStart",
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestStart",
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::SetUp",
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::* Test Body",
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestPartResult",
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestPartResult",
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::TearDown",
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestEnd",
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestEnd",
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestStart",
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestStart",
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::SetUp",
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::* Test Body",
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestPartResult",
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestPartResult",
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::TearDown",
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestEnd",
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestEnd",
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::TearDownTestCase",
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestCaseEnd",
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestCaseEnd",
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsTearDownStart",
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsTearDownStart",
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "Environment::TearDown",
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsTearDownEnd",
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsTearDownEnd",
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestIterationEnd(0)",
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestIterationEnd(0)",
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestIterationStart(1)",
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestIterationStart(1)",
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsSetUpStart",
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsSetUpStart",
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "Environment::SetUp",
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsSetUpEnd",
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsSetUpEnd",
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestCaseStart",
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestCaseStart",
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::SetUpTestCase",
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestStart",
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestStart",
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::SetUp",
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::* Test Body",
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestPartResult",
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestPartResult",
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::TearDown",
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestEnd",
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestEnd",
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestStart",
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestStart",
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::SetUp",
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::* Test Body",
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestPartResult",
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestPartResult",
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::TearDown",
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestEnd",
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestEnd",
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "ListenerTest::TearDownTestCase",
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestCaseEnd",
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestCaseEnd",
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsTearDownStart",
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsTearDownStart",
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "Environment::TearDown",
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnEnvironmentsTearDownEnd",
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnEnvironmentsTearDownEnd",
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestIterationEnd(1)",
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestIterationEnd(1)",
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "2nd.OnTestProgramEnd",
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "1st.OnTestProgramEnd"
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VerifyResults(events,
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                expected_events,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                sizeof(expected_events)/sizeof(expected_events[0]));
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We need to check manually for ad hoc test failures that happen after
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RUN_ALL_TESTS finishes.
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (UnitTest::GetInstance()->Failed())
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ret_val = 1;
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return ret_val;
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
314