This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch feature/674-add-element-type-to-array-list in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to refs/heads/feature/674-add-element-type-to-array-list by this push: new 21051234 #674 Add additional array list ei tests 21051234 is described below commit 210512347eef75d758386ed1dcd6305ed231e480 Author: Pepijn Noltes <pnol...@apache.org> AuthorDate: Mon Feb 5 23:14:23 2024 +0100 #674 Add additional array list ei tests --- .../gtest/src/ArrayListErrorInjectionTestSuite.cc | 43 ++++++++++++++++++++++ libs/utils/gtest/src/ArrayListTestSuite.cc | 18 ++++----- libs/utils/include/celix_array_list.h | 2 + libs/utils/src/array_list.c | 25 +++---------- 4 files changed, 60 insertions(+), 28 deletions(-) diff --git a/libs/utils/gtest/src/ArrayListErrorInjectionTestSuite.cc b/libs/utils/gtest/src/ArrayListErrorInjectionTestSuite.cc index 1d3d3a7d..309d54d0 100644 --- a/libs/utils/gtest/src/ArrayListErrorInjectionTestSuite.cc +++ b/libs/utils/gtest/src/ArrayListErrorInjectionTestSuite.cc @@ -20,6 +20,10 @@ #include <gtest/gtest.h> #include "celix_array_list.h" +#include "celix_array_list_ei.h" +#include "celix_err.h" +#include "celix_utils_ei.h" +#include "celix_version_ei.h" #include "malloc_ei.h" class ArrayListErrorInjectionTestSuite : public ::testing::Test { @@ -27,6 +31,9 @@ public: ArrayListErrorInjectionTestSuite() = default; ~ArrayListErrorInjectionTestSuite() noexcept override { celix_ei_expect_realloc(nullptr, 0, nullptr); + celix_ei_expect_calloc(nullptr, 0, nullptr); + celix_ei_expect_celix_utils_strdup(nullptr, 0, nullptr); + celix_ei_expect_celix_version_copy(nullptr, 0, nullptr); } }; @@ -49,3 +56,39 @@ TEST_F(ArrayListErrorInjectionTestSuite, TestAddFunctions) { celix_arrayList_destroy(list); } + +TEST_F(ArrayListErrorInjectionTestSuite, AddStringAndAddVersionFailureTest) { + // Given a string array list + celix_autoptr(celix_array_list_t) stringList = celix_arrayList_createStringArray(); + // When an error is injected for celix_utils_strdup + celix_ei_expect_celix_utils_strdup((void*)celix_arrayList_addString, 0, nullptr); + // Then adding a string should fail + EXPECT_EQ(CELIX_ENOMEM, celix_arrayList_addString(stringList, "test")); + + // Given a version array list + celix_autoptr(celix_array_list_t) versionList = celix_arrayList_createVersionArray(); + // When an error is injected for celix_version_copy + celix_ei_expect_celix_version_copy((void*)celix_arrayList_addVersion, 0, nullptr); + // Then adding a version should fail + EXPECT_EQ(CELIX_ENOMEM, celix_arrayList_addVersion(versionList, NULL)); +} + +TEST_F(ArrayListErrorInjectionTestSuite, CopyArrayListFailureTest) { + // Given a string array list with 10 elements (whitebox knowledge) + celix_autoptr(celix_array_list_t) stringList = celix_arrayList_createStringArray(); + celix_arrayList_addString(stringList, "test1"); + + // When an error is injected for calloc + celix_ei_expect_calloc((void*)celix_arrayList_copy, 1, nullptr); + // Then copying an array list should fail + EXPECT_EQ(nullptr, celix_arrayList_copy(stringList)); + // And a celix_err is expected + EXPECT_EQ(1, celix_err_getErrorCount()); + + // When an error is injected for celix_utils_strdup + celix_ei_expect_celix_utils_strdup((void*)celix_arrayList_addString, 0, nullptr); + // Then copying an array list should fail + EXPECT_EQ(nullptr, celix_arrayList_copy(stringList)); + // And a celix_err is expected + EXPECT_EQ(2, celix_err_getErrorCount()); +} diff --git a/libs/utils/gtest/src/ArrayListTestSuite.cc b/libs/utils/gtest/src/ArrayListTestSuite.cc index 18069db7..0bc61c26 100644 --- a/libs/utils/gtest/src/ArrayListTestSuite.cc +++ b/libs/utils/gtest/src/ArrayListTestSuite.cc @@ -26,14 +26,14 @@ class ArrayListTestSuite : public ::testing::Test { public: }; -TEST_F(ArrayListTestSuite, TestCreateDestroyHashMap) { +TEST_F(ArrayListTestSuite, CreateDestroyArrayListTest) { auto* list = celix_arrayList_create(); EXPECT_TRUE(list != nullptr); EXPECT_EQ(0, celix_arrayList_size(list)); celix_arrayList_destroy(list); } -TEST_F(ArrayListTestSuite, TestArrayListWithEquals) { +TEST_F(ArrayListTestSuite, ArrayListWithEqualsTest) { celix_array_list_create_options_t opts{}; opts.equalsCallback = [](celix_array_list_entry_t a, celix_array_list_entry_t b) -> bool { const char* sa = (char*)a.voidPtrVal; @@ -109,7 +109,7 @@ void testArrayListForTemplateType(const std::vector<T>& entries, celix_arrayList_destroy(list); } -TEST_F(ArrayListTestSuite, TestDifferentEntyTypesForArrayList) { +TEST_F(ArrayListTestSuite, TestDifferentEntyTypesForArrayListTest) { std::vector<int> intEntries{1, 2, 3, 4, 5}; testArrayListForTemplateType<int>(intEntries, celix_arrayList_createIntArray, @@ -224,7 +224,7 @@ TEST_F(ArrayListTestSuite, VersionArrayList) { EXPECT_EQ(2, celix_arrayList_size(versionList)); } -TEST_F(ArrayListTestSuite, SortTypedArrayLists) { +TEST_F(ArrayListTestSuite, SortTypedArrayListsTest) { // Given a ptr, string, int, long, uint, ulong, float, double, bool, size and version list // with unsorted values (including duplicates) celix_autoptr(celix_array_list_t) ptrList = celix_arrayList_createPointerArray(); @@ -376,7 +376,7 @@ TEST_F(ArrayListTestSuite, SortTypedArrayLists) { EXPECT_EQ(0, celix_version_compareToMajorMinor(celix_arrayList_getVersion(versionList, 4), 3, 2)); } -TEST_F(ArrayListTestSuite, EqualCheck) { +TEST_F(ArrayListTestSuite, EqualCheckTest) { //Given a selection of long list and a double list celix_autoptr(celix_array_list_t) list1 = celix_arrayList_createLongArray(); celix_arrayList_addLong(list1, 1L); @@ -437,7 +437,7 @@ TEST_F(ArrayListTestSuite, CopyArrayTest) { EXPECT_TRUE(celix_arrayList_equals(versionList, versionListCopy)); } -TEST_F(ArrayListTestSuite, TestSimpleRemovedCallbacksForArrayList) { +TEST_F(ArrayListTestSuite, SimpleRemovedCallbacksForArrayListTest) { celix_array_list_create_options_t opts{}; opts.simpleRemovedCallback = free; auto* list = celix_arrayList_createWithOptions(&opts); @@ -449,7 +449,7 @@ TEST_F(ArrayListTestSuite, TestSimpleRemovedCallbacksForArrayList) { celix_arrayList_destroy(list); //will call free for every entry } -TEST_F(ArrayListTestSuite, TestRemovedCallbacksForArrayList) { +TEST_F(ArrayListTestSuite, RemovedCallbacksForArrayListTest) { int count = 0 ; celix_array_list_create_options_t opts{}; opts.removedCallbackData = &count; @@ -473,7 +473,7 @@ TEST_F(ArrayListTestSuite, TestRemovedCallbacksForArrayList) { } -TEST_F(ArrayListTestSuite, TestSortForArrayList) { +TEST_F(ArrayListTestSuite, SortForArrayListTest) { auto* list = celix_arrayList_create(); celix_arrayList_addInt(list, 3); celix_arrayList_addInt(list, 2); @@ -497,7 +497,7 @@ TEST_F(ArrayListTestSuite, TestSortForArrayList) { celix_arrayList_destroy(list); } -TEST_F(ArrayListTestSuite, TestReturnStatusAddFunctions) { +TEST_F(ArrayListTestSuite, ReturnStatusAddFunctionsTest) { auto* list = celix_arrayList_create(); ASSERT_TRUE(list != nullptr); EXPECT_EQ(0, celix_arrayList_size(list)); diff --git a/libs/utils/include/celix_array_list.h b/libs/utils/include/celix_array_list.h index 3a0b0ff9..716aa194 100644 --- a/libs/utils/include/celix_array_list.h +++ b/libs/utils/include/celix_array_list.h @@ -863,6 +863,8 @@ bool celix_arrayList_equals(const celix_array_list_t* listA, const celix_array_l * if the element type is CELIX_ARRAY_LIST_ELEMENT_TYPE_VERSION, the versions will be copied. * For all other element types the values will be copied. * + * If a NULL is returned and the original array list is not NULL, a error message is logged to celix_err. + * * @param[in] list The array list to copy. * @return A new array list with the same element type and values as the original array list or NULL if the original * array list is NULL or out of memory. diff --git a/libs/utils/src/array_list.c b/libs/utils/src/array_list.c index 59108cf9..d35f40df 100644 --- a/libs/utils/src/array_list.c +++ b/libs/utils/src/array_list.c @@ -61,7 +61,7 @@ static int celix_arrayList_compareStringEntries(celix_array_list_entry_t a, celi } static bool celix_arrayList_stringEquals(celix_array_list_entry_t a, celix_array_list_entry_t b) { - return celix_arrayList_compareStringEntries(a, b) == 0; + return celix_utils_stringEquals(a.stringVal, b.stringVal); } static int celix_arrayList_compareIntEntries(celix_array_list_entry_t a, celix_array_list_entry_t b) { @@ -325,13 +325,6 @@ celix_array_list_t* celix_arrayList_createVersionArray() { return celix_arrayList_createTypedArray(CELIX_ARRAY_LIST_ELEMENT_TYPE_VERSION); } - -celix_array_list_t* celix_arrayList_createWithEquals(celix_arrayList_equals_fp equals) { - celix_array_list_create_options_t opts = CELIX_EMPTY_ARRAY_LIST_CREATE_OPTIONS; - opts.equalsCallback = equals; - return celix_arrayList_createWithOptions(&opts); -} - void celix_arrayList_destroy(celix_array_list_t *list) { if (list != NULL) { celix_arrayList_clear(list); @@ -752,20 +745,14 @@ celix_array_list_t* celix_arrayList_copy(const celix_array_list_t* list) { for (int i = 0; i < celix_arrayList_size(list); ++i) { celix_array_list_entry_t entry = list->elementData[i]; + celix_status_t status; if (copy->elementType == CELIX_ARRAY_LIST_ELEMENT_TYPE_STRING) { - entry.stringVal = celix_utils_strdup(entry.stringVal); - if (entry.stringVal == NULL) { - celix_err_push("Failed to copy string entry. Out of memory."); - return NULL; - } + status = celix_arrayList_addString(copy, entry.stringVal); } else if (copy->elementType == CELIX_ARRAY_LIST_ELEMENT_TYPE_VERSION) { - entry.versionVal = celix_version_copy(entry.versionVal); - if (entry.versionVal == NULL) { - celix_err_push("Failed to copy version entry. Out of memory."); - return NULL; - } + status = celix_arrayList_addVersion(copy, entry.versionVal); + } else { + status = celix_arrayList_addEntry(copy, entry); } - celix_status_t status = celix_arrayList_addEntry(copy, entry); if (status != CELIX_SUCCESS) { celix_err_push("Failed to add entry to copy list."); return NULL;