1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_unit_test/googletest_handler_adapter.h"
16
17 #include <cstdlib>
18
19 namespace pw::unit_test {
20
RegisterEventHandler(EventHandler * event_handler)21 void RegisterEventHandler(EventHandler* event_handler) {
22 static testing::TestEventListener* gTestListener = nullptr;
23 auto& listeners = testing::UnitTest::GetInstance()->listeners();
24 if (!gTestListener) {
25 gTestListener = listeners.default_result_printer();
26 }
27 if (gTestListener) {
28 listeners.Release(gTestListener);
29 delete gTestListener;
30 }
31 if (event_handler) {
32 gTestListener = new pw::unit_test::GoogleTestHandlerAdapter(*event_handler);
33 listeners.Append(gTestListener);
34 }
35 }
36
OnTestProgramStart(const testing::UnitTest & unit_test)37 void GoogleTestHandlerAdapter::OnTestProgramStart(
38 const testing::UnitTest& unit_test) {
39 handler_.TestProgramStart(
40 {unit_test.test_to_run_count(), unit_test.test_suite_to_run_count(), {}});
41 }
42
OnEnvironmentsSetUpEnd(const::testing::UnitTest &)43 void GoogleTestHandlerAdapter::OnEnvironmentsSetUpEnd(
44 const ::testing::UnitTest&) {
45 handler_.EnvironmentsSetUpEnd();
46 }
47
OnTestSuiteStart(const::testing::TestSuite & ts)48 void GoogleTestHandlerAdapter::OnTestSuiteStart(
49 const ::testing::TestSuite& ts) {
50 handler_.TestSuiteStart({ts.name(), ts.test_to_run_count()});
51 }
52
OnTestStart(const::testing::TestInfo & ti)53 void GoogleTestHandlerAdapter::OnTestStart(const ::testing::TestInfo& ti) {
54 handler_.TestCaseStart({ti.test_suite_name(), ti.name(), ti.file()});
55 }
56
OnTestPartResult(const::testing::TestPartResult & tpr)57 void GoogleTestHandlerAdapter::OnTestPartResult(
58 const ::testing::TestPartResult& tpr) {
59 handler_.TestCaseExpect(
60 {.suite_name = "", .test_name = "", .file_name = tpr.file_name()},
61 {.expression = "",
62 .evaluated_expression = tpr.summary(),
63 .line_number = tpr.line_number(),
64 .success = tpr.passed() || tpr.skipped()});
65 }
66
OnTestEnd(const::testing::TestInfo & ti)67 void GoogleTestHandlerAdapter::OnTestEnd(const ::testing::TestInfo& ti) {
68 auto result = ti.result()->Passed()
69 ? TestResult::kSuccess
70 : (ti.result()->Failed() ? TestResult::kFailure
71 : TestResult::kSkipped);
72
73 handler_.TestCaseEnd({ti.test_suite_name(), ti.name(), ti.file()}, result);
74 }
75
OnTestSuiteEnd(const::testing::TestSuite & ts)76 void GoogleTestHandlerAdapter::OnTestSuiteEnd(const ::testing::TestSuite& ts) {
77 handler_.TestSuiteEnd({ts.name(), ts.test_to_run_count()});
78 }
79
OnEnvironmentsTearDownEnd(const::testing::UnitTest &)80 void GoogleTestHandlerAdapter::OnEnvironmentsTearDownEnd(
81 const ::testing::UnitTest&) {
82 handler_.EnvironmentsTearDownEnd();
83 }
84
OnTestProgramEnd(const::testing::UnitTest & unit_test)85 void GoogleTestHandlerAdapter::OnTestProgramEnd(
86 const ::testing::UnitTest& unit_test) {
87 handler_.TestProgramEnd({unit_test.test_to_run_count(),
88 unit_test.test_suite_to_run_count(),
89 {unit_test.successful_test_count(),
90 unit_test.failed_test_count(),
91 unit_test.skipped_test_count(),
92 unit_test.disabled_test_count()}});
93 }
94
95 } // namespace pw::unit_test
96