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

Reply via email to