From 12c8b67ef6355f9527b53f274cc7a1acc1648dcb Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl@samba.org>
Date: Wed, 29 Mar 2023 09:07:19 -0400
Subject: [PATCH] torture3: Add tdb-validate test

Bug: https://bugzilla.samba.org/show_bug.cgi?id=14789
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
---
 selftest/knownfail.d/tdb-validate   |  1 +
 source3/selftest/tests.py           |  1 +
 source3/torture/proto.h             |  1 +
 source3/torture/test_tdb_validate.c | 68 +++++++++++++++++++++++++++++
 source3/torture/torture.c           |  4 ++
 source3/torture/wscript_build       |  2 +
 6 files changed, 77 insertions(+)
 create mode 100644 selftest/knownfail.d/tdb-validate
 create mode 100644 source3/torture/test_tdb_validate.c

diff --git a/selftest/knownfail.d/tdb-validate b/selftest/knownfail.d/tdb-validate
new file mode 100644
index 00000000000..bde5821433f
--- /dev/null
+++ b/selftest/knownfail.d/tdb-validate
@@ -0,0 +1 @@
+samba3.smbtorture_s3.LOCAL-TDB-VALIDATE.smbtorture
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 31112d4be9f..47234896ed6 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -503,6 +503,7 @@ local_tests = [
     "LOCAL-G-LOCK8",
     "LOCAL-NAMEMAP-CACHE1",
     "LOCAL-IDMAP-CACHE1",
+    "LOCAL-TDB-VALIDATE",
     "LOCAL-hex_encode_buf",
     "LOCAL-remove_duplicate_addrs2"]
 
diff --git a/source3/torture/proto.h b/source3/torture/proto.h
index 5e6d914c3da..a67a771ef45 100644
--- a/source3/torture/proto.h
+++ b/source3/torture/proto.h
@@ -176,5 +176,6 @@ bool run_hidenewfiles_showdirs(int dummy);
 bool run_readdir_timestamp(int dummy);
 bool run_ctdbd_conn1(int dummy);
 bool run_rpc_scale(int dummy);
+bool run_tdb_validate(int dummy);
 
 #endif /* __TORTURE_H__ */
diff --git a/source3/torture/test_tdb_validate.c b/source3/torture/test_tdb_validate.c
new file mode 100644
index 00000000000..4768512e159
--- /dev/null
+++ b/source3/torture/test_tdb_validate.c
@@ -0,0 +1,68 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "source3/include/includes.h"
+#include <tdb.h>
+#include "source3/torture/proto.h"
+#include "source3/lib/tdb_validate.h"
+
+static int validate_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA value,
+		       void *private_data)
+{
+	struct tdb_validation_status *state = private_data;
+	state->success = false;
+	printf("validate_fn called\n");
+	return -1;
+}
+
+bool run_tdb_validate(int dummy)
+{
+	const char tdb_name[] = "tdb_validate.tdb";
+	bool result = false;
+	struct tdb_context *tdb = NULL;
+	char buf[] = "data";
+	TDB_DATA data = { .dptr = (uint8_t *)buf, .dsize = sizeof(buf), };
+	int ret;
+
+	unlink(tdb_name);
+
+	tdb = tdb_open(tdb_name, 0, 0, O_CREAT|O_EXCL|O_RDWR, 0600);
+	if (tdb == NULL) {
+		perror("Could not open tdb");
+		goto done;
+	}
+
+	ret = tdb_store(tdb, data, data, 0);
+	if (ret == -1) {
+		perror("tdb_store failed");
+		goto done;
+	}
+
+	ret = tdb_validate(tdb, validate_fn);
+	if (ret == 0) {
+		fprintf(stderr,
+			"tdb_validate succeeded where it should have "
+			"failed\n");
+		goto done;
+	}
+
+	result = true;
+done:
+	tdb_close(tdb);
+	unlink(tdb_name);
+	return result;
+}
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index c63db3f9385..a2db49ea45f 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -15635,6 +15635,10 @@ static struct {
 		.name  = "rpc-scale",
 		.fn    = run_rpc_scale,
 	},
+	{
+		.name  = "LOCAL-TDB-VALIDATE",
+		.fn    = run_tdb_validate,
+	},
 	{
 		.name = NULL,
 	},
diff --git a/source3/torture/wscript_build b/source3/torture/wscript_build
index 1df5d88cd31..1d2520099e3 100644
--- a/source3/torture/wscript_build
+++ b/source3/torture/wscript_build
@@ -59,6 +59,7 @@ bld.SAMBA3_BINARY('smbtorture' + bld.env.suffix3,
                         test_hidenewfiles.c
                         test_readdir_timestamp.c
                         test_rpc_scale.c
+                        test_tdb_validate.c
                         ''' + TORTURE3_ADDITIONAL_SOURCE,
                  deps='''
                       talloc
@@ -75,6 +76,7 @@ bld.SAMBA3_BINARY('smbtorture' + bld.env.suffix3,
                       libcli_lsa3
                       samba-cluster-support
                       util_sd
+                      TDB_VALIDATE
                       ''',
                  cflags='-DWINBINDD_SOCKET_DIR=\"%s\"' % bld.env.WINBINDD_SOCKET_DIR,
                  for_selftest=True)