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 9eee2ff16fd12cbc1d5a78154323185c6f926839 Author: PengZheng <[email protected]> AuthorDate: Mon Jun 26 21:41:47 2023 +0800 Add initial support for uncompressed bundle. --- .../gtest/src/CelixFrameworkUtilsTestSuite.cc | 32 ++++++++++++++++++---- libs/framework/src/celix_framework_utils.c | 22 +++++++++++---- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/libs/framework/gtest/src/CelixFrameworkUtilsTestSuite.cc b/libs/framework/gtest/src/CelixFrameworkUtilsTestSuite.cc index 1dc59cef..667ff309 100644 --- a/libs/framework/gtest/src/CelixFrameworkUtilsTestSuite.cc +++ b/libs/framework/gtest/src/CelixFrameworkUtilsTestSuite.cc @@ -20,12 +20,16 @@ #include <gtest/gtest.h> #include <dirent.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> #include "celix/FrameworkFactory.h" #include "celix/FrameworkUtils.h" -#include "celix_framework_utils_private.h" #include "celix_file_utils.h" +#include "celix_framework_utils_private.h" /** * Tests for the C and C++ framework utils functions which can be found in @@ -84,11 +88,6 @@ TEST_F(CelixFrameworkUtilsTestSuite, ExtractBundlePathTest) { status = celix_framework_utils_extractBundle(framework->getCFramework(), "non-existing.zip", testExtractDir); //note nullptr framwork is allowed, fallback to global logger. EXPECT_NE(status, CELIX_SUCCESS); - - //invalid bundle path -> no extraction - status = celix_framework_utils_extractBundle(framework->getCFramework(), "./", testExtractDir); //note nullptr framwork is allowed, fallback to global logger. - EXPECT_NE(status, CELIX_SUCCESS); - //invalid url prefix -> no extraction std::string path = std::string{"bla://"} + SIMPLE_TEST_BUNDLE1_LOCATION; status = celix_framework_utils_extractBundle(framework->getCFramework(), path.c_str(), testExtractDir); @@ -118,6 +117,27 @@ TEST_F(CelixFrameworkUtilsTestSuite, ExtractBundlePathTest) { celix_utils_deleteDirectory(testExtractDir, nullptr); } +TEST_F(CelixFrameworkUtilsTestSuite, 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)); + + //valid bundle path -> install a symbolic link + auto status = celix_framework_utils_extractBundle(framework->getCFramework(), testExtractDir, testLinkDir); + EXPECT_EQ(status, CELIX_SUCCESS); + struct stat st1, st2, st3; + EXPECT_EQ(0, lstat(testLinkDir, &st1)); + EXPECT_TRUE(S_ISLNK(st1.st_mode)); + EXPECT_EQ(0, stat(testLinkDir, &st2)); + EXPECT_EQ(0, stat(testExtractDir, &st3)); + EXPECT_EQ(0, memcmp(&st2, &st3, sizeof(struct stat))); + + celix_utils_deleteDirectory(testExtractDir, nullptr); + celix_utils_deleteDirectory(testLinkDir, nullptr); +} + TEST_F(CelixFrameworkUtilsTestSuite, ExtractEmbeddedBundleTest) { const char* testExtractDir = "extractEmbeddedBundleTestDir"; celix_utils_deleteDirectory(testExtractDir, nullptr); diff --git a/libs/framework/src/celix_framework_utils.c b/libs/framework/src/celix_framework_utils.c index 8f288227..18f1d0c8 100644 --- a/libs/framework/src/celix_framework_utils.c +++ b/libs/framework/src/celix_framework_utils.c @@ -20,20 +20,21 @@ #include "celix_framework_utils.h" #include "celix_framework_utils_private.h" +#include <assert.h> +#include <dlfcn.h> #include <errno.h> -#include <string.h> #include <stdio.h> #include <stdlib.h> -#include <dlfcn.h> -#include <assert.h> +#include <string.h> +#include <unistd.h> #include "bundle_archive.h" +#include "celix_bundle_context.h" #include "celix_constants.h" +#include "celix_file_utils.h" #include "celix_log.h" #include "celix_properties.h" -#include "celix_file_utils.h" #include "celix_utils.h" -#include "celix_bundle_context.h" #include "framework_private.h" #define FILE_URL_SCHEME "file://" @@ -196,7 +197,16 @@ static celix_status_t celix_framework_utils_extractBundlePath(celix_framework_t //other errors should be caught by celix_framework_utils_isBundleUrlValid return CELIX_ENOMEM; } - celix_status_t status = celix_utils_extractZipFile(resolvedPath, extractPath, &err); + 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); + free(abs); + } else { + status = celix_utils_extractZipFile(resolvedPath, extractPath, &err); + } framework_logIfError(fw->logger, status, err, "Could not extract bundle zip file `%s` to `%s`", resolvedPath, extractPath); celix_utils_freeStringIfNotEqual(buffer, resolvedPath); return status;
