You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2025/01/04 16:51:28 UTC
(celix) 01/02: gh-685: Add dirent_ei and use dirent_ei in bnd cache test
This is an automated email from the ASF dual-hosted git repository.
pnoltes pushed a commit to branch feature/685-remove-bundle-revision
in repository https://gitbox.apache.org/repos/asf/celix.git
commit 60a5d6a707c8cf54a1968d790ac923597b15164a
Author: Pepijn Noltes <pn...@apache.org>
AuthorDate: Sat Jan 4 17:35:50 2025 +0100
gh-685: Add dirent_ei and use dirent_ei in bnd cache test
---
libs/error_injector/CMakeLists.txt | 1 +
libs/error_injector/dirent/CMakeLists.txt | 25 ++++++++++++++++
libs/error_injector/dirent/include/dirent_ei.h | 34 ++++++++++++++++++++++
libs/error_injector/dirent/src/dirent_ei.cc | 34 ++++++++++++++++++++++
libs/framework/gtest/CMakeLists.txt | 1 +
.../src/CelixBundleCacheErrorInjectionTestSuite.cc | 12 +++++++-
libs/framework/src/celix_bundle_cache.c | 12 ++++----
7 files changed, 111 insertions(+), 8 deletions(-)
diff --git a/libs/error_injector/CMakeLists.txt b/libs/error_injector/CMakeLists.txt
index 76a9f99f7..1fb2048f1 100644
--- a/libs/error_injector/CMakeLists.txt
+++ b/libs/error_injector/CMakeLists.txt
@@ -37,6 +37,7 @@ add_subdirectory(sys_shm)
add_subdirectory(socket)
add_subdirectory(pthread)
add_subdirectory(unistd)
+add_subdirectory(dirent)
celix_subproject(ERROR_INJECTOR_MDNSRESPONDER "Option to enable building the mdnsresponder error injector" OFF)
if (ERROR_INJECTOR_MDNSRESPONDER)
diff --git a/libs/error_injector/dirent/CMakeLists.txt b/libs/error_injector/dirent/CMakeLists.txt
new file mode 100644
index 000000000..8d777d026
--- /dev/null
+++ b/libs/error_injector/dirent/CMakeLists.txt
@@ -0,0 +1,25 @@
+# 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.
+
+add_library(dirent_ei STATIC src/dirent_ei.cc)
+
+target_include_directories(dirent_ei PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)
+target_link_libraries(dirent_ei PUBLIC Celix::error_injector)
+target_link_options(dirent_ei INTERFACE
+ LINKER:--wrap,opendir
+ )
+add_library(Celix::dirent_ei ALIAS dirent_ei)
diff --git a/libs/error_injector/dirent/include/dirent_ei.h b/libs/error_injector/dirent/include/dirent_ei.h
new file mode 100644
index 000000000..26e89c428
--- /dev/null
+++ b/libs/error_injector/dirent/include/dirent_ei.h
@@ -0,0 +1,34 @@
+/*
+ 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.
+ */
+
+#ifndef CELIX_DIRENT_EI_H
+#define CELIX_DIRENT_EI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "celix_error_injector.h"
+#include <dirent.h>
+
+CELIX_EI_DECLARE(opendir, DIR*);
+
+#ifdef __cplusplus
+}
+#endif
+#endif //CELIX_DIRENT_EI_H
diff --git a/libs/error_injector/dirent/src/dirent_ei.cc b/libs/error_injector/dirent/src/dirent_ei.cc
new file mode 100644
index 000000000..26896368b
--- /dev/null
+++ b/libs/error_injector/dirent/src/dirent_ei.cc
@@ -0,0 +1,34 @@
+/*
+ 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 <errno.h>
+#include "dirent_ei.h"
+
+extern "C" {
+
+DIR* __real_opendir(const char* __name);
+CELIX_EI_DEFINE(opendir, DIR*)
+DIR* __wrap_opendir(const char* __name) {
+ errno = EMFILE;
+ CELIX_EI_IMPL(opendir);
+ errno = 0;
+ return __real_opendir(__name);
+}
+
+}
\ No newline at end of file
diff --git a/libs/framework/gtest/CMakeLists.txt b/libs/framework/gtest/CMakeLists.txt
index 3a5016756..08e0c4038 100644
--- a/libs/framework/gtest/CMakeLists.txt
+++ b/libs/framework/gtest/CMakeLists.txt
@@ -173,6 +173,7 @@ if (EI_TESTS)
Celix::hmap_ei
Celix::stdio_ei
Celix::string_ei
+ Celix::dirent_ei
GTest::gtest GTest::gtest_main
)
diff --git a/libs/framework/gtest/src/CelixBundleCacheErrorInjectionTestSuite.cc b/libs/framework/gtest/src/CelixBundleCacheErrorInjectionTestSuite.cc
index 591f11cbc..3f2e07dfe 100644
--- a/libs/framework/gtest/src/CelixBundleCacheErrorInjectionTestSuite.cc
+++ b/libs/framework/gtest/src/CelixBundleCacheErrorInjectionTestSuite.cc
@@ -37,6 +37,7 @@
#include "malloc_ei.h"
#include "celix_bundle_manifest.h"
#include "unistd_ei.h"
+#include "dirent_ei.h"
class CelixBundleCacheErrorInjectionTestSuite : public ::testing::Test {
public:
@@ -55,15 +56,18 @@ class CelixBundleCacheErrorInjectionTestSuite : public ::testing::Test {
celix_ei_expect_celix_stringHashMap_create(nullptr, 0, nullptr);
celix_ei_expect_malloc(nullptr, 0, nullptr);
celix_ei_expect_calloc(nullptr, 0, nullptr);
+ celix_ei_expect_opendir(nullptr, 0, nullptr);
celix_ei_expect_celix_properties_load(nullptr, 0, CELIX_SUCCESS);
celix_frameworkLogger_destroy(fw.logger);
celix_properties_destroy(fw.configurationMap);
}
+
void createCache(celix_bundle_cache_t** cache) {
celix_properties_setBool(fw.configurationMap, CELIX_FRAMEWORK_CACHE_USE_TMP_DIR, true);
EXPECT_EQ(CELIX_SUCCESS, celix_bundleCache_create(&fw, &fw.cache));
*cache = fw.cache;
}
+
struct celix_framework fw {};
};
@@ -103,13 +107,19 @@ TEST_F(CelixBundleCacheErrorInjectionTestSuite, CacheDeleteErrorTest) {
TEST_F(CelixBundleCacheErrorInjectionTestSuite, ArchiveCreateErrorTest) {
celix_bundle_cache_t* cache = nullptr;
+ long bndId;
createCache(&cache);
+ //note needs to be the first ei test, to ensure that the lookup bundle id map is not yet loaded.
+ celix_ei_expect_opendir((void*)celix_bundleCache_findBundleIdForLocation, 1, nullptr);
+ EXPECT_EQ(celix_bundleCache_findBundleIdForLocation(cache, SIMPLE_TEST_BUNDLE1_LOCATION, &bndId),
+ CELIX_FILE_IO_EXCEPTION);
+
celix_bundle_archive_t* archive = nullptr;
celix_ei_expect_celix_utils_writeOrCreateString((void*)celix_bundleCache_createArchive, 0, nullptr);
EXPECT_EQ(CELIX_ENOMEM, celix_bundleCache_createArchive(cache, 1, SIMPLE_TEST_BUNDLE1_LOCATION, &archive));
EXPECT_EQ(nullptr, archive);
- long bndId;
+
auto status = celix_bundleCache_findBundleIdForLocation(cache, SIMPLE_TEST_BUNDLE1_LOCATION, &bndId);
EXPECT_EQ(CELIX_SUCCESS, status);
EXPECT_EQ(-1, bndId);
diff --git a/libs/framework/src/celix_bundle_cache.c b/libs/framework/src/celix_bundle_cache.c
index b63f16473..29968c682 100644
--- a/libs/framework/src/celix_bundle_cache.c
+++ b/libs/framework/src/celix_bundle_cache.c
@@ -55,13 +55,13 @@ struct celix_bundle_cache {
bool locationToBundleIdLookupMapLoaded; //true if the locationToBundleIdLookupMap is loaded from disk
};
-static const char* bundleCache_progamName() {
+static const char* celix_bundleCache_programName() {
#if defined(__APPLE__) || defined(__FreeBSD__)
return getprogname();
#elif defined(_GNU_SOURCE)
return program_invocation_short_name;
#else
- return "";
+ return NULL;
#endif
}
@@ -109,10 +109,8 @@ celix_status_t celix_bundleCache_create(celix_framework_t* fw, celix_bundle_cach
if (useTmpDir) {
//Using /tmp dir for cache, so that multiple frameworks can be launched
//instead of cacheDir = ".cache";
- const char* pg = bundleCache_progamName();
- if (pg == NULL) {
- pg = "";
- }
+ const char* pg = celix_bundleCache_programName();
+ pg = !pg ? "no-program-name" : pg;
asprintf(&cache->cacheDir, "/tmp/celix-cache-%s-%s", pg, celix_framework_getUUID(fw));
} else {
const char* cacheDir = celix_bundleCache_cacheDirPath(fw);
@@ -220,7 +218,7 @@ static celix_status_t celix_bundleCache_updateIdForLocationLookupMap(celix_bundl
celix_autoptr(DIR) dir = opendir(cache->cacheDir);
if (dir == NULL) {
fw_logCode(cache->fw->logger, CELIX_LOG_LEVEL_ERROR, CELIX_BUNDLE_EXCEPTION,
- "Cannot open bundle cache directory %s", cache->cacheDir);
+ "Cannot open bundle cache directory %s: %s", cache->cacheDir, strerror(errno));
return CELIX_FILE_IO_EXCEPTION;
}
char archiveRootBuffer[CELIX_DEFAULT_STRING_CREATE_BUFFER_SIZE];