[SSSD] [PATCH] Add checks to test the memberuid handling

Sumit Bose sbose at redhat.com
Mon Dec 7 14:54:03 UTC 2009


On Mon, Dec 07, 2009 at 09:19:32AM -0500, Stephen Gallagher wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On 12/03/2009 08:27 AM, Simo Sorce wrote:
> > On Thu, 2009-12-03 at 11:41 +0100, Sumit Bose wrote:
> >> Hi,
> >>
> >> this patch adds some tests to check the memberuid generation of the
> >> memberof ldb plugin. The first series of test creates a hierarchy of
> >> 10
> >> nested groups, adds a user to each group and then removes a group in
> >> the middle of the hierarchy. The second series works similar but puts
> >> the
> >> the first group in the last one and creates a loop of nested groups.
> > 
> > ACK
> > 
> > Simo.
> > 
> 
> Revoking this ack. Due to changes made to the members in Simo's
> "Correctly resolve nested groups" patch, this patch no longer compiles.
> (changes were made to the sysdb_store_group_send() function signature)
> 
> Please rebase this patch atop those.
> 

new version attached.

bye,
Sumit

> - -- 
> Stephen Gallagher
> RHCE 804006346421761
> 
> Delivering value year after year.
> Red Hat ranks #1 in value among software vendors.
> http://www.redhat.com/promo/vendor/
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
> Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
> 
> iEYEARECAAYFAksdDvMACgkQeiVVYja6o6OaswCfXC2P6UY+S2BnSfZeR6Jtsgg2
> HqAAn1skEf88rWoIBt1XYB7dS+k8UZ44
> =84mi
> -----END PGP SIGNATURE-----
> _______________________________________________
> sssd-devel mailing list
> sssd-devel at lists.fedorahosted.org
> https://fedorahosted.org/mailman/listinfo/sssd-devel
-------------- next part --------------
>From 140b6bc4e4a3eb25dadd82668326f25fe9a13886 Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Tue, 1 Dec 2009 16:24:36 +0100
Subject: [PATCH] Add checks to test the memberuid handling

---
 server/tests/sysdb-tests.c |  508 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 495 insertions(+), 13 deletions(-)

diff --git a/server/tests/sysdb-tests.c b/server/tests/sysdb-tests.c
index 84cf810..70972ca 100644
--- a/server/tests/sysdb-tests.c
+++ b/server/tests/sysdb-tests.c
@@ -43,6 +43,9 @@
 #define ASQ_TEST_USER "testuser27010"
 #define ASQ_TEST_USER_UID 27010
 
+#define MBO_USER_BASE 27500
+#define MBO_GROUP_BASE 28500
+
 struct sysdb_test_ctx {
     struct sysdb_ctx *sysdb;
     struct confdb_ctx *confdb;
@@ -879,7 +882,7 @@ static void test_store_custom_done(struct tevent_req *subreq)
     return test_return(data, ret);
 }
 
-static void test_search_custom_done(struct tevent_req *req)
+static void test_search_done(struct tevent_req *req)
 {
     struct test_data *data = tevent_req_callback_data(req, struct test_data);
 
@@ -922,14 +925,6 @@ static void test_delete_custom_done(struct tevent_req *subreq)
     return test_return(data, ret);
 }
 
-static void test_asq_search_done(struct tevent_req *req)
-{
-    struct test_data *data = tevent_req_callback_data(req, struct test_data);
-
-    data->finished = true;
-    return;
-}
-
 static void test_search_all_users_done(struct tevent_req *subreq);
 static void test_search_all_users(struct tevent_req *subreq)
 {
@@ -1011,6 +1006,57 @@ static void test_delete_recursive_done(struct tevent_req *subreq)
     return test_return(data, ret);
 }
 
+static void test_memberof_store_group_done(struct tevent_req *subreq);
+static void test_memberof_store_group(struct tevent_req *req)
+{
+    struct test_data *data = tevent_req_callback_data(req, struct test_data);
+    struct tevent_req *subreq;
+    int ret;
+    struct sysdb_attrs *attrs = NULL;
+    char *member;
+    int i;
+
+    ret = sysdb_transaction_recv(req, data, &data->handle);
+    if (ret != EOK) {
+        return test_return(data, ret);
+    }
+
+    attrs = sysdb_new_attrs(data);
+    if (!attrs) {
+        return test_return(data, ENOMEM);
+    }
+    for (i = 0; data->attrlist && data->attrlist[i]; i++) {
+        member = sysdb_group_strdn(data, data->ctx->domain->name,
+                                   data->attrlist[i]);
+        if (!member) {
+            return test_return(data, ENOMEM);
+        }
+        ret = sysdb_attrs_steal_string(attrs, SYSDB_MEMBER, member);
+        if (ret != EOK) {
+            return test_return(data, ret);
+        }
+    }
+
+    subreq = sysdb_store_group_send(data, data->ev, data->handle,
+                                    data->ctx->domain, data->groupname,
+                                    data->gid, attrs, -1);
+    if (!subreq) {
+        test_return(data, ret);
+    }
+    tevent_req_set_callback(subreq, test_memberof_store_group_done, data);
+}
+
+static void test_memberof_store_group_done(struct tevent_req *subreq)
+{
+    struct test_data *data = tevent_req_callback_data(subreq, struct test_data);
+    int ret;
+
+    ret = sysdb_store_group_recv(subreq);
+    talloc_zfree(subreq);
+
+    return test_return(data, ret);
+}
+
 START_TEST (test_sysdb_store_user)
 {
     struct sysdb_test_ctx *test_ctx;
@@ -1935,7 +1981,7 @@ START_TEST (test_sysdb_search_custom_by_name)
     }
 
     if (ret == EOK) {
-        tevent_req_set_callback(subreq, test_search_custom_done, data);
+        tevent_req_set_callback(subreq, test_search_done, data);
 
         ret = test_loop(data);
 
@@ -2061,7 +2107,7 @@ START_TEST (test_sysdb_search_custom_update)
     }
 
     if (ret == EOK) {
-        tevent_req_set_callback(subreq, test_search_custom_done, data);
+        tevent_req_set_callback(subreq, test_search_done, data);
 
         ret = test_loop(data);
 
@@ -2136,7 +2182,7 @@ START_TEST (test_sysdb_search_custom)
     }
 
     if (ret == EOK) {
-        tevent_req_set_callback(subreq, test_search_custom_done, data);
+        tevent_req_set_callback(subreq, test_search_done, data);
 
         ret = test_loop(data);
 
@@ -2264,7 +2310,7 @@ START_TEST (test_sysdb_asq_search)
     }
 
     if (ret == EOK) {
-        tevent_req_set_callback(req, test_asq_search_done, data);
+        tevent_req_set_callback(req, test_search_done, data);
 
         ret = test_loop(data);
 
@@ -2442,6 +2488,409 @@ START_TEST (test_sysdb_attrs_replace_name)
 }
 END_TEST
 
+START_TEST (test_sysdb_memberof_store_group)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->gid = MBO_GROUP_BASE + _i;
+    data->groupname = talloc_asprintf(data, "testgroup%d", data->gid);
+
+    if (_i == 0) {
+        data->attrlist = NULL;
+    } else {
+        data->attrlist = talloc_array(data, const char *, 2);
+        fail_unless(data->attrlist != NULL, "talloc_array failed.");
+        data->attrlist[0] = talloc_asprintf(data, "testgroup%d", data->gid - 1);
+        data->attrlist[1] = NULL;
+    }
+
+    req = sysdb_transaction_send(data, data->ev, test_ctx->sysdb);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_memberof_store_group, data);
+
+        ret = test_loop(data);
+    }
+
+    fail_if(ret != EOK, "Could not store POSIX group #%d", data->gid);
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_close_loop)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->gid = MBO_GROUP_BASE;
+    data->groupname = talloc_asprintf(data, "testgroup%d", data->gid);
+
+    data->attrlist = talloc_array(data, const char *, 2);
+    fail_unless(data->attrlist != NULL, "talloc_array failed.");
+    data->attrlist[0] = talloc_asprintf(data, "testgroup%d", data->gid + 9);
+    data->attrlist[1] = NULL;
+
+    req = sysdb_transaction_send(data, data->ev, test_ctx->sysdb);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_memberof_store_group, data);
+
+        ret = test_loop(data);
+    }
+
+    fail_if(ret != EOK, "Could not store POSIX group #%d", data->gid);
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_store_user)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->uid = MBO_USER_BASE + _i;
+    data->gid = 0; /* MPG domain */
+    data->username = talloc_asprintf(data, "testuser%d", data->uid);
+
+    req = sysdb_transaction_send(data, data->ev, test_ctx->sysdb);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_store_user, data);
+
+        ret = test_loop(data);
+    }
+
+    fail_if(ret != EOK, "Could not store user %s", data->username);
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_add_group_member)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->groupname = talloc_asprintf(data, "testgroup%d", _i + MBO_GROUP_BASE);
+    data->uid = MBO_USER_BASE + _i;
+
+    req = sysdb_transaction_send(data, data->ev, test_ctx->sysdb);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_add_group_member, data);
+
+        ret = test_loop(data);
+    }
+
+    fail_if(ret != EOK, "Could not modify group %s", data->groupname);
+
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_check_memberuid_without_group_5)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->gid = _i + MBO_GROUP_BASE;
+
+    data->attrlist = talloc_array(data, const char *, 2);
+    fail_unless(data->attrlist != NULL, "tallo_array failed.");
+    data->attrlist[0] = "memberuid";
+    data->attrlist[1] = NULL;
+
+    req = sysdb_search_group_by_gid_send(data, data->ev, test_ctx->sysdb, NULL,
+                                         data->ctx->domain,
+                                         _i + MBO_GROUP_BASE,
+                                         data->attrlist);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_search_done, data);
+
+        ret = test_loop(data);
+
+        ret = sysdb_search_group_recv(req, data, &data->msg);
+        talloc_zfree(req);
+        if (_i == 5) {
+            fail_unless(ret == ENOENT,
+                        "sysdb_search_group_by_gid_send found "
+                        "already deleted group");
+            ret = EOK;
+        } else {
+            fail_unless(ret == EOK, "sysdb_search_group_by_gid_send failed");
+
+            fail_unless(data->msg->num_elements == 1,
+                        "Wrong number of results, expected [1] got [%d]",
+                        data->msg->num_elements);
+            fail_unless(strcmp(data->msg->elements[0].name, "memberuid") == 0,
+                        "Wrong attribute name");
+            fail_unless(data->msg->elements[0].num_values == ((_i + 1) % 6),
+                        "Wrong number of attribute values, "
+                        "expected [%d] got [%d]", ((_i + 1) % 6),
+                        data->msg->elements[0].num_values);
+        }
+    }
+
+    fail_if(ret != EOK, "Could not check group %d", data->gid);
+
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_check_memberuid)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->gid = _i + MBO_GROUP_BASE;
+
+    data->attrlist = talloc_array(data, const char *, 2);
+    fail_unless(data->attrlist != NULL, "tallo_array failed.");
+    data->attrlist[0] = "memberuid";
+    data->attrlist[1] = NULL;
+
+    req = sysdb_search_group_by_gid_send(data, data->ev, test_ctx->sysdb, NULL,
+                                         data->ctx->domain,
+                                         _i + MBO_GROUP_BASE,
+                                         data->attrlist);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_search_done, data);
+
+        ret = test_loop(data);
+
+        ret = sysdb_search_group_recv(req, data, &data->msg);
+        talloc_zfree(req);
+        fail_unless(ret == EOK, "sysdb_search_group_by_gid_send failed");
+
+        fail_unless(data->msg->num_elements == 1,
+                    "Wrong number of results, expected [1] got [%d]",
+                    data->msg->num_elements);
+        fail_unless(strcmp(data->msg->elements[0].name, "memberuid") == 0,
+                    "Wrong attribute name");
+        fail_unless(data->msg->elements[0].num_values == _i + 1,
+                    "Wrong number of attribute values, expected [%d] got [%d]",
+                    _i + 1, data->msg->elements[0].num_values);
+    }
+
+    fail_if(ret != EOK, "Could not check group %d", data->gid);
+
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_check_memberuid_loop)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->gid = _i + MBO_GROUP_BASE;
+
+    data->attrlist = talloc_array(data, const char *, 2);
+    fail_unless(data->attrlist != NULL, "tallo_array failed.");
+    data->attrlist[0] = "memberuid";
+    data->attrlist[1] = NULL;
+
+    req = sysdb_search_group_by_gid_send(data, data->ev, test_ctx->sysdb, NULL,
+                                         data->ctx->domain,
+                                         _i + MBO_GROUP_BASE,
+                                         data->attrlist);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_search_done, data);
+
+        ret = test_loop(data);
+
+        ret = sysdb_search_group_recv(req, data, &data->msg);
+        talloc_zfree(req);
+        fail_unless(ret == EOK, "sysdb_search_group_by_gid_send failed");
+
+        fail_unless(data->msg->num_elements == 1,
+                    "Wrong number of results, expected [1] got [%d]",
+                    data->msg->num_elements);
+        fail_unless(strcmp(data->msg->elements[0].name, "memberuid") == 0,
+                    "Wrong attribute name");
+        fail_unless(data->msg->elements[0].num_values == 10,
+                    "Wrong number of attribute values, expected [%d] got [%d]",
+                    10, data->msg->elements[0].num_values);
+    }
+
+    fail_if(ret != EOK, "Could not check group %d", data->gid);
+
+    talloc_free(test_ctx);
+}
+END_TEST
+
+START_TEST (test_sysdb_memberof_check_memberuid_loop_without_group_5)
+{
+    struct sysdb_test_ctx *test_ctx;
+    struct test_data *data;
+    struct tevent_req *req;
+    int ret;
+
+    /* Setup */
+    ret = setup_sysdb_tests(&test_ctx);
+    if (ret != EOK) {
+        fail("Could not set up the test");
+        return;
+    }
+
+    data = talloc_zero(test_ctx, struct test_data);
+    data->ctx = test_ctx;
+    data->ev = test_ctx->ev;
+    data->gid = _i + MBO_GROUP_BASE;
+
+    data->attrlist = talloc_array(data, const char *, 2);
+    fail_unless(data->attrlist != NULL, "tallo_array failed.");
+    data->attrlist[0] = "memberuid";
+    data->attrlist[1] = NULL;
+
+    req = sysdb_search_group_by_gid_send(data, data->ev, test_ctx->sysdb, NULL,
+                                         data->ctx->domain,
+                                         _i + MBO_GROUP_BASE,
+                                         data->attrlist);
+    if (!req) {
+        ret = ENOMEM;
+    }
+
+    if (ret == EOK) {
+        tevent_req_set_callback(req, test_search_done, data);
+
+        ret = test_loop(data);
+
+        ret = sysdb_search_group_recv(req, data, &data->msg);
+        talloc_zfree(req);
+        if (_i == 5) {
+            fail_unless(ret == ENOENT,
+                        "sysdb_search_group_by_gid_send found "
+                        "already deleted group");
+            ret = EOK;
+        } else {
+            fail_unless(ret == EOK, "sysdb_search_group_by_gid_send failed");
+
+            fail_unless(data->msg->num_elements == 1,
+                        "Wrong number of results, expected [1] got [%d]",
+                        data->msg->num_elements);
+            fail_unless(strcmp(data->msg->elements[0].name, "memberuid") == 0,
+                        "Wrong attribute name");
+            fail_unless(data->msg->elements[0].num_values == ((_i + 5) % 10),
+                        "Wrong number of attribute values, expected [%d] got [%d]",
+                        ((_i + 5) % 10), data->msg->elements[0].num_values);
+        }
+    }
+
+    fail_if(ret != EOK, "Could not check group %d", data->gid);
+
+    talloc_free(test_ctx);
+}
+END_TEST
+
 Suite *create_sysdb_suite(void)
 {
     Suite *s = suite_create("sysdb");
@@ -2542,6 +2991,39 @@ Suite *create_sysdb_suite(void)
 /* Add all test cases to the test suite */
     suite_add_tcase(s, tc_sysdb);
 
+    TCase *tc_memberof = tcase_create("SYSDB member/memberof/memberuid Tests");
+
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_store_group, 0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_store_user, 0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_add_group_member,
+                        0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_check_memberuid,
+                        0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_remove_local_group_by_gid,
+                        MBO_GROUP_BASE + 5, MBO_GROUP_BASE + 6);
+    tcase_add_loop_test(tc_memberof,
+                        test_sysdb_memberof_check_memberuid_without_group_5,
+                        0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_remove_local_group_by_gid,
+                        MBO_GROUP_BASE , MBO_GROUP_BASE + 10);
+
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_store_group, 0, 10);
+    tcase_add_test(tc_memberof, test_sysdb_memberof_close_loop);
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_store_user, 0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_add_group_member,
+                        0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_memberof_check_memberuid_loop,
+                        0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_remove_local_group_by_gid,
+                        MBO_GROUP_BASE + 5, MBO_GROUP_BASE + 6);
+    tcase_add_loop_test(tc_memberof,
+                        test_sysdb_memberof_check_memberuid_loop_without_group_5,
+                        0, 10);
+    tcase_add_loop_test(tc_memberof, test_sysdb_remove_local_group_by_gid,
+                        MBO_GROUP_BASE , MBO_GROUP_BASE + 10);
+
+    suite_add_tcase(s, tc_memberof);
+
     return s;
 }
 
-- 
1.6.5.2



More information about the sssd-devel mailing list