This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch feature/celix_err in repository https://gitbox.apache.org/repos/asf/celix.git
commit b3271ef634a3214362e488a24e7bc98c79522b1f Author: Pepijn Noltes <[email protected]> AuthorDate: Tue May 2 17:04:58 2023 +0200 Add celix_err test suite with error injection --- libs/utils/gtest/CMakeLists.txt | 6 +- libs/utils/gtest/src/ErrErrorInjectionTestSuite.cc | 76 ++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/libs/utils/gtest/CMakeLists.txt b/libs/utils/gtest/CMakeLists.txt index 79c14238..b006372e 100644 --- a/libs/utils/gtest/CMakeLists.txt +++ b/libs/utils/gtest/CMakeLists.txt @@ -84,8 +84,12 @@ if (LINKER_WRAP_SUPPORTED) src/FileUtilsErrorInjectionTestSuite.cc src/ConvertUtilsErrorInjectionTestSuite.cc src/IpUtilsErrorInjectionTestSuite.cc + src/ErrErrorInjectionTestSuite.cc ) - target_link_libraries(test_utils_with_ei PRIVATE Celix::zip_ei Celix::stdio_ei Celix::stat_ei Celix::fts_ei Celix::utils_obj Celix::utils_ei Celix::ifaddrs_ei GTest::gtest GTest::gtest_main) + target_link_libraries(test_utils_with_ei PRIVATE + Celix::zip_ei Celix::stdio_ei Celix::stat_ei Celix::fts_ei Celix::utils_obj Celix::utils_ei + Celix::ifaddrs_ei Celix::threads_ei Celix::malloc_ei + GTest::gtest GTest::gtest_main) target_include_directories(test_utils_with_ei PRIVATE ../src) #for version_private (needs refactoring of test) celix_deprecated_utils_headers(test_utils_with_ei) add_dependencies(test_utils_with_ei test_utils_resources) diff --git a/libs/utils/gtest/src/ErrErrorInjectionTestSuite.cc b/libs/utils/gtest/src/ErrErrorInjectionTestSuite.cc new file mode 100644 index 00000000..402199b4 --- /dev/null +++ b/libs/utils/gtest/src/ErrErrorInjectionTestSuite.cc @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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 <gtest/gtest.h> + +#include <cstdio> +#include <fstream> + +#include "celix_err.h" +#include "celix_threads_ei.h" +#include "malloc_ei.h" + +class ErrErrorInjectionTestSuite : public ::testing::Test { +public: + static constexpr const char* CAPTURE_FILENAME = "capture_stderr.txt"; + + ErrErrorInjectionTestSuite() { + freopen(CAPTURE_FILENAME, "w", stderr); + } + ~ErrErrorInjectionTestSuite() noexcept override { + celix_ei_expect_celix_tss_set(nullptr, 0, CELIX_SUCCESS); + celix_ei_expect_malloc(nullptr, 0, CELIX_SUCCESS); + } +}; + +#ifndef CELIX_ERR_USE_THREAD_LOCAL +TEST_F(ErrErrorInjectionTestSuite, PushErrorWithTssSetFailingTest) { + //Given a primed error injection for celix_tss_set + celix_ei_expect_celix_tss_set((void*)celix_err_push, 1, CELIX_ILLEGAL_STATE); + + //When an error is pushed + celix_err_push("error message"); + + fclose(stderr); + std::ifstream tempFile{CAPTURE_FILENAME}; + std::string fileContents((std::istreambuf_iterator<char>(tempFile)), + std::istreambuf_iterator<char>()); + tempFile.close(); + + EXPECT_TRUE(strstr(fileContents.c_str(), "Failed to set thread specific storage for celix_err") != nullptr) << + "Expected error message not found in: " << fileContents; +} + +TEST_F(ErrErrorInjectionTestSuite, PushErrorWithMallocFailingTest) { + //Given a primed error injection for malloc + celix_ei_expect_malloc(CELIX_EI_UNKNOWN_CALLER, 1, nullptr); + + //When an error is pushed + celix_err_push("error message"); + + fclose(stderr); + std::ifstream tempFile{CAPTURE_FILENAME}; + std::string fileContents((std::istreambuf_iterator<char>(tempFile)), + std::istreambuf_iterator<char>()); + tempFile.close(); + + EXPECT_TRUE(strstr(fileContents.c_str(), "Failed to allocate memory for celix_err") != nullptr) << + "Expected error message not found in: " << fileContents; +} +#endif
