Blame SOURCES/0031-util-remove-duplicate-values-correctly-in-string_arr.patch

1756dc
From 85933ccfa7a1068f16fde557fe825c750899659a Mon Sep 17 00:00:00 2001
1756dc
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
1756dc
Date: Wed, 28 Nov 2018 13:45:33 +0100
1756dc
Subject: [PATCH 13/15] util: remove duplicate values correctly in
1756dc
 string_array_del_value
1756dc
1756dc
---
1756dc
 src/lib/util/string_array.c        |  27 ++++--
1756dc
 src/tests/test_util_string_array.c | 146 ++++++++++++++++++++++++++++-
1756dc
 2 files changed, 163 insertions(+), 10 deletions(-)
1756dc
1756dc
diff --git a/src/lib/util/string_array.c b/src/lib/util/string_array.c
1756dc
index e56d66bdcce7c8a1cf99f9b91068614c4b8d3d81..a8afa5ab8edbb26d6f946619f9ce0b83c511bb8c 100644
1756dc
--- a/src/lib/util/string_array.c
1756dc
+++ b/src/lib/util/string_array.c
1756dc
@@ -140,24 +140,33 @@ string_array_add_value(char **array, const char *value, bool unique)
1756dc
 char **
1756dc
 string_array_del_value(char **array, const char *value)
1756dc
 {
1756dc
-    bool found = false;
1756dc
-    int i;
1756dc
+    size_t count;
1756dc
+    size_t pos;
1756dc
+    size_t i;
1756dc
 
1756dc
-    if (!string_array_has_value(array, value)) {
1756dc
-        return array;
1756dc
+    if (array == NULL) {
1756dc
+        return NULL;
1756dc
     }
1756dc
 
1756dc
-    for (i = 0; array[i] != NULL; i++) {
1756dc
-        if (strcmp(value, array[i]) == 0) {
1756dc
+    count = string_array_count(array);
1756dc
+    for (i = 0; i < count; i++) {
1756dc
+        if (strcmp(array[i], value) == 0) {
1756dc
             free(array[i]);
1756dc
-            found = true;
1756dc
+            array[i] = NULL;
1756dc
         }
1756dc
+    }
1756dc
 
1756dc
-        if (found) {
1756dc
-            array[i] = array[i + 1];
1756dc
+    for (i = 0, pos = 0; i < count; i++) {
1756dc
+        if (array[i] != NULL) {
1756dc
+            array[pos] = array[i];
1756dc
+            pos++;
1756dc
         }
1756dc
     }
1756dc
 
1756dc
+    for (; pos < count; pos++) {
1756dc
+        array[pos] = NULL;
1756dc
+    }
1756dc
+
1756dc
     return array;
1756dc
 }
1756dc
 
1756dc
diff --git a/src/tests/test_util_string_array.c b/src/tests/test_util_string_array.c
1756dc
index 4f6812e9396f04bbbfb72bda8a9022501f074faf..249cb96acea3c4feac910702572cafb1025d9496 100644
1756dc
--- a/src/tests/test_util_string_array.c
1756dc
+++ b/src/tests/test_util_string_array.c
1756dc
@@ -32,11 +32,155 @@ void test_string_array_create(void **state)
1756dc
     string_array_free(array);
1756dc
 }
1756dc
 
1756dc
+void test_string_array_del_value__single(void **state)
1756dc
+{
1756dc
+    char **array;
1756dc
+    const char *values[] = {"1", "2", "3", "4", "5", NULL};
1756dc
+    const char *expected[] = {"1", "3", "4", "5", NULL};
1756dc
+    int i;
1756dc
+
1756dc
+    array = string_array_create(10);
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Fill array. */
1756dc
+    for (i = 0; values[i] != NULL; i++) {
1756dc
+        array = string_array_add_value(array, values[i], false);
1756dc
+        assert_non_null(array);
1756dc
+        assert_non_null(array[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    /* Delete value. */
1756dc
+    array = string_array_del_value(array, "2");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Test values. */
1756dc
+    for (i = 0; expected[i] != NULL; i++) {
1756dc
+        assert_non_null(array[i]);
1756dc
+        assert_string_equal(array[i], expected[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    string_array_free(array);
1756dc
+}
1756dc
+
1756dc
+void test_string_array_del_value__single_repeated(void **state)
1756dc
+{
1756dc
+    char **array;
1756dc
+    const char *values[] = {"1", "2", "2", "3", "2", "4", "2", "5", NULL};
1756dc
+    const char *expected[] = {"1", "3", "4", "5", NULL};
1756dc
+    int i;
1756dc
+
1756dc
+    array = string_array_create(10);
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Fill array. */
1756dc
+    for (i = 0; values[i] != NULL; i++) {
1756dc
+        array = string_array_add_value(array, values[i], false);
1756dc
+        assert_non_null(array);
1756dc
+        assert_non_null(array[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    /* Delete value. */
1756dc
+    array = string_array_del_value(array, "2");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Test values. */
1756dc
+    for (i = 0; expected[i] != NULL; i++) {
1756dc
+        assert_non_null(array[i]);
1756dc
+        assert_string_equal(array[i], expected[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    string_array_free(array);
1756dc
+}
1756dc
+
1756dc
+void test_string_array_del_value__multiple(void **state)
1756dc
+{
1756dc
+    char **array;
1756dc
+    const char *values[] = {"1", "2", "3", "4", "5", NULL};
1756dc
+    const char *expected[] = {"1", "4", NULL};
1756dc
+    int i;
1756dc
+
1756dc
+    array = string_array_create(10);
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Fill array. */
1756dc
+    for (i = 0; values[i] != NULL; i++) {
1756dc
+        array = string_array_add_value(array, values[i], false);
1756dc
+        assert_non_null(array);
1756dc
+        assert_non_null(array[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    /* Delete value. */
1756dc
+    array = string_array_del_value(array, "2");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    array = string_array_del_value(array, "3");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    array = string_array_del_value(array, "5");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Test values. */
1756dc
+    for (i = 0; expected[i] != NULL; i++) {
1756dc
+        assert_non_null(array[i]);
1756dc
+        assert_string_equal(array[i], expected[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    string_array_free(array);
1756dc
+}
1756dc
+
1756dc
+void test_string_array_del_value__multiple_repeated(void **state)
1756dc
+{
1756dc
+    char **array;
1756dc
+    const char *values[] = {"1", "2", "2", "3", "3", "2", "4", "2", "5", "5", NULL};
1756dc
+    const char *expected[] = {"1", "4", NULL};
1756dc
+    int i;
1756dc
+
1756dc
+    array = string_array_create(10);
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Fill array. */
1756dc
+    for (i = 0; values[i] != NULL; i++) {
1756dc
+        array = string_array_add_value(array, values[i], false);
1756dc
+        assert_non_null(array);
1756dc
+        assert_non_null(array[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    /* Delete value. */
1756dc
+    array = string_array_del_value(array, "2");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    array = string_array_del_value(array, "3");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    array = string_array_del_value(array, "5");
1756dc
+    assert_non_null(array);
1756dc
+
1756dc
+    /* Test values. */
1756dc
+    for (i = 0; expected[i] != NULL; i++) {
1756dc
+        assert_non_null(array[i]);
1756dc
+        assert_string_equal(array[i], expected[i]);
1756dc
+    }
1756dc
+    assert_null(array[i]);
1756dc
+
1756dc
+    string_array_free(array);
1756dc
+}
1756dc
+
1756dc
 int main(int argc, const char *argv[])
1756dc
 {
1756dc
 
1756dc
     const struct CMUnitTest tests[] = {
1756dc
-        cmocka_unit_test(test_string_array_create)
1756dc
+        cmocka_unit_test(test_string_array_create),
1756dc
+        cmocka_unit_test(test_string_array_del_value__single),
1756dc
+        cmocka_unit_test(test_string_array_del_value__single_repeated),
1756dc
+        cmocka_unit_test(test_string_array_del_value__multiple),
1756dc
+        cmocka_unit_test(test_string_array_del_value__multiple_repeated)
1756dc
     };
1756dc
 
1756dc
     return cmocka_run_group_tests(tests, NULL, NULL);
1756dc
-- 
1756dc
2.17.2
1756dc