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