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