lib/ldb: add unit test for ldb_ldap internal code
authorAlexander Bokovoy <ab@samba.org>
Thu, 18 Jun 2020 08:49:08 +0000 (11:49 +0300)
committerAndreas Schneider <asn@cryptomilk.org>
Fri, 19 Jun 2020 07:16:37 +0000 (07:16 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14413
Signed-off-by: Alexander Bokovoy <ab@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
lib/ldb/tests/lldb_ldap.c [new file with mode: 0644]
lib/ldb/wscript

diff --git a/lib/ldb/tests/lldb_ldap.c b/lib/ldb/tests/lldb_ldap.c
new file mode 100644 (file)
index 0000000..eea9f22
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * from cmocka.c:
+ * These headers or their equivalents should be included prior to
+ * including
+ * this header file.
+ *
+ * #include <stdarg.h>
+ * #include <stddef.h>
+ * #include <setjmp.h>
+ *
+ * This allows test applications to use custom definitions of C standard
+ * library functions and types.
+ */
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include <errno.h>
+#include <unistd.h>
+#include <talloc.h>
+
+#include <ldb.h>
+#include <ldb_private.h>
+#include <string.h>
+#include <ctype.h>
+
+int ldb_ldap_init(const char *version);
+
+#include "ldb_ldap/ldb_ldap.c"
+
+struct test_ctx {
+       struct tevent_context *ev;
+       struct ldb_context *ldb;
+       struct ldb_message *msg;
+};
+
+static int lldb_msg_setup(void **state)
+{
+       struct test_ctx *test_ctx;
+
+       test_ctx = talloc_zero(NULL, struct test_ctx);
+       assert_non_null(test_ctx);
+
+       test_ctx->ev = tevent_context_init(test_ctx);
+       assert_non_null(test_ctx->ev);
+
+       test_ctx->ldb = ldb_init(test_ctx, test_ctx->ev);
+       assert_non_null(test_ctx->ldb);
+
+       test_ctx->msg = ldb_msg_new(test_ctx);
+       assert_non_null(test_ctx->msg);
+
+       *state = test_ctx;
+       return 0;
+}
+
+static int lldb_msg_teardown(void **state)
+{
+       struct test_ctx *test_ctx = talloc_get_type_abort(*state,
+                                                         struct test_ctx);
+
+       talloc_free(test_ctx);
+       return 0;
+}
+
+static void test_lldb_add_msg_attr(void **state)
+{
+       struct test_ctx *test_ctx = talloc_get_type_abort(*state,
+                                                         struct test_ctx);
+       struct ldb_message *msg = test_ctx->msg;
+       int ret;
+       unsigned int num_elements = 0;
+       struct berval **v = NULL;
+
+       v = talloc_zero_array(test_ctx, struct berval *, 2);
+       assert_non_null(v);
+
+       v[0] = talloc_zero(v, struct berval);
+       assert_non_null(v[0]);
+
+       v[0]->bv_val = talloc_strdup(msg, "dc=example,dc=test");
+       assert_non_null(v[0]->bv_val);
+
+       v[0]->bv_len = strlen(v[0]->bv_val);
+
+       num_elements = msg->num_elements;
+
+       ret = lldb_add_msg_attr(test_ctx->ldb, msg, "defaultNamingContext", v);
+       assert_int_equal(ret, LDB_SUCCESS);
+       assert_int_equal(msg->num_elements, num_elements + 1);
+}
+
+
+int main(int argc, const char **argv)
+{
+       const struct CMUnitTest tests[] = {
+               cmocka_unit_test_setup_teardown(test_lldb_add_msg_attr,
+                                               lldb_msg_setup,
+                                               lldb_msg_teardown),
+       };
+
+       return cmocka_run_group_tests(tests, NULL, NULL);
+}
index 6dbd88aa304f0be242aa81399c62e2b50a332ca7..f374f64aeab93240a21d7458c11cf53fe5009e72 100644 (file)
@@ -527,6 +527,15 @@ def build(bld):
                          deps='cmocka ldb ldb_tdb_err_map',
                          install=False)
 
+        # If both libldap and liblber are available, test ldb_ldap
+        # code for a regression of bz#14413 -- even if we don't build
+        # it ourselves and simply using the system version
+        if bld.env.LIB_LDAP and bld.env.LIB_LBER:
+            bld.SAMBA_BINARY('lldb_ldap_test',
+                             source='tests/lldb_ldap.c',
+                             deps='cmocka talloc lber ldap ldb',
+                             install=False)
+
         if bld.CONFIG_SET('HAVE_LMDB'):
             bld.SAMBA_BINARY('ldb_mdb_mod_op_test',
                              source='tests/ldb_mod_op_test.c',
@@ -628,6 +637,11 @@ def test(ctx):
                  # 'ldb_key_value_sub_txn_tdb_test'
                  'ldb_parse_test']
 
+    # if LIB_LDAP and LIB_LBER defined, then we can test ldb_ldap backend
+    # behavior regression for bz#14413
+    if env.LIB_LDAP and env.LIB_LBER:
+        test_exes += ["lldb_ldap_test"]
+
     if env.HAVE_LMDB:
         test_exes += ['ldb_mdb_mod_op_test',
                       'ldb_lmdb_test',