From eb4205fc31830f4227667e245395d81d3b3654cb Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 23 Mar 2018 11:10:25 +1300 Subject: [PATCH] ldb: Allow GUID index mode to be tested on TDB Signed-off-by: Andrew Bartlett Reviewed-by: Gary Lockyer --- lib/ldb/tests/ldb_mod_op_test.c | 149 +++++++++++++++++++++++++++----- lib/ldb/wscript | 11 ++- 2 files changed, 138 insertions(+), 22 deletions(-) diff --git a/lib/ldb/tests/ldb_mod_op_test.c b/lib/ldb/tests/ldb_mod_op_test.c index ab5f99ad2dbf..a7ba26ca1914 100644 --- a/lib/ldb/tests/ldb_mod_op_test.c +++ b/lib/ldb/tests/ldb_mod_op_test.c @@ -202,6 +202,16 @@ static void test_ldif_message_redacted(void **state) static int ldbtest_setup(void **state) { struct ldbtest_ctx *test_ctx; + struct ldb_ldif *ldif; +#ifdef GUID_IDX + const char *index_ldif = \ + "dn: @INDEXLIST\n" + "@IDXGUID: objectUUID\n" + "@IDX_DN_GUID: GUID\n" + "\n"; +#else + const char *index_ldif = "\n"; +#endif int ret; ldbtest_noconn_setup((void **) &test_ctx); @@ -209,6 +219,10 @@ static int ldbtest_setup(void **state) ret = ldb_connect(test_ctx->ldb, test_ctx->dbpath, 0, NULL); assert_int_equal(ret, 0); + while ((ldif = ldb_ldif_read_string(test_ctx->ldb, &index_ldif))) { + ret = ldb_add(test_ctx->ldb, ldif->msg); + assert_int_equal(ret, LDB_SUCCESS); + } *state = test_ctx; return 0; } @@ -241,6 +255,9 @@ static void test_ldb_add(void **state) ret = ldb_msg_add_string(msg, "cn", "test_cn_val"); assert_int_equal(ret, 0); + ret = ldb_msg_add_string(msg, "objectUUID", "0123456789abcdef"); + assert_int_equal(ret, 0); + ret = ldb_add(test_ctx->ldb, msg); assert_int_equal(ret, 0); @@ -279,6 +296,9 @@ static void test_ldb_search(void **state) ret = ldb_msg_add_string(msg, "cn", "test_cn_val1"); assert_int_equal(ret, 0); + ret = ldb_msg_add_string(msg, "objectUUID", "0123456789abcde1"); + assert_int_equal(ret, 0); + ret = ldb_add(test_ctx->ldb, msg); assert_int_equal(ret, 0); @@ -294,6 +314,9 @@ static void test_ldb_search(void **state) ret = ldb_msg_add_string(msg, "cn", "test_cn_val2"); assert_int_equal(ret, 0); + ret = ldb_msg_add_string(msg, "objectUUID", "0123456789abcde2"); + assert_int_equal(ret, 0); + ret = ldb_add(test_ctx->ldb, msg); assert_int_equal(ret, 0); @@ -390,7 +413,8 @@ static void assert_dn_doesnt_exist(struct ldbtest_ctx *test_ctx, static void add_dn_with_cn(struct ldbtest_ctx *test_ctx, struct ldb_dn *dn, - const char *cn_value) + const char *cn_value, + const char *uuid_value) { int ret; TALLOC_CTX *tmp_ctx; @@ -409,6 +433,9 @@ static void add_dn_with_cn(struct ldbtest_ctx *test_ctx, ret = ldb_msg_add_string(msg, "cn", cn_value); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg, "objectUUID", uuid_value); + assert_int_equal(ret, 0); + ret = ldb_add(test_ctx->ldb, msg); assert_int_equal(ret, LDB_SUCCESS); @@ -428,7 +455,9 @@ static void test_ldb_del(void **state) dn = ldb_dn_new_fmt(test_ctx, test_ctx->ldb, "%s", basedn); assert_non_null(dn); - add_dn_with_cn(test_ctx, dn, "test_del_cn_val"); + add_dn_with_cn(test_ctx, dn, + "test_del_cn_val", + "0123456789abcdef"); ret = ldb_delete(test_ctx->ldb, dn); assert_int_equal(ret, LDB_SUCCESS); @@ -552,7 +581,8 @@ static void test_ldb_build_search_req(void **state) static void add_keyval(struct ldbtest_ctx *test_ctx, const char *key, - const char *val) + const char *val, + const char *uuid) { int ret; struct ldb_message *msg; @@ -566,6 +596,9 @@ static void add_keyval(struct ldbtest_ctx *test_ctx, ret = ldb_msg_add_string(msg, key, val); assert_int_equal(ret, 0); + ret = ldb_msg_add_string(msg, "objectUUID", uuid); + assert_int_equal(ret, 0); + ret = ldb_add(test_ctx->ldb, msg); assert_int_equal(ret, 0); @@ -601,7 +634,8 @@ static void test_transactions(void **state) ret = ldb_transaction_start(test_ctx->ldb); assert_int_equal(ret, 0); - add_keyval(test_ctx, "vegetable", "carrot"); + add_keyval(test_ctx, "vegetable", "carrot", + "0123456789abcde0"); /* commit lev-0 transaction */ ret = ldb_transaction_commit(test_ctx->ldb); @@ -611,7 +645,8 @@ static void test_transactions(void **state) ret = ldb_transaction_start(test_ctx->ldb); assert_int_equal(ret, 0); - add_keyval(test_ctx, "fruit", "apple"); + add_keyval(test_ctx, "fruit", "apple", + "0123456789abcde1"); /* abort lev-1 nested transaction */ ret = ldb_transaction_cancel(test_ctx->ldb); @@ -637,14 +672,16 @@ static void test_nested_transactions(void **state) ret = ldb_transaction_start(test_ctx->ldb); assert_int_equal(ret, 0); - add_keyval(test_ctx, "vegetable", "carrot"); + add_keyval(test_ctx, "vegetable", "carrot", + "0123456789abcde0"); /* start another lev-1 nested transaction */ ret = ldb_transaction_start(test_ctx->ldb); assert_int_equal(ret, 0); - add_keyval(test_ctx, "fruit", "apple"); + add_keyval(test_ctx, "fruit", "apple", + "0123456789abcde1"); /* abort lev-1 nested transaction */ ret = ldb_transaction_cancel(test_ctx->ldb); @@ -825,6 +862,7 @@ static int ldb_modify_test_setup(void **state) struct ldb_mod_test_ctx *mod_test_ctx; struct keyval kvs[] = { { "cn", "test_mod_cn" }, + { "objectUUID", "0123456789abcdef"}, { NULL, NULL }, }; @@ -1129,6 +1167,7 @@ static int ldb_search_test_setup(void **state) { "cn", "test_search_cn2" }, { "uid", "test_search_uid" }, { "uid", "test_search_uid2" }, + { "objectUUID", "0123456789abcde0"}, { NULL, NULL }, }; struct keyval kvs2[] = { @@ -1136,6 +1175,7 @@ static int ldb_search_test_setup(void **state) { "cn", "test_search_2_cn2" }, { "uid", "test_search_2_uid" }, { "uid", "test_search_2_uid2" }, + { "objectUUID", "0123456789abcde1"}, { NULL, NULL }, }; @@ -1532,6 +1572,12 @@ static int test_ldb_search_against_transaction_callback1(struct ldb_request *req exit(LDB_ERR_OPERATIONS_ERROR); } + ret = ldb_msg_add_string(msg, "objectUUID", + "0123456789abcdef"); + if (ret != 0) { + exit(ret); + } + ret = ldb_add(ctx->test_ctx->ldb, msg); if (ret != 0) { exit(ret); @@ -1894,13 +1940,16 @@ static void test_ldb_modify_during_search(void **state, bool add_index, ret = ldb_msg_add_string(msg, "@IDXATTR", "cn"); assert_int_equal(ret, LDB_SUCCESS); - ret = ldb_add(search_test_ctx->ldb_test_ctx->ldb, msg); - + if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) { + msg->elements[0].flags = LDB_FLAG_MOD_ADD; + ret = ldb_modify(search_test_ctx->ldb_test_ctx->ldb, + msg); + } assert_int_equal(ret, LDB_SUCCESS); } - + tevent_loop_allow_nesting(search_test_ctx->ldb_test_ctx->ev); ctx.basedn @@ -2436,6 +2485,7 @@ static int ldb_case_test_setup(void **state) struct keyval kvs[] = { { "cn", "CaseInsensitiveValue" }, { "uid", "CaseSensitiveValue" }, + { "objectUUID", "0123456789abcdef" }, { NULL, NULL }, }; @@ -2649,6 +2699,11 @@ static void test_ldb_attrs_index_handler(void **state) /* Add the index (actually any modify will do) */ while ((ldif = ldb_ldif_read_string(ldb_test_ctx->ldb, &index_ldif))) { ret = ldb_add(ldb_test_ctx->ldb, ldif->msg); + if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) { + ldif->msg->elements[0].flags = LDB_FLAG_MOD_ADD; + ret = ldb_modify(ldb_test_ctx->ldb, + ldif->msg); + } assert_int_equal(ret, LDB_SUCCESS); } @@ -2734,7 +2789,8 @@ static int ldb_rename_test_setup(void **state) add_dn_with_cn(ldb_test_ctx, rename_test_ctx->basedn, - "test_rename_cn_val"); + "test_rename_cn_val", + "0123456789abcde0"); *state = rename_test_ctx; return 0; @@ -2839,7 +2895,8 @@ static void test_ldb_rename_to_exists(void **state) add_dn_with_cn(rename_test_ctx->ldb_test_ctx, new_dn, - "test_rename_cn_val"); + "test_rename_cn_val", + "0123456789abcde1"); ret = ldb_rename(rename_test_ctx->ldb_test_ctx->ldb, rename_test_ctx->basedn, @@ -3006,6 +3063,10 @@ static void test_read_only(void **state) ret = ldb_msg_add_string(msg, "cn", "test_cn_val"); assert_int_equal(ret, 0); + ret = ldb_msg_add_string(msg, "objectUUID", + "0123456789abcde1"); + assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_add(ro_ldb, msg); assert_int_equal(ret, LDB_ERR_UNWILLING_TO_PERFORM); TALLOC_FREE(msg); @@ -3025,6 +3086,10 @@ static void test_read_only(void **state) ret = ldb_msg_add_string(msg, "cn", "test_cn_val"); assert_int_equal(ret, 0); + ret = ldb_msg_add_string(msg, "objectUUID", + "0123456789abcde2"); + assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_add(rw_ldb, msg); assert_int_equal(ret, LDB_SUCCESS); TALLOC_FREE(msg); @@ -3098,6 +3163,10 @@ static int ldb_unique_index_test_setup(void **state) const char *index_ldif = \ "dn: @INDEXLIST\n" "@IDXATTR: cn\n" +#ifdef GUID_IDX + "@IDXGUID: objectUUID\n" + "@IDX_DN_GUID: GUID\n" +#endif "\n"; const char *options[] = {"modules:unique_index_test", NULL}; @@ -3186,6 +3255,10 @@ static void test_ldb_add_unique_value_to_unique_index(void **state) ret = ldb_msg_add_string(msg, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg, "objectUUID", + "0123456789abcde1"); + assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_add(test_ctx->ldb, msg); assert_int_equal(ret, LDB_SUCCESS); @@ -3200,6 +3273,10 @@ static int ldb_non_unique_index_test_setup(void **state) const char *index_ldif = \ "dn: @INDEXLIST\n" "@IDXATTR: cn\n" +#ifdef GUID_IDX + "@IDXGUID: objectUUID\n" + "@IDX_DN_GUID: GUID\n" +#endif "\n"; const char *options[] = {"modules:unique_index_test", NULL}; @@ -3270,6 +3347,10 @@ static void test_ldb_add_duplicate_value_to_unique_index(void **state) ret = ldb_msg_add_string(msg01, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg01, "objectUUID", + "0123456789abcde1"); + assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_add(test_ctx->ldb, msg01); assert_int_equal(ret, LDB_SUCCESS); @@ -3281,6 +3362,10 @@ static void test_ldb_add_duplicate_value_to_unique_index(void **state) ret = ldb_msg_add_string(msg02, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + + ret = ldb_msg_add_string(msg02, "objectUUID", + "0123456789abcde2"); + assert_int_equal(ret, LDB_SUCCESS); ret = ldb_add(test_ctx->ldb, msg02); assert_int_equal(ret, LDB_ERR_CONSTRAINT_VIOLATION); @@ -3311,6 +3396,9 @@ static void test_ldb_add_to_index_duplicates_allowed(void **state) ret = ldb_msg_add_string(msg01, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg01, "objectUUID", + "0123456789abcde1"); + ret = ldb_add(test_ctx->ldb, msg01); assert_int_equal(ret, LDB_SUCCESS); @@ -3323,6 +3411,9 @@ static void test_ldb_add_to_index_duplicates_allowed(void **state) ret = ldb_msg_add_string(msg02, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg02, "objectUUID", + "0123456789abcde2"); + ret = ldb_add(test_ctx->ldb, msg02); assert_int_equal(ret, LDB_SUCCESS); talloc_free(tmp_ctx); @@ -3352,6 +3443,9 @@ static void test_ldb_add_to_index_unique_values_required(void **state) ret = ldb_msg_add_string(msg01, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg01, "objectUUID", + "0123456789abcde1"); + ret = ldb_add(test_ctx->ldb, msg01); assert_int_equal(ret, LDB_SUCCESS); @@ -3364,6 +3458,9 @@ static void test_ldb_add_to_index_unique_values_required(void **state) ret = ldb_msg_add_string(msg02, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg02, "objectUUID", + "0123456789abcde2"); + ret = ldb_add(test_ctx->ldb, msg02); assert_int_equal(ret, LDB_ERR_CONSTRAINT_VIOLATION); talloc_free(tmp_ctx); @@ -3389,10 +3486,10 @@ static void test_ldb_unique_index_duplicate_logging(void **state) char *debug_string = NULL; char *p = NULL; - /* The non-GUID mode is not compatible with mdb */ - if (strcmp(TEST_BE, "mdb") == 0) { - return; - } + /* The GUID mode is not compatible with this test */ +#ifdef GUID_IDX + return; +#endif ldb_set_debug(test_ctx->ldb, ldb_debug_string, &debug_string); tmp_ctx = talloc_new(test_ctx); @@ -3407,6 +3504,9 @@ static void test_ldb_unique_index_duplicate_logging(void **state) ret = ldb_msg_add_string(msg01, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg01, "objectUUID", + "0123456789abcde1"); + ret = ldb_add(test_ctx->ldb, msg01); assert_int_equal(ret, LDB_SUCCESS); @@ -3419,6 +3519,9 @@ static void test_ldb_unique_index_duplicate_logging(void **state) ret = ldb_msg_add_string(msg02, "cn", "test_unique_index"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg02, "objectUUID", + "0123456789abcde2"); + ret = ldb_add(test_ctx->ldb, msg02); assert_int_equal(ret, LDB_ERR_CONSTRAINT_VIOLATION); @@ -3443,10 +3546,10 @@ static void test_ldb_duplicate_dn_logging(void **state) TALLOC_CTX *tmp_ctx; char *debug_string = NULL; - /* The non-GUID mode is not compatible with mdb */ - if (strcmp(TEST_BE, "mdb") == 0) { - return; - } + /* The GUID mode is not compatible with this test */ +#ifdef GUID_IDX + return; +#endif ldb_set_debug(test_ctx->ldb, ldb_debug_string, &debug_string); tmp_ctx = talloc_new(test_ctx); @@ -3461,6 +3564,9 @@ static void test_ldb_duplicate_dn_logging(void **state) ret = ldb_msg_add_string(msg01, "cn", "test_unique_index01"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg01, "objectUUID", + "0123456789abcde1"); + ret = ldb_add(test_ctx->ldb, msg01); assert_int_equal(ret, LDB_SUCCESS); @@ -3473,6 +3579,9 @@ static void test_ldb_duplicate_dn_logging(void **state) ret = ldb_msg_add_string(msg02, "cn", "test_unique_index02"); assert_int_equal(ret, LDB_SUCCESS); + ret = ldb_msg_add_string(msg02, "objectUUID", + "0123456789abcde2"); + ret = ldb_add(test_ctx->ldb, msg02); assert_int_equal(ret, LDB_ERR_ENTRY_ALREADY_EXISTS); diff --git a/lib/ldb/wscript b/lib/ldb/wscript index 1c9573f1cc4f..4bf820fbd429 100644 --- a/lib/ldb/wscript +++ b/lib/ldb/wscript @@ -353,6 +353,12 @@ def build(bld): deps='cmocka ldb', install=False) + bld.SAMBA_BINARY('ldb_tdb_guid_mod_op_test', + source='tests/ldb_mod_op_test.c', + cflags='-DTEST_BE=\"tdb\" -DGUID_IDX=1', + deps='cmocka ldb', + install=False) + bld.SAMBA_BINARY('ldb_msg_test', source='tests/ldb_msg.c', deps='cmocka ldb', @@ -390,9 +396,10 @@ def test(ctx): print("Python testsuite returned %d" % pyret) cmocka_ret = 0 - for test_exe in ['ldb_tdb_mod_op_test', + for test_exe in ['test_ldb_qsort', 'ldb_msg_test', - 'test_ldb_qsort']: + 'ldb_tdb_mod_op_test', + 'ldb_tdb_guid_mod_op_test']: cmd = os.path.join(Utils.g_module.blddir, test_exe) cmocka_ret = cmocka_ret or samba_utils.RUN_COMMAND(cmd) -- 2.34.1