ldb: Allow GUID index mode to be tested on TDB
authorAndrew Bartlett <abartlet@samba.org>
Thu, 22 Mar 2018 22:10:25 +0000 (11:10 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 6 Apr 2018 00:08:44 +0000 (02:08 +0200)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
lib/ldb/tests/ldb_mod_op_test.c
lib/ldb/wscript

index ab5f99ad2dbf44c7eecbd0b3422fce0d6c1eb526..a7ba26ca19141f0f76bafa34dcf7030ac89ec0b4 100644 (file)
@@ -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);
 
index 1c9573f1cc4f5008302b18f9b0e963ec9a79ca5f..4bf820fbd429468a5e17ba1d2658bf49831bea46 100644 (file)
@@ -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)