s3:registry: do not use regdb functions during db upgrade
[Samba/gebeck_regimport.git] / lib / tdb2 / test / run-90-get-set-attributes.c
blob4cbbda03c7ef230f23f2ed411e22684041bf52f7
1 #include "tdb2-source.h"
2 #include <ccan/tap/tap.h>
3 #include "logging.h"
5 static int mylock(int fd, int rw, off_t off, off_t len, bool waitflag,
6 void *unused)
8 return 0;
11 static int myunlock(int fd, int rw, off_t off, off_t len, void *unused)
13 return 0;
16 static uint64_t hash_fn(const void *key, size_t len, uint64_t seed,
17 void *priv)
19 return 0;
22 int main(int argc, char *argv[])
24 unsigned int i;
25 struct tdb_context *tdb;
26 int flags[] = { TDB_DEFAULT, TDB_NOMMAP,
27 TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT,
28 TDB_VERSION1, TDB_NOMMAP|TDB_VERSION1,
29 TDB_CONVERT|TDB_VERSION1,
30 TDB_NOMMAP|TDB_CONVERT|TDB_VERSION1 };
31 union tdb_attribute seed_attr;
32 union tdb_attribute hash_attr;
33 union tdb_attribute lock_attr;
35 seed_attr.base.attr = TDB_ATTRIBUTE_SEED;
36 seed_attr.base.next = &hash_attr;
37 seed_attr.seed.seed = 100;
39 hash_attr.base.attr = TDB_ATTRIBUTE_HASH;
40 hash_attr.base.next = &lock_attr;
41 hash_attr.hash.fn = hash_fn;
42 hash_attr.hash.data = &hash_attr;
44 lock_attr.base.attr = TDB_ATTRIBUTE_FLOCK;
45 lock_attr.base.next = &tap_log_attr;
46 lock_attr.flock.lock = mylock;
47 lock_attr.flock.unlock = myunlock;
48 lock_attr.flock.data = &lock_attr;
50 plan_tests(sizeof(flags) / sizeof(flags[0]) * 49
51 + sizeof(flags) / sizeof(flags[0]) / 2);
53 for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
54 union tdb_attribute attr;
56 /* First open with no attributes. */
57 tdb = tdb_open("run-90-get-set-attributes.tdb", flags[i],
58 O_RDWR|O_CREAT|O_TRUNC, 0600, NULL);
59 ok1(tdb);
61 /* Get log on no attributes will fail */
62 attr.base.attr = TDB_ATTRIBUTE_LOG;
63 ok1(tdb_get_attribute(tdb, &attr) == TDB_ERR_NOEXIST);
64 /* These always work. */
65 attr.base.attr = TDB_ATTRIBUTE_HASH;
66 ok1(tdb_get_attribute(tdb, &attr) == 0);
67 ok1(attr.base.attr == TDB_ATTRIBUTE_HASH);
68 if (flags[i] & TDB_VERSION1) {
69 ok1(attr.hash.fn == tdb1_old_hash);
70 } else {
71 ok1(attr.hash.fn == tdb_jenkins_hash);
73 attr.base.attr = TDB_ATTRIBUTE_FLOCK;
74 ok1(tdb_get_attribute(tdb, &attr) == 0);
75 ok1(attr.base.attr == TDB_ATTRIBUTE_FLOCK);
76 ok1(attr.flock.lock == tdb_fcntl_lock);
77 ok1(attr.flock.unlock == tdb_fcntl_unlock);
78 attr.base.attr = TDB_ATTRIBUTE_SEED;
79 if (flags[i] & TDB_VERSION1) {
80 ok1(tdb_get_attribute(tdb, &attr) == TDB_ERR_EINVAL);
81 tap_log_messages = 0;
82 } else {
83 ok1(tdb_get_attribute(tdb, &attr) == 0);
84 ok1(attr.base.attr == TDB_ATTRIBUTE_SEED);
85 /* This is possible, just astronomically unlikely. */
86 ok1(attr.seed.seed != 0);
89 /* Unset attributes. */
90 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_LOG);
91 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_FLOCK);
93 /* Set them. */
94 ok1(tdb_set_attribute(tdb, &tap_log_attr) == 0);
95 ok1(tdb_set_attribute(tdb, &lock_attr) == 0);
96 /* These should fail. */
97 ok1(tdb_set_attribute(tdb, &seed_attr) == TDB_ERR_EINVAL);
98 ok1(tap_log_messages == 1);
99 ok1(tdb_set_attribute(tdb, &hash_attr) == TDB_ERR_EINVAL);
100 ok1(tap_log_messages == 2);
101 tap_log_messages = 0;
103 /* Getting them should work as expected. */
104 attr.base.attr = TDB_ATTRIBUTE_LOG;
105 ok1(tdb_get_attribute(tdb, &attr) == 0);
106 ok1(attr.base.attr == TDB_ATTRIBUTE_LOG);
107 ok1(attr.log.fn == tap_log_attr.log.fn);
108 ok1(attr.log.data == tap_log_attr.log.data);
110 attr.base.attr = TDB_ATTRIBUTE_FLOCK;
111 ok1(tdb_get_attribute(tdb, &attr) == 0);
112 ok1(attr.base.attr == TDB_ATTRIBUTE_FLOCK);
113 ok1(attr.flock.lock == mylock);
114 ok1(attr.flock.unlock == myunlock);
115 ok1(attr.flock.data == &lock_attr);
117 /* Unset them again. */
118 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_FLOCK);
119 ok1(tap_log_messages == 0);
120 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_LOG);
121 ok1(tap_log_messages == 0);
123 tdb_close(tdb);
124 ok1(tap_log_messages == 0);
126 /* Now open with all attributes. */
127 tdb = tdb_open("run-90-get-set-attributes.tdb", flags[i],
128 O_RDWR|O_CREAT|O_TRUNC, 0600,
129 &seed_attr);
131 if (flags[i] & TDB_VERSION1) {
132 ok1(!tdb);
133 ok1(tap_log_messages == 1);
134 tap_log_messages = 0;
135 tdb = tdb_open("run-90-get-set-attributes.tdb", flags[i],
136 O_RDWR|O_CREAT|O_TRUNC, 0600,
137 &hash_attr);
139 ok1(tdb);
141 /* Get will succeed */
142 attr.base.attr = TDB_ATTRIBUTE_LOG;
143 ok1(tdb_get_attribute(tdb, &attr) == 0);
144 ok1(attr.base.attr == TDB_ATTRIBUTE_LOG);
145 ok1(attr.log.fn == tap_log_attr.log.fn);
146 ok1(attr.log.data == tap_log_attr.log.data);
148 attr.base.attr = TDB_ATTRIBUTE_HASH;
149 ok1(tdb_get_attribute(tdb, &attr) == 0);
150 ok1(attr.base.attr == TDB_ATTRIBUTE_HASH);
151 ok1(attr.hash.fn == hash_fn);
152 ok1(attr.hash.data == &hash_attr);
154 attr.base.attr = TDB_ATTRIBUTE_FLOCK;
155 ok1(tdb_get_attribute(tdb, &attr) == 0);
156 ok1(attr.base.attr == TDB_ATTRIBUTE_FLOCK);
157 ok1(attr.flock.lock == mylock);
158 ok1(attr.flock.unlock == myunlock);
159 ok1(attr.flock.data == &lock_attr);
161 attr.base.attr = TDB_ATTRIBUTE_SEED;
162 if (flags[i] & TDB_VERSION1) {
163 ok1(tdb_get_attribute(tdb, &attr) == TDB_ERR_EINVAL);
164 ok1(tap_log_messages == 1);
165 tap_log_messages = 0;
166 } else {
167 ok1(tdb_get_attribute(tdb, &attr) == 0);
168 ok1(attr.base.attr == TDB_ATTRIBUTE_SEED);
169 ok1(attr.seed.seed == seed_attr.seed.seed);
172 /* Unset attributes. */
173 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_HASH);
174 ok1(tap_log_messages == 1);
175 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_SEED);
176 ok1(tap_log_messages == 2);
177 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_FLOCK);
178 tdb_unset_attribute(tdb, TDB_ATTRIBUTE_LOG);
179 ok1(tap_log_messages == 2);
180 tap_log_messages = 0;
182 tdb_close(tdb);
185 return exit_status();