Blame SOURCES/0118-TESTS-Order-list-of-entries-in-some-lists.patch

75e304
From 1a73dbe9747aec2818fabd179e0fb46695d66433 Mon Sep 17 00:00:00 2001
75e304
From: =?UTF-8?q?Michal=20=C5=BDidek?= <mzidek@redhat.com>
75e304
Date: Mon, 13 Nov 2017 16:15:21 +0100
75e304
Subject: [PATCH] TESTS: Order list of entries in some lists
75e304
MIME-Version: 1.0
75e304
Content-Type: text/plain; charset=UTF-8
75e304
Content-Transfer-Encoding: 8bit
75e304
75e304
Some tests started to fail because we depended on specific
75e304
order of users in groups or messages in ldb results to be
75e304
returned and that order changed.
75e304
75e304
This patch adds a simple helper functions into these tests
75e304
that order the entries before comparison with expected results.
75e304
more deterministic.
75e304
75e304
Resolves:
75e304
https://pagure.io/SSSD/sssd/issue/3563
75e304
75e304
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
75e304
(cherry picked from commit caae0e53e6091806634943699f4398b6a20273b4)
75e304
75e304
DOWNSTREAM:
75e304
Resolves: rhbz#1596292 - home dir disappear in sssd cache on the IPA master for AD users [rhel-7.5.z]
75e304
---
75e304
 src/tests/cmocka/test_nss_srv.c     | 22 +++++++++++++++++++
75e304
 src/tests/cmocka/test_sysdb_views.c | 42 ++++++++++++++++++++++++++++++++-----
75e304
 2 files changed, 59 insertions(+), 5 deletions(-)
75e304
75e304
diff --git a/src/tests/cmocka/test_nss_srv.c b/src/tests/cmocka/test_nss_srv.c
75e304
index 6aa726153183b5a871a75d398727ea7132358ca6..21bd80fb7f6562f6a31452bac6a26c109fef4cb1 100644
75e304
--- a/src/tests/cmocka/test_nss_srv.c
75e304
+++ b/src/tests/cmocka/test_nss_srv.c
75e304
@@ -585,6 +585,25 @@ static errno_t delete_group(struct nss_test_ctx *ctx,
75e304
     return ret;
75e304
 }
75e304
 
75e304
+static int cmp_func(const void *a, const void *b)
75e304
+{
75e304
+    char *str1 = *(char **)discard_const(a);
75e304
+    char *str2 = *(char **)discard_const(b);
75e304
+
75e304
+    return strcmp(str1, str2);
75e304
+}
75e304
+
75e304
+static void order_string_array(char **_list, int size)
75e304
+{
75e304
+    if (size < 2 || _list == NULL || *_list == NULL) {
75e304
+        /* Nothing to do */
75e304
+        return;
75e304
+    }
75e304
+
75e304
+    qsort(_list, size, sizeof(char *), cmp_func);
75e304
+    return;
75e304
+}
75e304
+
75e304
 static void assert_groups_equal(struct group *expected,
75e304
                                 struct group *gr, const int nmem)
75e304
 {
75e304
@@ -594,6 +613,9 @@ static void assert_groups_equal(struct group *expected,
75e304
     assert_string_equal(gr->gr_name, expected->gr_name);
75e304
     assert_string_equal(gr->gr_passwd, expected->gr_passwd);
75e304
 
75e304
+    order_string_array(gr->gr_mem, nmem);
75e304
+    order_string_array(expected->gr_mem, nmem);
75e304
+
75e304
     for (i = 0; i < nmem; i++) {
75e304
         assert_string_equal(gr->gr_mem[i], expected->gr_mem[i]);
75e304
     }
75e304
diff --git a/src/tests/cmocka/test_sysdb_views.c b/src/tests/cmocka/test_sysdb_views.c
75e304
index 0378254b4440b29c3182faf2adde8c3db8a4ce97..dd3eb50f9310ff925734dcf51a669d08a638aefd 100644
75e304
--- a/src/tests/cmocka/test_sysdb_views.c
75e304
+++ b/src/tests/cmocka/test_sysdb_views.c
75e304
@@ -22,6 +22,7 @@
75e304
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
75e304
 */
75e304
 
75e304
+#include <stdlib.h>
75e304
 #include <stdarg.h>
75e304
 #include <stddef.h>
75e304
 #include <setjmp.h>
75e304
@@ -612,6 +613,31 @@ static int test_enum_users_setup(void **state)
75e304
     return 0;
75e304
 }
75e304
 
75e304
+static int cmp_func(const void *a, const void *b)
75e304
+{
75e304
+    const char *str1;
75e304
+    const char *str2;
75e304
+    struct ldb_message *msg1 = *(struct ldb_message **)discard_const(a);
75e304
+    struct ldb_message *msg2 = *(struct ldb_message **)discard_const(b);
75e304
+
75e304
+    str1 = ldb_msg_find_attr_as_string(msg1, SYSDB_NAME, NULL);
75e304
+    str2 = ldb_msg_find_attr_as_string(msg2, SYSDB_NAME, NULL);
75e304
+
75e304
+    return strcmp(str1, str2);
75e304
+}
75e304
+
75e304
+/* Make the order of ldb results deterministic */
75e304
+static void order_ldb_res_msgs(struct ldb_result *res)
75e304
+{
75e304
+    if (res == NULL || res->count < 2) {
75e304
+        /* Nothing to do */
75e304
+        return;
75e304
+    }
75e304
+
75e304
+    qsort(res->msgs, res->count, sizeof(struct ldb_message *), cmp_func);
75e304
+    return;
75e304
+}
75e304
+
75e304
 static void assert_user_attrs(struct ldb_message *msg,
75e304
                               struct sss_domain_info *dom,
75e304
                               const char *shortname,
75e304
@@ -660,8 +686,9 @@ static void check_enumpwent(int ret, struct sss_domain_info *dom,
75e304
     assert_int_equal(ret, EOK);
75e304
     assert_int_equal(res->count, N_ELEMENTS(users)-1);
75e304
 
75e304
-    assert_user_attrs(res->msgs[0], dom, "barney", views);
75e304
-    assert_user_attrs(res->msgs[1], dom, "alice", views);
75e304
+    order_ldb_res_msgs(res);
75e304
+    assert_user_attrs(res->msgs[0], dom, "alice", views);
75e304
+    assert_user_attrs(res->msgs[1], dom, "barney", views);
75e304
     assert_user_attrs(res->msgs[2], dom, "bob", views);
75e304
 }
75e304
 
75e304
@@ -703,6 +730,7 @@ static void test_sysdb_enumpwent_filter(void **state)
75e304
     ret = sysdb_enumpwent_filter(test_ctx, test_ctx->domain, "b*", 0, &res;;
75e304
     assert_int_equal(ret, EOK);
75e304
     assert_int_equal(res->count, 2);
75e304
+    order_ldb_res_msgs(res);
75e304
     assert_user_attrs(res->msgs[0], test_ctx->domain, "barney", false);
75e304
     assert_user_attrs(res->msgs[1], test_ctx->domain, "bob", false);
75e304
 
75e304
@@ -749,6 +777,7 @@ static void test_sysdb_enumpwent_filter_views(void **state)
75e304
                                             "b*", NULL, &res;;
75e304
     assert_int_equal(ret, EOK);
75e304
     assert_int_equal(res->count, 2);
75e304
+    order_ldb_res_msgs(res);
75e304
     assert_user_attrs(res->msgs[0], test_ctx->domain, "barney", true);
75e304
     assert_user_attrs(res->msgs[1], test_ctx->domain, "bob", true);
75e304
 
75e304
@@ -896,10 +925,11 @@ static void check_enumgrent(int ret, struct sss_domain_info *dom,
75e304
 {
75e304
     assert_int_equal(ret, EOK);
75e304
     assert_int_equal(res->count, N_ELEMENTS(groups)-1);
75e304
-    assert_group_attrs(res->msgs[0], dom, "three",
75e304
-                       views ? TEST_GID_OVERRIDE_BASE + 2 : 0);
75e304
-    assert_group_attrs(res->msgs[1], dom, "one",
75e304
+    order_ldb_res_msgs(res);
75e304
+    assert_group_attrs(res->msgs[0], dom, "one",
75e304
                        views ? TEST_GID_OVERRIDE_BASE : 0);
75e304
+    assert_group_attrs(res->msgs[1], dom, "three",
75e304
+                       views ? TEST_GID_OVERRIDE_BASE + 2 : 0);
75e304
     assert_group_attrs(res->msgs[2], dom, "two",
75e304
                        views ? TEST_GID_OVERRIDE_BASE + 1 : 0);
75e304
 }
75e304
@@ -942,6 +972,7 @@ static void test_sysdb_enumgrent_filter(void **state)
75e304
     ret = sysdb_enumgrent_filter(test_ctx, test_ctx->domain, "t*", 0, &res;;
75e304
     assert_int_equal(ret, EOK);
75e304
     assert_int_equal(res->count, 2);
75e304
+    order_ldb_res_msgs(res);
75e304
     assert_group_attrs(res->msgs[0], test_ctx->domain, "three", 0);
75e304
     assert_group_attrs(res->msgs[1], test_ctx->domain, "two", 0);
75e304
 
75e304
@@ -988,6 +1019,7 @@ static void test_sysdb_enumgrent_filter_views(void **state)
75e304
                                             "t*", NULL, &res;;
75e304
     assert_int_equal(ret, EOK);
75e304
     assert_int_equal(res->count, 2);
75e304
+    order_ldb_res_msgs(res);
75e304
     assert_group_attrs(res->msgs[0], test_ctx->domain,
75e304
                        "three", TEST_GID_OVERRIDE_BASE + 2);
75e304
     assert_group_attrs(res->msgs[1], test_ctx->domain, "two",
75e304
-- 
75e304
2.14.4
75e304