| // Copyright 2022 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| #include <tuple> |
| |
| #include "gtest/gtest.h" |
| #include "pw_unit_test/internal/rpc_event_handler.h" |
| #include "pw_unit_test/unit_test_service.h" |
| |
| namespace pw::unit_test::internal { |
| |
| RpcEventHandler::RpcEventHandler(UnitTestService& service) : service_(service) { |
| // Initialize GoogleTest and disable the default result printer. |
| testing::InitGoogleTest(); |
| auto unit_test = testing::UnitTest::GetInstance(); |
| auto default_listener = unit_test->listeners().default_result_printer(); |
| unit_test->listeners().Release(default_listener); |
| delete default_listener; |
| } |
| |
| void RpcEventHandler::ExecuteTests(span<std::string_view> suites_to_run) { |
| if (!suites_to_run.empty()) { |
| PW_LOG_WARN( |
| "GoogleTest backend does not support test suite filtering. Running all " |
| "suites."); |
| } |
| if (service_.verbose_) { |
| PW_LOG_WARN( |
| "GoogleTest backend does not support reporting passed expectations."); |
| } |
| |
| auto unit_test = testing::UnitTest::GetInstance(); |
| unit_test->listeners().Append(this); |
| |
| std::ignore = RUN_ALL_TESTS(); |
| |
| unit_test->listeners().Release(this); |
| } |
| |
| void RpcEventHandler::OnTestProgramStart(const testing::UnitTest&) { |
| service_.WriteTestRunStart(); |
| } |
| |
| void RpcEventHandler::OnTestProgramEnd(const testing::UnitTest& unit_test) { |
| RunTestsSummary run_tests_summary{ |
| .passed_tests = unit_test.successful_test_count(), |
| .failed_tests = unit_test.failed_test_count(), |
| .skipped_tests = unit_test.skipped_test_count(), |
| .disabled_tests = unit_test.disabled_test_count(), |
| }; |
| service_.WriteTestRunEnd(run_tests_summary); |
| } |
| |
| void RpcEventHandler::OnTestStart(const testing::TestInfo& test_info) { |
| TestCase test_case{ |
| .suite_name = test_info.test_suite_name(), |
| .test_name = test_info.name(), |
| .file_name = test_info.file(), |
| }; |
| service_.WriteTestCaseStart(test_case); |
| } |
| |
| void RpcEventHandler::OnTestEnd(const testing::TestInfo& test_info) { |
| TestResult result; |
| if (test_info.result()->Passed()) { |
| result = TestResult::kSuccess; |
| } else if (test_info.result()->Skipped()) { |
| result = TestResult::kSkipped; |
| } else { |
| result = TestResult::kFailure; |
| } |
| |
| service_.WriteTestCaseEnd(result); |
| } |
| |
| void RpcEventHandler::OnTestPartResult(const testing::TestPartResult& result) { |
| TestExpectation expectation{ |
| .expression = "", |
| .evaluated_expression = result.summary(), |
| .line_number = result.line_number(), |
| .success = result.passed(), |
| }; |
| service_.WriteTestCaseExpectation(expectation); |
| } |
| |
| void RpcEventHandler::OnTestDisabled(const testing::TestInfo& test_info) { |
| TestCase test_case{ |
| .suite_name = test_info.test_suite_name(), |
| .test_name = test_info.name(), |
| .file_name = test_info.file(), |
| }; |
| service_.WriteTestCaseDisabled(test_case); |
| } |
| |
| } // namespace pw::unit_test::internal |