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;
}