This is an automated email from the ASF dual-hosted git repository. pengzheng pushed a commit to branch feature/522-support-uncompressed-bundle in repository https://gitbox.apache.org/repos/asf/celix.git
commit eec3661cf37912f330920f4d72e61787f34093a6 Author: PengZheng <[email protected]> AuthorDate: Tue Jun 27 16:13:00 2023 +0800 Add basic unit tests for uncompressed bundle support. --- libs/error_injector/CMakeLists.txt | 1 + .../{unistd => stdlib}/CMakeLists.txt | 12 ++++++----- .../unistd_ei.h => stdlib/include/stdlib_ei.h} | 11 +++++----- .../src/unistd_ei.cc => stdlib/src/stdlib_ei.cc} | 19 ++++++++-------- libs/error_injector/unistd/CMakeLists.txt | 5 ++++- libs/error_injector/unistd/include/unistd_ei.h | 2 ++ libs/error_injector/unistd/src/unistd_ei.cc | 13 +++++++++-- libs/framework/gtest/CMakeLists.txt | 1 + .../CelixFrameworkUtilsErrorInjectionTestSuite.cc | 25 ++++++++++++++++++++++ libs/framework/src/celix_framework_utils.c | 13 ++++++++--- 10 files changed, 76 insertions(+), 26 deletions(-) diff --git a/libs/error_injector/CMakeLists.txt b/libs/error_injector/CMakeLists.txt index 73ec6176..7c508927 100644 --- a/libs/error_injector/CMakeLists.txt +++ b/libs/error_injector/CMakeLists.txt @@ -29,6 +29,7 @@ add_subdirectory(celix_properties) add_subdirectory(celix_utils) add_subdirectory(zip) add_subdirectory(stdio) +add_subdirectory(stdlib) add_subdirectory(celix_threads) add_subdirectory(eventfd) add_subdirectory(celix_bundle_ctx) diff --git a/libs/error_injector/unistd/CMakeLists.txt b/libs/error_injector/stdlib/CMakeLists.txt similarity index 72% copy from libs/error_injector/unistd/CMakeLists.txt copy to libs/error_injector/stdlib/CMakeLists.txt index 1576efda..ee50b1d1 100644 --- a/libs/error_injector/unistd/CMakeLists.txt +++ b/libs/error_injector/stdlib/CMakeLists.txt @@ -15,10 +15,12 @@ # specific language governing permissions and limitations # under the License. -add_library(unistd_ei STATIC src/unistd_ei.cc) +add_library(stdlib_ei STATIC src/stdlib_ei.cc) -target_include_directories(unistd_ei PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) -target_link_libraries(unistd_ei PUBLIC Celix::error_injector) +target_include_directories(stdlib_ei PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) +target_link_libraries(stdlib_ei PUBLIC Celix::error_injector) -target_link_options(unistd_ei INTERFACE LINKER:--wrap,getcwd) -add_library(Celix::unistd_ei ALIAS unistd_ei) +target_link_options(stdlib_ei INTERFACE + LINKER:--wrap,realpath + ) +add_library(Celix::stdlib_ei ALIAS stdlib_ei) diff --git a/libs/error_injector/unistd/include/unistd_ei.h b/libs/error_injector/stdlib/include/stdlib_ei.h similarity index 86% copy from libs/error_injector/unistd/include/unistd_ei.h copy to libs/error_injector/stdlib/include/stdlib_ei.h index b10f6e2c..9ac396f2 100644 --- a/libs/error_injector/unistd/include/unistd_ei.h +++ b/libs/error_injector/stdlib/include/stdlib_ei.h @@ -17,19 +17,18 @@ under the License. */ -#ifndef CELIX_UNISTD_EI_H -#define CELIX_UNISTD_EI_H +#ifndef CELIX_STDLIB_EI_H +#define CELIX_STDLIB_EI_H #ifdef __cplusplus extern "C" { #endif -#include <unistd.h> - #include "celix_error_injector.h" +#include <stdlib.h> -CELIX_EI_DECLARE(getcwd, char*); +CELIX_EI_DECLARE(realpath, char*); #ifdef __cplusplus } #endif -#endif // CELIX_UNISTD_EI_H +#endif //CELIX_STDLIB_EI_H diff --git a/libs/error_injector/unistd/src/unistd_ei.cc b/libs/error_injector/stdlib/src/stdlib_ei.cc similarity index 72% copy from libs/error_injector/unistd/src/unistd_ei.cc copy to libs/error_injector/stdlib/src/stdlib_ei.cc index e1c2680e..07ef02fa 100644 --- a/libs/error_injector/unistd/src/unistd_ei.cc +++ b/libs/error_injector/stdlib/src/stdlib_ei.cc @@ -17,17 +17,18 @@ under the License. */ -#include "unistd_ei.h" - +#include "stdlib_ei.h" #include <errno.h> extern "C" { -char* __real_getcwd(char* buf, size_t size); -CELIX_EI_DEFINE(getcwd, char*) -char* __wrap_getcwd(char* buf, size_t size) { - errno = ENOMEM; - CELIX_EI_IMPL(getcwd); + +char *__real_realpath(const char *__restrict __name, char *__restrict __resolved); +CELIX_EI_DEFINE(realpath, char*) +char *__wrap_realpath(const char *__restrict __name, char *__restrict __resolved) { + errno = EACCES; + CELIX_EI_IMPL(realpath); errno = 0; - return __real_getcwd(buf, size); -} + return __real_realpath(__name, __resolved); } + +} \ No newline at end of file diff --git a/libs/error_injector/unistd/CMakeLists.txt b/libs/error_injector/unistd/CMakeLists.txt index 1576efda..1835afcf 100644 --- a/libs/error_injector/unistd/CMakeLists.txt +++ b/libs/error_injector/unistd/CMakeLists.txt @@ -20,5 +20,8 @@ add_library(unistd_ei STATIC src/unistd_ei.cc) target_include_directories(unistd_ei PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) target_link_libraries(unistd_ei PUBLIC Celix::error_injector) -target_link_options(unistd_ei INTERFACE LINKER:--wrap,getcwd) +target_link_options(unistd_ei INTERFACE + LINKER:--wrap,getcwd + LINKER:--wrap,symlink + ) add_library(Celix::unistd_ei ALIAS unistd_ei) diff --git a/libs/error_injector/unistd/include/unistd_ei.h b/libs/error_injector/unistd/include/unistd_ei.h index b10f6e2c..8ded930c 100644 --- a/libs/error_injector/unistd/include/unistd_ei.h +++ b/libs/error_injector/unistd/include/unistd_ei.h @@ -29,6 +29,8 @@ extern "C" { CELIX_EI_DECLARE(getcwd, char*); +CELIX_EI_DECLARE(symlink, int); + #ifdef __cplusplus } #endif diff --git a/libs/error_injector/unistd/src/unistd_ei.cc b/libs/error_injector/unistd/src/unistd_ei.cc index e1c2680e..22673e99 100644 --- a/libs/error_injector/unistd/src/unistd_ei.cc +++ b/libs/error_injector/unistd/src/unistd_ei.cc @@ -22,12 +22,21 @@ #include <errno.h> extern "C" { -char* __real_getcwd(char* buf, size_t size); +char *__real_getcwd(char *buf, size_t size); CELIX_EI_DEFINE(getcwd, char*) -char* __wrap_getcwd(char* buf, size_t size) { +char *__wrap_getcwd(char *buf, size_t size) { errno = ENOMEM; CELIX_EI_IMPL(getcwd); errno = 0; return __real_getcwd(buf, size); } + +int __real_symlink(const char *target, const char *linkpath); +CELIX_EI_DEFINE(symlink, int) +int __wrap_symlink(const char *target, const char *linkpath) { + errno = EIO; + CELIX_EI_IMPL(symlink); + errno = 0; + return __real_symlink(target, linkpath); +} } diff --git a/libs/framework/gtest/CMakeLists.txt b/libs/framework/gtest/CMakeLists.txt index e84fdd0e..05491882 100644 --- a/libs/framework/gtest/CMakeLists.txt +++ b/libs/framework/gtest/CMakeLists.txt @@ -146,6 +146,7 @@ if (LINKER_WRAP_SUPPORTED) Celix::unistd_ei Celix::hash_map_ei Celix::properties_ei + Celix::stdlib_ei GTest::gtest GTest::gtest_main ) diff --git a/libs/framework/gtest/src/CelixFrameworkUtilsErrorInjectionTestSuite.cc b/libs/framework/gtest/src/CelixFrameworkUtilsErrorInjectionTestSuite.cc index 0be4f22d..58ab0901 100644 --- a/libs/framework/gtest/src/CelixFrameworkUtilsErrorInjectionTestSuite.cc +++ b/libs/framework/gtest/src/CelixFrameworkUtilsErrorInjectionTestSuite.cc @@ -30,6 +30,8 @@ #include "asprintf_ei.h" #include "celix_utils_ei.h" #include "dlfcn_ei.h" +#include "stdlib_ei.h" +#include "unistd_ei.h" class CelixFrameworkUtilsErrorInjectionTestSuite : public ::testing::Test { public: @@ -45,6 +47,8 @@ public: celix_ei_expect_dlopen(nullptr, 0, nullptr); celix_ei_expect_dlerror(nullptr, 0, nullptr); celix_ei_expect_asprintf(nullptr, 0, 0); + celix_ei_expect_realpath(nullptr, 0, nullptr); + celix_ei_expect_symlink(nullptr, 0, 0); } std::shared_ptr<celix::Framework> framework{}; }; @@ -87,6 +91,27 @@ TEST_F(CelixFrameworkUtilsErrorInjectionTestSuite, testExtractFileBundle) { celix_utils_deleteDirectory(testExtractDir, nullptr); } +TEST_F(CelixFrameworkUtilsErrorInjectionTestSuite, ExtractUncompressedBundleTest) { + const char* testExtractDir = "extractBundleTestDir"; + const char* testLinkDir = "linkBundleTestDir"; + celix_utils_deleteDirectory(testExtractDir, nullptr); + celix_utils_deleteDirectory(testLinkDir, nullptr); + EXPECT_EQ(CELIX_SUCCESS, celix_utils_extractZipFile(SIMPLE_TEST_BUNDLE1_LOCATION, testExtractDir, nullptr)); + + // failed to get realpath of bundle + celix_ei_expect_realpath((void*)celix_framework_utils_extractBundle, 1, nullptr); + auto status = celix_framework_utils_extractBundle(framework->getCFramework(), testExtractDir, testLinkDir); + EXPECT_EQ(status, CELIX_ERROR_MAKE(CELIX_FACILITY_CERRNO,EACCES)); + + // failed to install symbolic link + celix_ei_expect_symlink((void*) celix_framework_utils_extractBundle, 1, -1); + status = celix_framework_utils_extractBundle(framework->getCFramework(), testExtractDir, testLinkDir); + EXPECT_EQ(status, CELIX_ERROR_MAKE(CELIX_FACILITY_CERRNO,EIO)); + + celix_utils_deleteDirectory(testExtractDir, nullptr); + celix_utils_deleteDirectory(testLinkDir, nullptr); +} + TEST_F(CelixFrameworkUtilsErrorInjectionTestSuite, CheckBundleAge) { struct timespec now = {0, 0}; celix_ei_expect_celix_utils_writeOrCreateString(CELIX_EI_UNKNOWN_CALLER, 0, nullptr, 1); diff --git a/libs/framework/src/celix_framework_utils.c b/libs/framework/src/celix_framework_utils.c index 18f1d0c8..a8489bb0 100644 --- a/libs/framework/src/celix_framework_utils.c +++ b/libs/framework/src/celix_framework_utils.c @@ -199,10 +199,17 @@ static celix_status_t celix_framework_utils_extractBundlePath(celix_framework_t } celix_status_t status = CELIX_SUCCESS; if (celix_utils_directoryExists(resolvedPath)) { - //TODO: add tests char *abs = realpath(resolvedPath, NULL); - assert(abs != NULL); - symlink(abs, extractPath); + if (abs == NULL) { + status = CELIX_ERROR_MAKE(CELIX_FACILITY_CERRNO,errno); + err = "Could not get real path for bundle"; + } + if (status == CELIX_SUCCESS) { + if(symlink(abs, extractPath) == -1) { + status = CELIX_ERROR_MAKE(CELIX_FACILITY_CERRNO,errno); + err = "Could not add symbolic link"; + } + } free(abs); } else { status = celix_utils_extractZipFile(resolvedPath, extractPath, &err);
