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);

Reply via email to