summaryrefslogtreecommitdiffstats
path: root/src/tests/sysdb-tests.c
diff options
context:
space:
mode:
authorStephen Gallagher <sgallagh@redhat.com>2010-07-23 13:20:40 -0400
committerStephen Gallagher <sgallagh@redhat.com>2010-10-08 19:51:16 -0400
commit5e26273e53adbdb4ab65b6c9259240219587154a (patch)
tree17092942b10219e173f48a4b9a8b23264c422a39 /src/tests/sysdb-tests.c
parent37c1fabc077375ed2f40ba1f5fa6274ba281c133 (diff)
downloadsssd-5e26273e53adbdb4ab65b6c9259240219587154a.tar.gz
sssd-5e26273e53adbdb4ab65b6c9259240219587154a.tar.xz
sssd-5e26273e53adbdb4ab65b6c9259240219587154a.zip
Clean up initgroups processing for RFC2307
Instead of recursively updating all users of each group the user being queried belongs to, just add or remove membership for the requested user. Resolves: rhbz#617623
Diffstat (limited to 'src/tests/sysdb-tests.c')
-rw-r--r--src/tests/sysdb-tests.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
index 8557be5ad..5bdc00547 100644
--- a/src/tests/sysdb-tests.c
+++ b/src/tests/sysdb-tests.c
@@ -3124,6 +3124,200 @@ START_TEST (test_sysdb_memberof_check_memberuid_loop_without_group_5)
}
END_TEST
+START_TEST (test_sysdb_attrs_to_list)
+{
+ struct sysdb_attrs *attrs_list[3];
+ char **list;
+ errno_t ret;
+
+ TALLOC_CTX *test_ctx = talloc_new(NULL);
+
+ attrs_list[0] = sysdb_new_attrs(test_ctx);
+ sysdb_attrs_add_string(attrs_list[0], "test_attr", "attr1");
+ attrs_list[1] = sysdb_new_attrs(test_ctx);
+ sysdb_attrs_add_string(attrs_list[1], "test_attr", "attr2");
+ attrs_list[2] = sysdb_new_attrs(test_ctx);
+ sysdb_attrs_add_string(attrs_list[2], "nottest_attr", "attr3");
+
+ ret = sysdb_attrs_to_list(test_ctx, attrs_list, 3,
+ "test_attr", &list);
+ fail_unless(ret == EOK, "sysdb_attrs_to_list failed with code %d", ret);
+
+ fail_unless(strcmp(list[0],"attr1") == 0, "Expected [attr1], got [%s]",
+ list[0]);
+ fail_unless(strcmp(list[1],"attr2") == 0, "Expected [attr2], got [%s]",
+ list[1]);
+ fail_unless(list[2] == NULL, "List should be NULL-terminated");
+
+ talloc_free(test_ctx);
+}
+END_TEST
+
+static void test_sysdb_update_members_add(struct tevent_req *req);
+START_TEST (test_sysdb_update_members)
+{
+ 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;
+
+ /* Start the transaction */
+ req = sysdb_transaction_send(data, data->ev, test_ctx->sysdb);
+ if (!req) {
+ ret = ENOMEM;
+ }
+
+ if (ret == EOK) {
+ tevent_req_set_callback(req, test_sysdb_update_members_add, data);
+
+ ret = test_loop(data);
+ }
+
+ fail_if(ret != EOK, "Could not test sysdb_update_members");
+ talloc_free(test_ctx);
+}
+END_TEST
+
+static void test_sysdb_update_members_add_del(struct tevent_req *req);
+static void test_sysdb_update_members_add(struct tevent_req *req)
+{
+ struct test_data *data = tevent_req_callback_data(req, struct test_data);
+ char **add_groups;
+ char *user;
+ errno_t ret;
+
+ ret = sysdb_transaction_recv(req, data, &data->handle);
+ talloc_zfree(req);
+ if (ret != EOK) {
+ DEBUG(0, ("Could not start transaction\n"));
+ test_return(data, ret);
+ return;
+ }
+
+ /* Add a user to two groups */
+ data->username = talloc_strdup(data, "testuser27000");
+ user = talloc_strdup(data, data->username);
+ add_groups = talloc_array(data, char *, 3);
+ add_groups[0] = talloc_strdup(data, "testgroup28001");
+ add_groups[1] = talloc_strdup(data, "testgroup28002");
+ add_groups[2] = NULL;
+
+ req = sysdb_update_members_send(data, data->ev, data->handle,
+ data->ctx->domain, user,
+ add_groups, NULL);
+ talloc_free(add_groups);
+ talloc_free(user);
+ if (!req) {
+ DEBUG(0, ("Could not add groups\n"));
+ test_return(data, EIO);
+ return;
+ }
+
+ tevent_req_set_callback(req, test_sysdb_update_members_add_del, data);
+}
+
+static void test_sysdb_update_members_del(struct tevent_req *req);
+static void test_sysdb_update_members_add_del(struct tevent_req *req)
+{
+ struct test_data *data = tevent_req_callback_data(req, struct test_data);
+ errno_t ret;
+ char **add_groups = NULL;
+ char **del_groups = NULL;
+ char *user;
+
+ ret = sysdb_update_members_recv(req);
+ talloc_zfree(req);
+ if (ret != EOK) {
+ DEBUG(0, ("Group addition failed [%d](%s)\n", ret, strerror(ret)));
+ test_return(data, ret);
+ return;
+ }
+
+ /* Remove a user from one group and add to another */
+ user = talloc_strdup(data, data->username);
+ del_groups = talloc_array(data, char *, 2);
+ del_groups[0] = talloc_strdup(del_groups, "testgroup28001");
+ del_groups[1] = NULL;
+ add_groups = talloc_array(data, char *, 2);
+ add_groups[0] = talloc_strdup(add_groups, "testgroup28003");
+ add_groups[1] = NULL;
+
+ req = sysdb_update_members_send(data, data->ev, data->handle,
+ data->ctx->domain, user,
+ add_groups, del_groups);
+ talloc_free(add_groups);
+ talloc_free(del_groups);
+ talloc_free(user);
+ if (!req) {
+ DEBUG(0, ("Could not add/del groups\n"));
+ test_return(data, EIO);
+ return;
+ }
+
+ tevent_req_set_callback(req, test_sysdb_update_members_del, data);
+}
+
+static void test_sysdb_update_members_done(struct tevent_req *req);
+static void test_sysdb_update_members_del(struct tevent_req *req)
+{
+ struct test_data *data = tevent_req_callback_data(req, struct test_data);
+ errno_t ret;
+ char **del_groups = NULL;
+ char *user;
+
+ ret = sysdb_update_members_recv(req);
+ talloc_zfree(req);
+ if (ret != EOK) {
+ DEBUG(0, ("Group replace failed [%d](%s)\n", ret, strerror(ret)));
+ test_return(data, EIO);
+ return;
+ }
+
+ /* Remove a user from one group and add to another */
+ user = talloc_strdup(data, data->username);
+ del_groups = talloc_array(data, char *, 3);
+ del_groups[0] = talloc_strdup(del_groups, "testgroup28002");
+ del_groups[1] = talloc_strdup(del_groups, "testgroup28003");
+ del_groups[2] = NULL;
+
+ req = sysdb_update_members_send(data, data->ev, data->handle,
+ data->ctx->domain, user,
+ NULL, del_groups);
+ talloc_free(del_groups);
+ talloc_free(user);
+ if (!req) {
+ DEBUG(0, ("Could not del groups\n"));
+ test_return(data, EIO);
+ return;
+ }
+
+ tevent_req_set_callback(req, test_sysdb_update_members_done, data);
+}
+
+static void test_sysdb_update_members_done(struct tevent_req *req)
+{
+ struct test_data *data = tevent_req_callback_data(req, struct test_data);
+ errno_t ret;
+
+ ret = sysdb_update_members_recv(req);
+ talloc_zfree(req);
+ if (ret != EOK) {
+ DEBUG(0, ("Group delete failed [%d](%s)\n", ret, strerror(ret)));
+ }
+ test_return(data, ret);
+}
+
Suite *create_sysdb_suite(void)
{
Suite *s = suite_create("sysdb");
@@ -3148,6 +3342,9 @@ Suite *create_sysdb_suite(void)
/* test the change */
tcase_add_loop_test(tc_sysdb, test_sysdb_get_user_attr, 27000, 27010);
+ /* Add and remove users in a group with sysdb_update_members */
+ tcase_add_test(tc_sysdb, test_sysdb_update_members);
+
/* Remove the other half by gid */
tcase_add_loop_test(tc_sysdb, test_sysdb_remove_local_group_by_gid, 28000, 28010);
@@ -3233,6 +3430,8 @@ Suite *create_sysdb_suite(void)
tcase_add_test(tc_sysdb, test_sysdb_attrs_replace_name);
+ tcase_add_test(tc_sysdb, test_sysdb_attrs_to_list);
+
/* Add all test cases to the test suite */
suite_add_tcase(s, tc_sysdb);