This is an automated email from the ASF dual-hosted git repository.
pengzheng pushed a commit to branch feature/527-manifest-improvement
in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to
refs/heads/feature/527-manifest-improvement by this push:
new 7fc570f5 Add more tests for manifest_create and manifest_clone.
7fc570f5 is described below
commit 7fc570f5261b8529a2aa77a28e4f94c4aaeb8778
Author: PengZheng <[email protected]>
AuthorDate: Mon Aug 14 21:37:08 2023 +0800
Add more tests for manifest_create and manifest_clone.
---
libs/framework/gtest/CMakeLists.txt | 1 +
.../gtest/src/ManifestErrorInjectionTestSuite.cc | 56 +++++++++++++++++++++-
libs/framework/gtest/src/ManifestTestSuite.cc | 17 ++++---
libs/framework/src/manifest.c | 36 ++++++++++----
libs/utils/error_injector/CMakeLists.txt | 3 +-
.../error_injector/{ => hash_map}/CMakeLists.txt | 17 +++----
.../error_injector/hash_map/include/hmap_ei.h} | 34 +++++--------
.../error_injector/hash_map/src/hmap_ei.cc} | 31 ++++--------
8 files changed, 121 insertions(+), 74 deletions(-)
diff --git a/libs/framework/gtest/CMakeLists.txt
b/libs/framework/gtest/CMakeLists.txt
index 49214cb1..b449defd 100644
--- a/libs/framework/gtest/CMakeLists.txt
+++ b/libs/framework/gtest/CMakeLists.txt
@@ -161,6 +161,7 @@ if (LINKER_WRAP_SUPPORTED)
Celix::stdlib_ei
Celix::stat_ei
Celix::threads_ei
+ Celix::hmap_ei
GTest::gtest GTest::gtest_main
)
diff --git a/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
b/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
index be809a47..62a18e19 100644
--- a/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
+++ b/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
@@ -22,17 +22,25 @@
#include <stdio.h>
#include "celix_err.h"
+#include "celix_properties_ei.h"
+#include "celix_stdio_cleanup.h"
+#include "hmap_ei.h"
#include "malloc_ei.h"
#include "manifest.h"
class ManifestErrorInjectionTestSuite : public ::testing::Test {
public:
ManifestErrorInjectionTestSuite() {
- celix_ei_expect_malloc(nullptr, 0, nullptr);
}
~ManifestErrorInjectionTestSuite() override {
+ teardownErrorInjectors();
+ }
+ void teardownErrorInjectors() {
celix_ei_expect_malloc(nullptr, 0, nullptr);
+ celix_ei_expect_celix_properties_create(nullptr, 0, nullptr);
+ celix_ei_expect_celix_properties_copy(nullptr, 0, nullptr);
+ celix_ei_expect_hash_map_create(nullptr, 0, nullptr);
}
};
@@ -41,5 +49,51 @@ TEST_F(ManifestErrorInjectionTestSuite,
NoMemoryForManifestCreateTest) {
celix_ei_expect_malloc((void*)manifest_create, 0, nullptr);
celix_status_t status = manifest_create(&manifest);
EXPECT_EQ(CELIX_ENOMEM, status);
+ EXPECT_EQ(nullptr, manifest);
+ celix_err_printErrors(stdout, "Errors are expected[", "]\n");
+ teardownErrorInjectors();
+
+ manifest = nullptr;
+ celix_ei_expect_celix_properties_create((void*)manifest_create, 0,
nullptr);
+ status = manifest_create(&manifest);
+ EXPECT_EQ(CELIX_ENOMEM, status);
+ EXPECT_EQ(nullptr, manifest);
celix_err_printErrors(stdout, "Errors are expected[", "]\n");
+ teardownErrorInjectors();
+
+ manifest = nullptr;
+ celix_ei_expect_hash_map_create((void*)manifest_create, 0, nullptr);
+ status = manifest_create(&manifest);
+ EXPECT_EQ(CELIX_ENOMEM, status);
+ EXPECT_EQ(nullptr, manifest);
+ celix_err_printErrors(stdout, "Errors are expected[", "]\n");
+ teardownErrorInjectors();
+}
+
+TEST_F(ManifestErrorInjectionTestSuite, NoMemoryForManifestCloneTest) {
+ std::string content = "Manifest-Version: 1.0\n"
+ "DeploymentPackage-Icon: %icon\n"
+ "DeploymentPackage-SymbolicName: com.third._3d\n"
+ "DeploymentPacakge-Version: 1.2.3.build22032005\n"
+ "\n"
+ "Name: bundles/3dlib.jar\n"
+ "SHA1-Digest: MOez1l4gXHBo8ycYdAxstK3UvEg=\n"
+ "Bundle-SymbolicName: com.third._3d\n"
+ "Bundle-Version: 2.3.1\n"
+ "\n"
+ "Name: bundles/3dnative.jar\n"
+ "SHA1-Digest: N8Ow2UY4yjnHZv5zeq2I1Uv/+uE=\n"
+ "Bundle-SymbolicName: com.third._3d.native\n"
+ "Bundle-Version: 1.5.3\n"
+ "\n";
+ celix_autoptr(FILE) manifestFile = fmemopen((void*)content.c_str(),
content.size(), "r");
+ celix_auto(manifest_pt) manifest = nullptr;
+ manifest_create(&manifest);
+ EXPECT_EQ(CELIX_SUCCESS, manifest_readFromStream(manifest, manifestFile));
+ celix_ei_expect_malloc((void*)manifest_create, 0, nullptr);
+ EXPECT_EQ(nullptr, manifest_clone(manifest));
+ teardownErrorInjectors();
+
+ celix_ei_expect_celix_properties_copy((void*)manifest_clone, 0, nullptr);
+ EXPECT_EQ(nullptr, manifest_clone(manifest));
}
\ No newline at end of file
diff --git a/libs/framework/gtest/src/ManifestTestSuite.cc
b/libs/framework/gtest/src/ManifestTestSuite.cc
index 401dfd04..2b806137 100644
--- a/libs/framework/gtest/src/ManifestTestSuite.cc
+++ b/libs/framework/gtest/src/ManifestTestSuite.cc
@@ -20,6 +20,11 @@
#include <gtest/gtest.h>
#include <string>
+#include <stdio.h>
+#if CELIX_UTILS_NO_MEMSTREAM_AVAILABLE
+#include "open_memstream.h"
+#include "fmemopen.h"
+#endif
#include "celix_stdio_cleanup.h"
#include "manifest.h"
@@ -71,9 +76,7 @@ TEST_F(ManifestTestSuite,
ReadManifestWithoutNameSectionsTest) {
"DeploymentPackage-SymbolicName: com.third._3d\n"
"DeploymentPacakge-Version: 1.2.3.build22032005\n"
"DeploymentPackage-Copyright: ACME Inc. (c) 2003\n";
- celix_autoptr(FILE) manifestFile = tmpfile();
- EXPECT_EQ(content.size(), fwrite(content.c_str(), 1, content.size(),
manifestFile));
- rewind(manifestFile);
+ celix_autoptr(FILE) manifestFile = fmemopen((void*)content.c_str(),
content.size(), "r");
EXPECT_EQ(CELIX_SUCCESS, manifest_readFromStream(manifest, manifestFile));
const celix_properties_t* mainAttr = manifest_getMainAttributes(manifest);
EXPECT_EQ(4, celix_properties_size(mainAttr));
@@ -103,9 +106,7 @@ TEST_F(ManifestTestSuite, ReadManifestWithNameSectionsTest)
{
"Bundle-SymbolicName: com.third._3d.native\n"
"Bundle-Version: 1.5.3\n"
"\n";
- celix_autoptr(FILE) manifestFile = tmpfile();
- EXPECT_EQ(content.size(), fwrite(content.c_str(), 1, content.size(),
manifestFile));
- rewind(manifestFile);
+ celix_autoptr(FILE) manifestFile = fmemopen((void*)content.c_str(),
content.size(), "r");
EXPECT_EQ(CELIX_SUCCESS, manifest_readFromStream(manifest, manifestFile));
const celix_properties_t* mainAttr = manifest_getMainAttributes(manifest);
EXPECT_EQ(4, celix_properties_size(mainAttr));
@@ -155,9 +156,7 @@ TEST_F(ManifestTestSuite, CloneTest) {
"Bundle-SymbolicName: com.third._3d.native\n"
"Bundle-Version: 1.5.3\n"
"\n";
- celix_autoptr(FILE) manifestFile = tmpfile();
- EXPECT_EQ(content.size(), fwrite(content.c_str(), 1, content.size(),
manifestFile));
- rewind(manifestFile);
+ celix_autoptr(FILE) manifestFile = fmemopen((void*)content.c_str(),
content.size(), "r");
EXPECT_EQ(CELIX_SUCCESS, manifest_readFromStream(manifest, manifestFile));
celix_auto(manifest_pt) clone = manifest_clone(manifest);
CheckManifestEqual(manifest, clone);
diff --git a/libs/framework/src/manifest.c b/libs/framework/src/manifest.c
index 21747f8d..5bf231d8 100644
--- a/libs/framework/src/manifest.c
+++ b/libs/framework/src/manifest.c
@@ -31,6 +31,7 @@
#include "celix_err.h"
#include "celix_errno.h"
#include "celix_stdio_cleanup.h"
+#include "celix_stdlib_cleanup.h"
#include "manifest.h"
#include "utils.h"
@@ -40,14 +41,26 @@ static celix_status_t manifest_readAttributes(manifest_pt
manifest, properties_p
celix_status_t manifest_create(manifest_pt *manifest) {
celix_status_t status = CELIX_SUCCESS;
-
- *manifest = malloc(sizeof(**manifest));
- if (!*manifest) {
- status = CELIX_ENOMEM;
- } else {
- (*manifest)->mainAttributes = celix_properties_create();
- (*manifest)->attributes = hashMap_create(utils_stringHash, NULL,
utils_stringEquals, NULL);
- }
+ do {
+ celix_autofree manifest_pt manifestPtr = NULL;
+ manifestPtr = malloc(sizeof(**manifest));
+ if (manifestPtr == NULL) {
+ status = CELIX_ENOMEM;
+ break;
+ }
+ celix_autoptr(celix_properties_t) mainAttributes =
celix_properties_create();
+ if (mainAttributes == NULL) {
+ status = CELIX_ENOMEM;
+ break;
+ }
+ manifestPtr->attributes = hashMap_create(utils_stringHash, NULL,
utils_stringEquals, NULL);
+ if (manifestPtr->attributes == NULL) {
+ status = CELIX_ENOMEM;
+ break;
+ }
+ manifestPtr->mainAttributes = celix_steal_ptr(mainAttributes);
+ *manifest = celix_steal_ptr(manifestPtr);
+ } while(false);
if (status != CELIX_SUCCESS) {
celix_err_pushf("Cannot create manifest: %s", celix_strerror(status));
@@ -58,7 +71,7 @@ celix_status_t manifest_create(manifest_pt *manifest) {
manifest_pt manifest_clone(manifest_pt manifest) {
celix_status_t status = CELIX_SUCCESS;
- manifest_pt clone = NULL;
+ celix_auto(manifest_pt) clone = NULL;
status = manifest_create(&clone);
if (status == CELIX_SUCCESS) {
const char* key = NULL;
@@ -70,11 +83,14 @@ manifest_pt manifest_clone(manifest_pt manifest) {
hash_map_entry_pt entry = hashMapIterator_nextEntry(&iter);
celix_properties_t* value = hashMapEntry_getValue(entry);
celix_properties_t* cloneValue = celix_properties_copy(value);
+ if (cloneValue == NULL) {
+ return NULL;
+ }
hashMap_put(clone->attributes, strdup(hashMapEntry_getKey(entry)),
cloneValue);
}
}
- return clone;
+ return celix_steal_ptr(clone);
}
celix_status_t manifest_destroy(manifest_pt manifest) {
diff --git a/libs/utils/error_injector/CMakeLists.txt
b/libs/utils/error_injector/CMakeLists.txt
index e055e028..9c43fac7 100644
--- a/libs/utils/error_injector/CMakeLists.txt
+++ b/libs/utils/error_injector/CMakeLists.txt
@@ -22,4 +22,5 @@ add_subdirectory(celix_properties)
add_subdirectory(celix_threads)
add_subdirectory(celix_utils)
add_subdirectory(celix_version)
-add_subdirectory(zip)
\ No newline at end of file
+add_subdirectory(zip)
+add_subdirectory(hash_map)
diff --git a/libs/utils/error_injector/CMakeLists.txt
b/libs/utils/error_injector/hash_map/CMakeLists.txt
similarity index 70%
copy from libs/utils/error_injector/CMakeLists.txt
copy to libs/utils/error_injector/hash_map/CMakeLists.txt
index e055e028..f8037257 100644
--- a/libs/utils/error_injector/CMakeLists.txt
+++ b/libs/utils/error_injector/hash_map/CMakeLists.txt
@@ -15,11 +15,12 @@
# specific language governing permissions and limitations
# under the License.
-add_subdirectory(celix_array_list)
-add_subdirectory(celix_hash_map)
-add_subdirectory(celix_long_hash_map)
-add_subdirectory(celix_properties)
-add_subdirectory(celix_threads)
-add_subdirectory(celix_utils)
-add_subdirectory(celix_version)
-add_subdirectory(zip)
\ No newline at end of file
+add_library(hmap_ei STATIC src/hmap_ei.cc)
+
+target_include_directories(hmap_ei PUBLIC include)
+target_link_libraries(hmap_ei PUBLIC Celix::error_injector Celix::utils)
+celix_deprecated_utils_headers(hmap_ei)
+target_link_options(hmap_ei INTERFACE
+ LINKER:--wrap,hashMap_create
+)
+add_library(Celix::hmap_ei ALIAS hmap_ei)
diff --git a/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
b/libs/utils/error_injector/hash_map/include/hmap_ei.h
similarity index 52%
copy from libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
copy to libs/utils/error_injector/hash_map/include/hmap_ei.h
index be809a47..78904dfc 100644
--- a/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
+++ b/libs/utils/error_injector/hash_map/include/hmap_ei.h
@@ -18,28 +18,18 @@
*
*/
-#include <gtest/gtest.h>
-#include <stdio.h>
+#ifndef CELIX_HMAP_EI_H
+#define CELIX_HMAP_EI_H
+#ifdef __cplusplus
+extern "C" {
+#endif
-#include "celix_err.h"
-#include "malloc_ei.h"
-#include "manifest.h"
+#include "celix_error_injector.h"
+#include "hash_map.h"
-class ManifestErrorInjectionTestSuite : public ::testing::Test {
-public:
- ManifestErrorInjectionTestSuite() {
- celix_ei_expect_malloc(nullptr, 0, nullptr);
- }
+CELIX_EI_DECLARE(hash_map_create, hash_map_pt);
- ~ManifestErrorInjectionTestSuite() override {
- celix_ei_expect_malloc(nullptr, 0, nullptr);
- }
-};
-
-TEST_F(ManifestErrorInjectionTestSuite, NoMemoryForManifestCreateTest) {
- manifest_pt manifest = nullptr;
- celix_ei_expect_malloc((void*)manifest_create, 0, nullptr);
- celix_status_t status = manifest_create(&manifest);
- EXPECT_EQ(CELIX_ENOMEM, status);
- celix_err_printErrors(stdout, "Errors are expected[", "]\n");
-}
\ No newline at end of file
+#ifdef __cplusplus
+}
+#endif
+#endif // CELIX_HMAP_EI_H
diff --git a/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
b/libs/utils/error_injector/hash_map/src/hmap_ei.cc
similarity index 52%
copy from libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
copy to libs/utils/error_injector/hash_map/src/hmap_ei.cc
index be809a47..4b398a09 100644
--- a/libs/framework/gtest/src/ManifestErrorInjectionTestSuite.cc
+++ b/libs/utils/error_injector/hash_map/src/hmap_ei.cc
@@ -18,28 +18,13 @@
*
*/
-#include <gtest/gtest.h>
-#include <stdio.h>
+#include "hmap_ei.h"
-#include "celix_err.h"
-#include "malloc_ei.h"
-#include "manifest.h"
-
-class ManifestErrorInjectionTestSuite : public ::testing::Test {
-public:
- ManifestErrorInjectionTestSuite() {
- celix_ei_expect_malloc(nullptr, 0, nullptr);
- }
-
- ~ManifestErrorInjectionTestSuite() override {
- celix_ei_expect_malloc(nullptr, 0, nullptr);
- }
-};
-
-TEST_F(ManifestErrorInjectionTestSuite, NoMemoryForManifestCreateTest) {
- manifest_pt manifest = nullptr;
- celix_ei_expect_malloc((void*)manifest_create, 0, nullptr);
- celix_status_t status = manifest_create(&manifest);
- EXPECT_EQ(CELIX_ENOMEM, status);
- celix_err_printErrors(stdout, "Errors are expected[", "]\n");
+extern "C" {
+hash_map_pt __real_hashMap_create();
+CELIX_EI_DEFINE(hash_map_create, hash_map_pt);
+hash_map_pt __wrap_hashMap_create() {
+ CELIX_EI_IMPL(hash_map_create);
+ return __real_hashMap_create();
+}
}
\ No newline at end of file