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


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:09