summaryrefslogtreecommitdiffstats
path: root/src/tests/cmocka/test_sdap.c
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2015-09-04 18:45:45 +0200
committerJakub Hrozek <jhrozek@redhat.com>2015-09-22 13:46:02 +0200
commitfb83de0699b16e7d8eca803305e2112795807b4c (patch)
tree8becc37d1ca208ee3ee60dd274d421fb4344e6a1 /src/tests/cmocka/test_sdap.c
parentcf66c53e46fad46f47489f43265c58004e0e39d4 (diff)
downloadsssd-fb83de0699b16e7d8eca803305e2112795807b4c.tar.gz
sssd-fb83de0699b16e7d8eca803305e2112795807b4c.tar.xz
sssd-fb83de0699b16e7d8eca803305e2112795807b4c.zip
LDAP: Filter out multiple entries when searching overlapping domains
In case domain overlap, we might download multiple objects. To avoid saving them all, we attempt to filter out the objects from foreign domains. We can only do this optimization for non-wildcard lookups. Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Diffstat (limited to 'src/tests/cmocka/test_sdap.c')
-rw-r--r--src/tests/cmocka/test_sdap.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/tests/cmocka/test_sdap.c b/src/tests/cmocka/test_sdap.c
index 75fc34504..86c940c89 100644
--- a/src/tests/cmocka/test_sdap.c
+++ b/src/tests/cmocka/test_sdap.c
@@ -941,6 +941,184 @@ static void test_sdap_inherit_option_user(void **state)
talloc_free(test_ctx->child_sdap_opts->user_map[SDAP_AT_USER_PRINC].name);
}
+struct copy_dom_obj_test_ctx {
+ struct sdap_options *opts;
+
+ struct sss_domain_info *parent;
+ struct sss_domain_info *child;
+
+ struct sdap_domain *parent_sd;
+ struct sdap_domain *child_sd;
+
+ struct sysdb_attrs **ldap_objects;
+ struct sysdb_attrs **dom_objects;
+};
+
+static struct sysdb_attrs *test_obj(TALLOC_CTX *mem_ctx,
+ const char *name,
+ const char *basedn)
+{
+ errno_t ret;
+ const char *orig_dn;
+ struct sysdb_attrs *obj;
+
+ obj = sysdb_new_attrs(mem_ctx);
+ assert_non_null(obj);
+
+ orig_dn = talloc_asprintf(obj, "CN=%s,%s", name, basedn);
+ assert_non_null(orig_dn);
+
+ ret = sysdb_attrs_add_string(obj, SYSDB_ORIG_DN, orig_dn);
+ assert_int_equal(ret, EOK);
+
+ ret = sysdb_attrs_add_string(obj, SYSDB_NAME, name);
+ assert_int_equal(ret, EOK);
+
+ return obj;
+}
+
+static struct sdap_domain *create_sdap_domain(struct sdap_options *opts,
+ struct sss_domain_info *dom)
+{
+ errno_t ret;
+ struct sdap_domain *sdom;
+
+ ret = sdap_domain_add(opts, dom, &sdom);
+ assert_int_equal(ret, EOK);
+
+ sdom->search_bases = talloc_array(sdom, struct sdap_search_base *, 2);
+ assert_non_null(sdom->search_bases);
+ sdom->search_bases[1] = NULL;
+
+ ret = sdap_create_search_base(sdom, sdom->basedn,
+ LDAP_SCOPE_SUBTREE,
+ NULL,
+ &sdom->search_bases[0]);
+ assert_int_equal(ret, EOK);
+
+ return sdom;
+}
+
+static int sdap_copy_objects_in_dom_setup(void **state)
+{
+ struct copy_dom_obj_test_ctx *test_ctx;
+
+ test_ctx = talloc_zero(NULL,
+ struct copy_dom_obj_test_ctx);
+ assert_non_null(test_ctx);
+
+ test_ctx->opts = talloc_zero(test_ctx, struct sdap_options);
+ assert_non_null(test_ctx->opts);
+
+ test_ctx->parent = named_domain(test_ctx, "win.trust.test", NULL);
+ assert_non_null(test_ctx->parent);
+
+ test_ctx->child = named_domain(test_ctx, "child.win.trust.test",
+ test_ctx->parent);
+ assert_non_null(test_ctx->child);
+
+ test_ctx->parent_sd = create_sdap_domain(test_ctx->opts,
+ test_ctx->parent);
+ assert_non_null(test_ctx->parent_sd);
+
+ test_ctx->child_sd = create_sdap_domain(test_ctx->opts,
+ test_ctx->child);
+ assert_non_null(test_ctx->child_sd);
+
+ /* These two objects were 'returned by LDAP' */
+ test_ctx->ldap_objects = talloc_zero_array(test_ctx,
+ struct sysdb_attrs *, 2);
+ assert_non_null(test_ctx->ldap_objects);
+
+ test_ctx->ldap_objects[0] = test_obj(test_ctx->ldap_objects, "parent",
+ test_ctx->parent_sd->basedn);
+ assert_non_null(test_ctx->ldap_objects[0]);
+
+ test_ctx->ldap_objects[1] = test_obj(test_ctx->ldap_objects, "child",
+ test_ctx->child_sd->basedn);
+ assert_non_null(test_ctx->ldap_objects[1]);
+
+ /* This is the array we'll filter to */
+ test_ctx->dom_objects = talloc_zero_array(test_ctx,
+ struct sysdb_attrs *, 2);
+ assert_non_null(test_ctx->dom_objects);
+
+ *state = test_ctx;
+ return 0;
+}
+
+static int sdap_copy_objects_in_dom_teardown(void **state)
+{
+ struct copy_dom_obj_test_ctx *test_ctx = talloc_get_type_abort(*state,
+ struct copy_dom_obj_test_ctx);
+
+ talloc_free(test_ctx);
+ return 0;
+}
+
+static void test_sdap_copy_objects_in_dom(void **state)
+{
+ struct copy_dom_obj_test_ctx *test_ctx = talloc_get_type_abort(*state,
+ struct copy_dom_obj_test_ctx);
+ size_t count;
+
+ assert_ptr_equal(talloc_parent(test_ctx->ldap_objects[0]),
+ test_ctx->ldap_objects);
+ assert_ptr_equal(talloc_parent(test_ctx->ldap_objects[1]),
+ test_ctx->ldap_objects);
+
+ assert_null(test_ctx->dom_objects[0]);
+ assert_null(test_ctx->dom_objects[1]);
+
+ count = sdap_steal_objects_in_dom(test_ctx->opts,
+ test_ctx->dom_objects,
+ 0,
+ test_ctx->parent,
+ test_ctx->ldap_objects,
+ 2, true);
+ assert_int_equal(count, 1);
+
+ assert_non_null(test_ctx->dom_objects[0]);
+ assert_non_null(test_ctx->dom_objects[0] == test_ctx->ldap_objects[0]);
+ assert_null(test_ctx->dom_objects[1]);
+
+ assert_ptr_equal(talloc_parent(test_ctx->ldap_objects[0]),
+ test_ctx->dom_objects);
+
+ count = sdap_steal_objects_in_dom(test_ctx->opts,
+ test_ctx->dom_objects,
+ 1,
+ test_ctx->child,
+ test_ctx->ldap_objects,
+ 2, true);
+ assert_int_equal(count, 1);
+
+ assert_non_null(test_ctx->dom_objects[1]);
+ assert_non_null(test_ctx->dom_objects[1] == test_ctx->ldap_objects[1]);
+ assert_ptr_equal(talloc_parent(test_ctx->ldap_objects[1]),
+ test_ctx->dom_objects);
+}
+
+static void test_sdap_copy_objects_in_dom_nofilter(void **state)
+{
+ struct copy_dom_obj_test_ctx *test_ctx = talloc_get_type_abort(*state,
+ struct copy_dom_obj_test_ctx);
+ size_t count;
+
+ count = sdap_steal_objects_in_dom(test_ctx->opts,
+ test_ctx->dom_objects,
+ 0,
+ test_ctx->parent,
+ test_ctx->ldap_objects,
+ 2, false);
+ assert_int_equal(count, 2);
+
+ assert_ptr_equal(talloc_parent(test_ctx->ldap_objects[0]),
+ test_ctx->dom_objects);
+ assert_ptr_equal(talloc_parent(test_ctx->ldap_objects[1]),
+ test_ctx->dom_objects);
+}
+
int main(int argc, const char *argv[])
{
poptContext pc;
@@ -1008,6 +1186,14 @@ int main(int argc, const char *argv[])
cmocka_unit_test_setup_teardown(test_sdap_inherit_option_user,
test_sdap_inherit_option_setup,
test_sdap_inherit_option_teardown),
+
+ /* Per-domain object filter tests */
+ cmocka_unit_test_setup_teardown(test_sdap_copy_objects_in_dom,
+ sdap_copy_objects_in_dom_setup,
+ sdap_copy_objects_in_dom_teardown),
+ cmocka_unit_test_setup_teardown(test_sdap_copy_objects_in_dom_nofilter,
+ sdap_copy_objects_in_dom_setup,
+ sdap_copy_objects_in_dom_teardown),
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */