This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/type_support_for_properties
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to 
refs/heads/feature/type_support_for_properties by this push:
     new 9d0ad577 Add some error handling for version
9d0ad577 is described below

commit 9d0ad5779240bcc0328702f5cce2ed2af5f86293
Author: Pepijn Noltes <[email protected]>
AuthorDate: Fri Nov 10 16:17:48 2023 +0100

    Add some error handling for version
    
    Also:
     - Remove dup include in properties.c
     - Remove some dead code in celix_hash
---
 libs/utils/gtest/CMakeLists.txt                    |  1 +
 .../gtest/src/HashMapErrorInjectionTestSuite.cc    |  5 +++-
 .../gtest/src/VersionErrorInjectionTestSuite.cc    | 25 ++++++++++++++------
 libs/utils/include/celix_properties.h              |  6 ++---
 libs/utils/include/celix_version.h                 |  8 ++-----
 libs/utils/src/celix_hash_map.c                    |  2 --
 libs/utils/src/version.c                           | 27 +++++++++++++++++-----
 7 files changed, 49 insertions(+), 25 deletions(-)

diff --git a/libs/utils/gtest/CMakeLists.txt b/libs/utils/gtest/CMakeLists.txt
index 4a340d55..784e8742 100644
--- a/libs/utils/gtest/CMakeLists.txt
+++ b/libs/utils/gtest/CMakeLists.txt
@@ -110,6 +110,7 @@ if (EI_TESTS)
             Celix::ifaddrs_ei
             Celix::threads_ei
             Celix::malloc_ei
+            Celix::asprintf_ei
             Celix::string_hash_map_ei
             Celix::long_hash_map_ei
             GTest::gtest GTest::gtest_main
diff --git a/libs/utils/gtest/src/HashMapErrorInjectionTestSuite.cc 
b/libs/utils/gtest/src/HashMapErrorInjectionTestSuite.cc
index 956d0149..198a2186 100644
--- a/libs/utils/gtest/src/HashMapErrorInjectionTestSuite.cc
+++ b/libs/utils/gtest/src/HashMapErrorInjectionTestSuite.cc
@@ -30,7 +30,10 @@
 
 class HashMapErrorInjectionTestSuite : public ::testing::Test {
   public:
-    HashMapErrorInjectionTestSuite() { celix_ei_expect_calloc(nullptr, 0, 
nullptr); }
+    HashMapErrorInjectionTestSuite() {
+        celix_ei_expect_calloc(nullptr, 0, nullptr);
+        celix_err_resetErrors();
+    }
 };
 
 TEST_F(HashMapErrorInjectionTestSuite, CreateFailureTest) {
diff --git a/libs/utils/gtest/src/VersionErrorInjectionTestSuite.cc 
b/libs/utils/gtest/src/VersionErrorInjectionTestSuite.cc
index cf570c6c..019c8726 100644
--- a/libs/utils/gtest/src/VersionErrorInjectionTestSuite.cc
+++ b/libs/utils/gtest/src/VersionErrorInjectionTestSuite.cc
@@ -20,8 +20,10 @@
 #include <gtest/gtest.h>
 
 #include "celix_utils_ei.h"
+#include "asprintf_ei.h"
 #include "malloc_ei.h"
 #include "celix_version.h"
+#include "celix_err.h"
 
 
 class VersionErrorInjectionTestSuite : public ::testing::Test {
@@ -29,19 +31,28 @@ public:
     VersionErrorInjectionTestSuite() {
         celix_ei_expect_calloc(nullptr, 0, nullptr);
         celix_ei_expect_celix_utils_strdup(nullptr, 0, nullptr);
-    }
-    ~VersionErrorInjectionTestSuite() noexcept override {
-        celix_ei_expect_calloc(nullptr, 0, nullptr);
-        celix_ei_expect_celix_utils_strdup(nullptr, 0, nullptr);
+        celix_ei_expect_asprintf(nullptr, 0, 0);
+        celix_err_resetErrors();
     }
 };
 
-TEST_F(VersionErrorInjectionTestSuite, CreateTest) {
-    celix_ei_expect_calloc(CELIX_EI_UNKNOWN_CALLER, 0, nullptr);
+TEST_F(VersionErrorInjectionTestSuite, CreateFailureTest) {
+    celix_ei_expect_calloc((void*)celix_version_create, 0, nullptr);
     celix_version_t *version = celix_version_create(2, 2, 0, nullptr);
     EXPECT_EQ(nullptr, version);
 
-    celix_ei_expect_celix_utils_strdup(CELIX_EI_UNKNOWN_CALLER, 0, nullptr);
+    celix_ei_expect_celix_utils_strdup((void*)celix_version_create, 0, 
nullptr);
     version = celix_version_create(2, 2, 0, "qualifier");
     EXPECT_EQ(nullptr, version);
+
+    EXPECT_EQ(2, celix_err_getErrorCount());
 }
+
+TEST_F(VersionErrorInjectionTestSuite, ToStringFailureTest) {
+    celix_autoptr(celix_version_t) version = celix_version_create(2, 2, 0, 
"qualifier");
+
+    celix_ei_expect_asprintf((void*)celix_version_toString, 0, -1);
+    char *str = celix_version_toString(version);
+    EXPECT_EQ(nullptr, str);
+    EXPECT_EQ(1, celix_err_getErrorCount());
+}
\ No newline at end of file
diff --git a/libs/utils/include/celix_properties.h 
b/libs/utils/include/celix_properties.h
index 48dd6b80..caade747 100644
--- a/libs/utils/include/celix_properties.h
+++ b/libs/utils/include/celix_properties.h
@@ -35,6 +35,9 @@
  *  - celix_version_t*
  */
 
+#ifndef CELIX_PROPERTIES_H_
+#define CELIX_PROPERTIES_H_
+
 #include <stdio.h>
 
 #include "celix_cleanup.h"
@@ -43,9 +46,6 @@
 #include "celix_utils_export.h"
 #include "celix_version.h"
 
-#ifndef CELIX_PROPERTIES_H_
-#define CELIX_PROPERTIES_H_
-
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/libs/utils/include/celix_version.h 
b/libs/utils/include/celix_version.h
index 8b713ee1..03cf0428 100644
--- a/libs/utils/include/celix_version.h
+++ b/libs/utils/include/celix_version.h
@@ -23,17 +23,13 @@
 #include <stdbool.h>
 #include <stdlib.h>
 
+#include "celix_cleanup.h"
 #include "celix_utils_export.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#include <stdbool.h>
-
-#include "celix_cleanup.h"
-#include "celix_utils_export.h"
-
 /**
  * @file celix_version.h
  * @brief Header file for the Celix Version API.
@@ -131,7 +127,7 @@ CELIX_UTILS_EXPORT int celix_version_getMicro(const 
celix_version_t* version);
  * @brief Gets the version qualifier of a celix version.
  *
  * @param[in] version The celix version.
- * @return The version qualifier, or NULL if no qualifier is present.
+ * @return The version qualifier, or an empty string ("") if no qualifier is 
present.
  */
 CELIX_UTILS_EXPORT const char* celix_version_getQualifier(const 
celix_version_t* version);
 
diff --git a/libs/utils/src/celix_hash_map.c b/libs/utils/src/celix_hash_map.c
index ded28d00..fa92ceb0 100644
--- a/libs/utils/src/celix_hash_map.c
+++ b/libs/utils/src/celix_hash_map.c
@@ -56,7 +56,6 @@ struct celix_hash_map {
     unsigned int size; //nr of total entries
     double loadFactor;
     celix_hash_map_key_type_e keyType;
-    celix_hash_map_value_t emptyValue;
     unsigned int (*hashKeyFunction)(const celix_hash_map_key_t* key);
     bool (*equalsKeyFunction)(const celix_hash_map_key_t* key1, const 
celix_hash_map_key_t* key2);
     void (*simpleRemovedCallback)(void* value);
@@ -351,7 +350,6 @@ celix_status_t celix_hashMap_init(
     map->size = 0;
     map->bucketsSize = initialCapacity;
     map->keyType = keyType;
-    memset(&map->emptyValue, 0, sizeof(map->emptyValue));
     map->hashKeyFunction = hashKeyFn;
     map->equalsKeyFunction = equalsKeyFn;
     map->simpleRemovedCallback = NULL;
diff --git a/libs/utils/src/version.c b/libs/utils/src/version.c
index 2c1d01fc..07652a00 100644
--- a/libs/utils/src/version.c
+++ b/libs/utils/src/version.c
@@ -26,6 +26,7 @@
 #include "version.h"
 #include "celix_errno.h"
 #include "version_private.h"
+#include "celix_err.h"
 
 static const char* const CELIX_VERSION_EMPTY_QUALIFIER = "";
 
@@ -99,12 +100,14 @@ celix_status_t version_isCompatible(version_pt user, 
version_pt provider, bool*
 
 celix_version_t* celix_version_create(int major, int minor, int micro, const 
char* qualifier) {
     if (major < 0 || minor < 0 || micro < 0) {
+        celix_err_push("Invalid version number. Major, minor and micro must be 
>= 0");
         return NULL;
     }
 
     if (qualifier == NULL) {
         qualifier = CELIX_VERSION_EMPTY_QUALIFIER;
     }
+
     size_t qualifierLen = strlen(qualifier);
     for (int i = 0; i < qualifierLen; i++) {
         char ch = qualifier[i];
@@ -120,21 +123,28 @@ celix_version_t* celix_version_create(int major, int 
minor, int micro, const cha
         if ((ch == '_') || (ch == '-')) {
             continue;
         }
-        //invalid
+        celix_err_push("Invalid version qualifier. Characters must be 
[A-Za-z0-9_-]");
         return NULL;
     }
 
     celix_version_t* version = calloc(1, sizeof(*version));
-    if (version != NULL) {
+    if (version) {
         version->major = major;
         version->minor = minor;
         version->micro = micro;
-        version->qualifier = qualifierLen == 0 ? 
(char*)CELIX_VERSION_EMPTY_QUALIFIER : celix_utils_strdup(qualifier);
-        if (version->qualifier == NULL) {
+        if (qualifierLen == 0) {
+            version->qualifier = (char*)CELIX_VERSION_EMPTY_QUALIFIER;
+        } else {
+            version->qualifier = celix_utils_strdup(qualifier);
+        }
+        if (!version->qualifier) {
             celix_version_destroy(version);
             version = NULL;
         }
     }
+    if (!version) {
+        celix_err_push("Failed to allocate memory for celix_version_create");
+    }
     return version;
 }
 
@@ -289,10 +299,15 @@ int celix_version_compareTo(const celix_version_t* 
version, const celix_version_
 
 char* celix_version_toString(const celix_version_t* version) {
     char* string = NULL;
+    int rc;
     if (strlen(version->qualifier) > 0) {
-        asprintf(&string,"%d.%d.%d.%s", version->major, version->minor, 
version->micro, version->qualifier);
+        rc = asprintf(&string,"%d.%d.%d.%s", version->major, version->minor, 
version->micro, version->qualifier);
     } else {
-        asprintf(&string, "%d.%d.%d", version->major, version->minor, 
version->micro);
+        rc = asprintf(&string, "%d.%d.%d", version->major, version->minor, 
version->micro);
+    }
+    if (rc < 0) {
+        celix_err_push("Failed to allocate memory for celix_version_toString");
+        return NULL;
     }
     return string;
 }

Reply via email to