s3/torture: test rbtree TDB_INSERT and TDB_MODIFY flags
authorDavid Disseldorp <ddiss@samba.org>
Tue, 9 Jun 2020 16:21:11 +0000 (18:21 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 10 Jun 2020 20:28:45 +0000 (20:28 +0000)
Confirm that record overwrite with TDB_INSERT and record insert with
TDB_MODIFY both fail with appropriate error values.

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Wed Jun 10 20:28:45 UTC 2020 on sn-devel-184

source3/torture/torture.c

index b83f6499757ac9785cf880ec8f457b00963c9217..2a3133373e95ceabd495e4a1cb47e0fa5285f0a0 100644 (file)
@@ -12880,6 +12880,54 @@ static bool run_local_gencache(int dummy)
        return True;
 }
 
+static bool rbt_testflags(struct db_context *db, const char *key,
+                         const char *value)
+{
+       bool ret = false;
+       NTSTATUS status;
+       struct db_record *rec;
+
+       rec = dbwrap_fetch_locked(db, db, string_tdb_data(key));
+       if (rec == NULL) {
+               d_fprintf(stderr, "fetch_locked failed\n");
+               goto done;
+       }
+
+       status = dbwrap_record_store(rec, string_tdb_data(value), TDB_MODIFY);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+               d_fprintf(stderr, "store TDB_MODIFY unexpected status: %s\n",
+                         nt_errstr(status));
+               goto done;
+       }
+
+       status = dbwrap_record_store(rec, string_tdb_data("overwriteme"),
+                                    TDB_INSERT);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_fprintf(stderr, "store TDB_INSERT failed: %s\n",
+                         nt_errstr(status));
+               goto done;
+       }
+
+       status = dbwrap_record_store(rec, string_tdb_data(value), TDB_INSERT);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+               d_fprintf(stderr, "store TDB_INSERT unexpected status: %s\n",
+                         nt_errstr(status));
+               goto done;
+       }
+
+       status = dbwrap_record_store(rec, string_tdb_data(value), TDB_MODIFY);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_fprintf(stderr, "store TDB_MODIFY failed: %s\n",
+                         nt_errstr(status));
+               goto done;
+       }
+
+       ret = true;
+done:
+       TALLOC_FREE(rec);
+       return ret;
+}
+
 static bool rbt_testval(struct db_context *db, const char *key,
                        const char *value)
 {
@@ -12951,7 +12999,11 @@ static bool run_local_rbtree(int dummy)
                return false;
        }
 
-       for (i=0; i<1000; i++) {
+       if (!rbt_testflags(db, "firstkey", "firstval")) {
+               goto done;
+       }
+
+       for (i = 0; i < 999; i++) {
                char key[sizeof("key-9223372036854775807")];
                char value[sizeof("value-9223372036854775807")];