1 #include "ntdb-source.h"
2 #include "tap-interface.h"
5 static int mylock(int fd, int rw, off_t off, off_t len, bool waitflag,
11 static int myunlock(int fd, int rw, off_t off, off_t len, void *unused)
16 static uint32_t hash_fn(const void *key, size_t len, uint32_t seed,
22 int main(int argc, char *argv[])
25 struct ntdb_context *ntdb;
26 int flags[] = { NTDB_DEFAULT, NTDB_NOMMAP,
27 NTDB_CONVERT, NTDB_NOMMAP|NTDB_CONVERT };
28 union ntdb_attribute seed_attr;
29 union ntdb_attribute hash_attr;
30 union ntdb_attribute lock_attr;
32 seed_attr.base.attr = NTDB_ATTRIBUTE_SEED;
33 seed_attr.base.next = &hash_attr;
34 seed_attr.seed.seed = 100;
36 hash_attr.base.attr = NTDB_ATTRIBUTE_HASH;
37 hash_attr.base.next = &lock_attr;
38 hash_attr.hash.fn = hash_fn;
39 hash_attr.hash.data = &hash_attr;
41 lock_attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
42 lock_attr.base.next = &tap_log_attr;
43 lock_attr.flock.lock = mylock;
44 lock_attr.flock.unlock = myunlock;
45 lock_attr.flock.data = &lock_attr;
47 plan_tests(sizeof(flags) / sizeof(flags[0]) * 50);
49 for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
50 union ntdb_attribute attr;
52 /* First open with no attributes. */
53 ntdb = ntdb_open("run-90-get-set-attributes.ntdb", flags[i],
54 O_RDWR|O_CREAT|O_TRUNC, 0600, NULL);
57 /* Get log on no attributes will fail */
58 attr.base.attr = NTDB_ATTRIBUTE_LOG;
59 ok1(ntdb_get_attribute(ntdb, &attr) == NTDB_ERR_NOEXIST);
60 /* These always work. */
61 attr.base.attr = NTDB_ATTRIBUTE_HASH;
62 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
63 ok1(attr.base.attr == NTDB_ATTRIBUTE_HASH);
64 ok1(attr.hash.fn == ntdb_jenkins_hash);
65 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
66 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
67 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
68 ok1(attr.flock.lock == ntdb_fcntl_lock);
69 ok1(attr.flock.unlock == ntdb_fcntl_unlock);
70 attr.base.attr = NTDB_ATTRIBUTE_SEED;
71 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
72 ok1(attr.base.attr == NTDB_ATTRIBUTE_SEED);
73 /* This is possible, just astronomically unlikely. */
74 ok1(attr.seed.seed != 0);
76 /* Unset attributes. */
77 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
78 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
81 ok1(ntdb_set_attribute(ntdb, &tap_log_attr) == 0);
82 ok1(ntdb_set_attribute(ntdb, &lock_attr) == 0);
83 /* These should fail. */
84 ok1(ntdb_set_attribute(ntdb, &seed_attr) == NTDB_ERR_EINVAL);
85 ok1(tap_log_messages == 1);
86 ok1(ntdb_set_attribute(ntdb, &hash_attr) == NTDB_ERR_EINVAL);
87 ok1(tap_log_messages == 2);
90 /* Getting them should work as expected. */
91 attr.base.attr = NTDB_ATTRIBUTE_LOG;
92 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
93 ok1(attr.base.attr == NTDB_ATTRIBUTE_LOG);
94 ok1(attr.log.fn == tap_log_attr.log.fn);
95 ok1(attr.log.data == tap_log_attr.log.data);
97 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
98 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
99 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
100 ok1(attr.flock.lock == mylock);
101 ok1(attr.flock.unlock == myunlock);
102 ok1(attr.flock.data == &lock_attr);
104 /* Unset them again. */
105 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
106 ok1(tap_log_messages == 0);
107 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
108 ok1(tap_log_messages == 0);
111 ok1(tap_log_messages == 0);
113 /* Now open with all attributes. */
114 ntdb = ntdb_open("run-90-get-set-attributes.ntdb", flags[i],
115 O_RDWR|O_CREAT|O_TRUNC, 0600,
120 /* Get will succeed */
121 attr.base.attr = NTDB_ATTRIBUTE_LOG;
122 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
123 ok1(attr.base.attr == NTDB_ATTRIBUTE_LOG);
124 ok1(attr.log.fn == tap_log_attr.log.fn);
125 ok1(attr.log.data == tap_log_attr.log.data);
127 attr.base.attr = NTDB_ATTRIBUTE_HASH;
128 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
129 ok1(attr.base.attr == NTDB_ATTRIBUTE_HASH);
130 ok1(attr.hash.fn == hash_fn);
131 ok1(attr.hash.data == &hash_attr);
133 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
134 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
135 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
136 ok1(attr.flock.lock == mylock);
137 ok1(attr.flock.unlock == myunlock);
138 ok1(attr.flock.data == &lock_attr);
140 attr.base.attr = NTDB_ATTRIBUTE_SEED;
141 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
142 ok1(attr.base.attr == NTDB_ATTRIBUTE_SEED);
143 ok1(attr.seed.seed == seed_attr.seed.seed);
145 /* Unset attributes. */
146 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_HASH);
147 ok1(tap_log_messages == 1);
148 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_SEED);
149 ok1(tap_log_messages == 2);
150 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
151 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
152 ok1(tap_log_messages == 2);
153 tap_log_messages = 0;
158 return exit_status();