Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
googletest-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 //
30 // The Google C++ Testing and Mocking Framework (Google Test)
31 //
32 // This file verifies Google Test event listeners receive events at the
33 // right times.
34 
35 #include <vector>
36 
37 #include "gtest/gtest.h"
39 
41 using ::testing::Environment;
43 using ::testing::Test;
44 using ::testing::TestSuite;
45 using ::testing::TestEventListener;
46 using ::testing::TestInfo;
47 using ::testing::TestPartResult;
48 using ::testing::UnitTest;
49 
50 // Used by tests to register their events.
51 std::vector<std::string>* g_events = nullptr;
52 
53 namespace testing {
54 namespace internal {
55 
57  public:
58  explicit EventRecordingListener(const char* name) : name_(name) {}
59 
60  protected:
61  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
62  g_events->push_back(GetFullMethodName("OnTestProgramStart"));
63  }
64 
65  void OnTestIterationStart(const UnitTest& /*unit_test*/,
66  int iteration) override {
67  Message message;
68  message << GetFullMethodName("OnTestIterationStart")
69  << "(" << iteration << ")";
70  g_events->push_back(message.GetString());
71  }
72 
73  void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
74  g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
75  }
76 
77  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
78  g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
79  }
80 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
81  void OnTestCaseStart(const TestCase& /*test_case*/) override {
82  g_events->push_back(GetFullMethodName("OnTestCaseStart"));
83  }
84 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
85 
86  void OnTestStart(const TestInfo& /*test_info*/) override {
87  g_events->push_back(GetFullMethodName("OnTestStart"));
88  }
89 
90  void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
91  g_events->push_back(GetFullMethodName("OnTestPartResult"));
92  }
93 
94  void OnTestEnd(const TestInfo& /*test_info*/) override {
95  g_events->push_back(GetFullMethodName("OnTestEnd"));
96  }
97 
98 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
99  void OnTestCaseEnd(const TestCase& /*test_case*/) override {
100  g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
101  }
102 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
103 
104  void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
105  g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
106  }
107 
108  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
109  g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
110  }
111 
112  void OnTestIterationEnd(const UnitTest& /*unit_test*/,
113  int iteration) override {
114  Message message;
115  message << GetFullMethodName("OnTestIterationEnd")
116  << "(" << iteration << ")";
117  g_events->push_back(message.GetString());
118  }
119 
120  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
121  g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
122  }
123 
124  private:
125  std::string GetFullMethodName(const char* name) {
126  return name_ + "." + name;
127  }
128 
129  std::string name_;
130 };
131 
132 // This listener is using OnTestSuiteStart, OnTestSuiteEnd API
134  public:
135  explicit EventRecordingListener2(const char* name) : name_(name) {}
136 
137  protected:
138  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {
139  g_events->push_back(GetFullMethodName("OnTestProgramStart"));
140  }
141 
142  void OnTestIterationStart(const UnitTest& /*unit_test*/,
143  int iteration) override {
144  Message message;
145  message << GetFullMethodName("OnTestIterationStart") << "(" << iteration
146  << ")";
147  g_events->push_back(message.GetString());
148  }
149 
150  void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {
151  g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
152  }
153 
154  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {
155  g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
156  }
157 
158  void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {
159  g_events->push_back(GetFullMethodName("OnTestSuiteStart"));
160  }
161 
162  void OnTestStart(const TestInfo& /*test_info*/) override {
163  g_events->push_back(GetFullMethodName("OnTestStart"));
164  }
165 
166  void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {
167  g_events->push_back(GetFullMethodName("OnTestPartResult"));
168  }
169 
170  void OnTestEnd(const TestInfo& /*test_info*/) override {
171  g_events->push_back(GetFullMethodName("OnTestEnd"));
172  }
173 
174  void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {
175  g_events->push_back(GetFullMethodName("OnTestSuiteEnd"));
176  }
177 
178  void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {
179  g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
180  }
181 
182  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {
183  g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
184  }
185 
186  void OnTestIterationEnd(const UnitTest& /*unit_test*/,
187  int iteration) override {
188  Message message;
189  message << GetFullMethodName("OnTestIterationEnd") << "(" << iteration
190  << ")";
191  g_events->push_back(message.GetString());
192  }
193 
194  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {
195  g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
196  }
197 
198  private:
199  std::string GetFullMethodName(const char* name) { return name_ + "." + name; }
200 
201  std::string name_;
202 };
203 
205  protected:
206  void SetUp() override { g_events->push_back("Environment::SetUp"); }
207 
208  void TearDown() override { g_events->push_back("Environment::TearDown"); }
209 };
210 
211 class ListenerTest : public Test {
212  protected:
213  static void SetUpTestSuite() {
214  g_events->push_back("ListenerTest::SetUpTestSuite");
215  }
216 
217  static void TearDownTestSuite() {
218  g_events->push_back("ListenerTest::TearDownTestSuite");
219  }
220 
221  void SetUp() override { g_events->push_back("ListenerTest::SetUp"); }
222 
223  void TearDown() override { g_events->push_back("ListenerTest::TearDown"); }
224 };
225 
226 TEST_F(ListenerTest, DoesFoo) {
227  // Test execution order within a test case is not guaranteed so we are not
228  // recording the test name.
229  g_events->push_back("ListenerTest::* Test Body");
230  SUCCEED(); // Triggers OnTestPartResult.
231 }
232 
233 TEST_F(ListenerTest, DoesBar) {
234  g_events->push_back("ListenerTest::* Test Body");
235  SUCCEED(); // Triggers OnTestPartResult.
236 }
237 
238 } // namespace internal
239 
240 } // namespace testing
241 
242 using ::testing::internal::EnvironmentInvocationCatcher;
243 using ::testing::internal::EventRecordingListener;
244 using ::testing::internal::EventRecordingListener2;
245 
246 void VerifyResults(const std::vector<std::string>& data,
247  const char* const* expected_data,
248  size_t expected_data_size) {
249  const size_t actual_size = data.size();
250  // If the following assertion fails, a new entry will be appended to
251  // data. Hence we save data.size() first.
252  EXPECT_EQ(expected_data_size, actual_size);
253 
254  // Compares the common prefix.
255  const size_t shorter_size = expected_data_size <= actual_size ?
256  expected_data_size : actual_size;
257  size_t i = 0;
258  for (; i < shorter_size; ++i) {
259  ASSERT_STREQ(expected_data[i], data[i].c_str())
260  << "at position " << i;
261  }
262 
263  // Prints extra elements in the actual data.
264  for (; i < actual_size; ++i) {
265  printf(" Actual event #%lu: %s\n",
266  static_cast<unsigned long>(i), data[i].c_str());
267  }
268 }
269 
270 int main(int argc, char **argv) {
271  std::vector<std::string> events;
272  g_events = &events;
273  InitGoogleTest(&argc, argv);
274 
275  UnitTest::GetInstance()->listeners().Append(
276  new EventRecordingListener("1st"));
277  UnitTest::GetInstance()->listeners().Append(
278  new EventRecordingListener("2nd"));
279  UnitTest::GetInstance()->listeners().Append(
280  new EventRecordingListener2("3rd"));
281 
282  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
283 
284  GTEST_CHECK_(events.size() == 0)
285  << "AddGlobalTestEnvironment should not generate any events itself.";
286 
287  ::testing::GTEST_FLAG(repeat) = 2;
288  int ret_val = RUN_ALL_TESTS();
289 
290 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
291 
292  // The deprecated OnTestSuiteStart/OnTestCaseStart events are included
293  const char* const expected_events[] = {"1st.OnTestProgramStart",
294  "2nd.OnTestProgramStart",
295  "3rd.OnTestProgramStart",
296  "1st.OnTestIterationStart(0)",
297  "2nd.OnTestIterationStart(0)",
298  "3rd.OnTestIterationStart(0)",
299  "1st.OnEnvironmentsSetUpStart",
300  "2nd.OnEnvironmentsSetUpStart",
301  "3rd.OnEnvironmentsSetUpStart",
302  "Environment::SetUp",
303  "3rd.OnEnvironmentsSetUpEnd",
304  "2nd.OnEnvironmentsSetUpEnd",
305  "1st.OnEnvironmentsSetUpEnd",
306  "3rd.OnTestSuiteStart",
307  "1st.OnTestCaseStart",
308  "2nd.OnTestCaseStart",
309  "ListenerTest::SetUpTestSuite",
310  "1st.OnTestStart",
311  "2nd.OnTestStart",
312  "3rd.OnTestStart",
313  "ListenerTest::SetUp",
314  "ListenerTest::* Test Body",
315  "1st.OnTestPartResult",
316  "2nd.OnTestPartResult",
317  "3rd.OnTestPartResult",
318  "ListenerTest::TearDown",
319  "3rd.OnTestEnd",
320  "2nd.OnTestEnd",
321  "1st.OnTestEnd",
322  "1st.OnTestStart",
323  "2nd.OnTestStart",
324  "3rd.OnTestStart",
325  "ListenerTest::SetUp",
326  "ListenerTest::* Test Body",
327  "1st.OnTestPartResult",
328  "2nd.OnTestPartResult",
329  "3rd.OnTestPartResult",
330  "ListenerTest::TearDown",
331  "3rd.OnTestEnd",
332  "2nd.OnTestEnd",
333  "1st.OnTestEnd",
334  "ListenerTest::TearDownTestSuite",
335  "3rd.OnTestSuiteEnd",
336  "2nd.OnTestCaseEnd",
337  "1st.OnTestCaseEnd",
338  "1st.OnEnvironmentsTearDownStart",
339  "2nd.OnEnvironmentsTearDownStart",
340  "3rd.OnEnvironmentsTearDownStart",
341  "Environment::TearDown",
342  "3rd.OnEnvironmentsTearDownEnd",
343  "2nd.OnEnvironmentsTearDownEnd",
344  "1st.OnEnvironmentsTearDownEnd",
345  "3rd.OnTestIterationEnd(0)",
346  "2nd.OnTestIterationEnd(0)",
347  "1st.OnTestIterationEnd(0)",
348  "1st.OnTestIterationStart(1)",
349  "2nd.OnTestIterationStart(1)",
350  "3rd.OnTestIterationStart(1)",
351  "1st.OnEnvironmentsSetUpStart",
352  "2nd.OnEnvironmentsSetUpStart",
353  "3rd.OnEnvironmentsSetUpStart",
354  "Environment::SetUp",
355  "3rd.OnEnvironmentsSetUpEnd",
356  "2nd.OnEnvironmentsSetUpEnd",
357  "1st.OnEnvironmentsSetUpEnd",
358  "3rd.OnTestSuiteStart",
359  "1st.OnTestCaseStart",
360  "2nd.OnTestCaseStart",
361  "ListenerTest::SetUpTestSuite",
362  "1st.OnTestStart",
363  "2nd.OnTestStart",
364  "3rd.OnTestStart",
365  "ListenerTest::SetUp",
366  "ListenerTest::* Test Body",
367  "1st.OnTestPartResult",
368  "2nd.OnTestPartResult",
369  "3rd.OnTestPartResult",
370  "ListenerTest::TearDown",
371  "3rd.OnTestEnd",
372  "2nd.OnTestEnd",
373  "1st.OnTestEnd",
374  "1st.OnTestStart",
375  "2nd.OnTestStart",
376  "3rd.OnTestStart",
377  "ListenerTest::SetUp",
378  "ListenerTest::* Test Body",
379  "1st.OnTestPartResult",
380  "2nd.OnTestPartResult",
381  "3rd.OnTestPartResult",
382  "ListenerTest::TearDown",
383  "3rd.OnTestEnd",
384  "2nd.OnTestEnd",
385  "1st.OnTestEnd",
386  "ListenerTest::TearDownTestSuite",
387  "3rd.OnTestSuiteEnd",
388  "2nd.OnTestCaseEnd",
389  "1st.OnTestCaseEnd",
390  "1st.OnEnvironmentsTearDownStart",
391  "2nd.OnEnvironmentsTearDownStart",
392  "3rd.OnEnvironmentsTearDownStart",
393  "Environment::TearDown",
394  "3rd.OnEnvironmentsTearDownEnd",
395  "2nd.OnEnvironmentsTearDownEnd",
396  "1st.OnEnvironmentsTearDownEnd",
397  "3rd.OnTestIterationEnd(1)",
398  "2nd.OnTestIterationEnd(1)",
399  "1st.OnTestIterationEnd(1)",
400  "3rd.OnTestProgramEnd",
401  "2nd.OnTestProgramEnd",
402  "1st.OnTestProgramEnd"};
403 #else
404  const char* const expected_events[] = {"1st.OnTestProgramStart",
405  "2nd.OnTestProgramStart",
406  "3rd.OnTestProgramStart",
407  "1st.OnTestIterationStart(0)",
408  "2nd.OnTestIterationStart(0)",
409  "3rd.OnTestIterationStart(0)",
410  "1st.OnEnvironmentsSetUpStart",
411  "2nd.OnEnvironmentsSetUpStart",
412  "3rd.OnEnvironmentsSetUpStart",
413  "Environment::SetUp",
414  "3rd.OnEnvironmentsSetUpEnd",
415  "2nd.OnEnvironmentsSetUpEnd",
416  "1st.OnEnvironmentsSetUpEnd",
417  "3rd.OnTestSuiteStart",
418  "ListenerTest::SetUpTestSuite",
419  "1st.OnTestStart",
420  "2nd.OnTestStart",
421  "3rd.OnTestStart",
422  "ListenerTest::SetUp",
423  "ListenerTest::* Test Body",
424  "1st.OnTestPartResult",
425  "2nd.OnTestPartResult",
426  "3rd.OnTestPartResult",
427  "ListenerTest::TearDown",
428  "3rd.OnTestEnd",
429  "2nd.OnTestEnd",
430  "1st.OnTestEnd",
431  "1st.OnTestStart",
432  "2nd.OnTestStart",
433  "3rd.OnTestStart",
434  "ListenerTest::SetUp",
435  "ListenerTest::* Test Body",
436  "1st.OnTestPartResult",
437  "2nd.OnTestPartResult",
438  "3rd.OnTestPartResult",
439  "ListenerTest::TearDown",
440  "3rd.OnTestEnd",
441  "2nd.OnTestEnd",
442  "1st.OnTestEnd",
443  "ListenerTest::TearDownTestSuite",
444  "3rd.OnTestSuiteEnd",
445  "1st.OnEnvironmentsTearDownStart",
446  "2nd.OnEnvironmentsTearDownStart",
447  "3rd.OnEnvironmentsTearDownStart",
448  "Environment::TearDown",
449  "3rd.OnEnvironmentsTearDownEnd",
450  "2nd.OnEnvironmentsTearDownEnd",
451  "1st.OnEnvironmentsTearDownEnd",
452  "3rd.OnTestIterationEnd(0)",
453  "2nd.OnTestIterationEnd(0)",
454  "1st.OnTestIterationEnd(0)",
455  "1st.OnTestIterationStart(1)",
456  "2nd.OnTestIterationStart(1)",
457  "3rd.OnTestIterationStart(1)",
458  "1st.OnEnvironmentsSetUpStart",
459  "2nd.OnEnvironmentsSetUpStart",
460  "3rd.OnEnvironmentsSetUpStart",
461  "Environment::SetUp",
462  "3rd.OnEnvironmentsSetUpEnd",
463  "2nd.OnEnvironmentsSetUpEnd",
464  "1st.OnEnvironmentsSetUpEnd",
465  "3rd.OnTestSuiteStart",
466  "ListenerTest::SetUpTestSuite",
467  "1st.OnTestStart",
468  "2nd.OnTestStart",
469  "3rd.OnTestStart",
470  "ListenerTest::SetUp",
471  "ListenerTest::* Test Body",
472  "1st.OnTestPartResult",
473  "2nd.OnTestPartResult",
474  "3rd.OnTestPartResult",
475  "ListenerTest::TearDown",
476  "3rd.OnTestEnd",
477  "2nd.OnTestEnd",
478  "1st.OnTestEnd",
479  "1st.OnTestStart",
480  "2nd.OnTestStart",
481  "3rd.OnTestStart",
482  "ListenerTest::SetUp",
483  "ListenerTest::* Test Body",
484  "1st.OnTestPartResult",
485  "2nd.OnTestPartResult",
486  "3rd.OnTestPartResult",
487  "ListenerTest::TearDown",
488  "3rd.OnTestEnd",
489  "2nd.OnTestEnd",
490  "1st.OnTestEnd",
491  "ListenerTest::TearDownTestSuite",
492  "3rd.OnTestSuiteEnd",
493  "1st.OnEnvironmentsTearDownStart",
494  "2nd.OnEnvironmentsTearDownStart",
495  "3rd.OnEnvironmentsTearDownStart",
496  "Environment::TearDown",
497  "3rd.OnEnvironmentsTearDownEnd",
498  "2nd.OnEnvironmentsTearDownEnd",
499  "1st.OnEnvironmentsTearDownEnd",
500  "3rd.OnTestIterationEnd(1)",
501  "2nd.OnTestIterationEnd(1)",
502  "1st.OnTestIterationEnd(1)",
503  "3rd.OnTestProgramEnd",
504  "2nd.OnTestProgramEnd",
505  "1st.OnTestProgramEnd"};
506 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
507 
508  VerifyResults(events,
509  expected_events,
510  sizeof(expected_events)/sizeof(expected_events[0]));
511 
512  // We need to check manually for ad hoc test failures that happen after
513  // RUN_ALL_TESTS finishes.
514  if (UnitTest::GetInstance()->Failed())
515  ret_val = 1;
516 
517  return ret_val;
518 }
Environment * AddGlobalTestEnvironment(Environment *env)
Definition: gtest.h:1492
void OnTestIterationEnd(const UnitTest &, int iteration) override
void OnTestSuiteStart(const TestSuite &) override
void OnTestProgramStart(const UnitTest &) override
void OnEnvironmentsTearDownEnd(const UnitTest &) override
void OnEnvironmentsTearDownStart(const UnitTest &) override
#define GTEST_FLAG(name)
Definition: gtest-port.h:2187
void OnEnvironmentsSetUpStart(const UnitTest &) override
void OnEnvironmentsSetUpEnd(const UnitTest &) override
void OnTestIterationEnd(const UnitTest &, int iteration) override
TEST_F(ListenerTest, DoesFoo)
void OnTestProgramEnd(const UnitTest &) override
#define GTEST_CHECK_(condition)
Definition: gtest-port.h:1004
int main()
Definition: ad_example.cpp:191
void OnTestPartResult(const TestPartResult &) override
void VerifyResults(const std::vector< std::string > &data, const char *const *expected_data, size_t expected_data_size)
std::string GetString() const
Definition: gtest.cc:1168
void OnTestProgramStart(const UnitTest &) override
void OnEnvironmentsTearDownEnd(const UnitTest &) override
void OnEnvironmentsSetUpEnd(const UnitTest &) override
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:2038
void OnEnvironmentsSetUpStart(const UnitTest &) override
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: gtest.h:2484
void OnEnvironmentsTearDownStart(const UnitTest &) override
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: gtest.cc:6527
void OnTestCaseStart(const TestCase &) override
std::vector< std::string > * g_events
void OnTestIterationStart(const UnitTest &, int iteration) override
#define SUCCEED()
Definition: gtest.h:1951
#define ASSERT_STREQ(s1, s2)
Definition: gtest.h:2116
void OnTestPartResult(const TestPartResult &) override
void OnTestIterationStart(const UnitTest &, int iteration) override