docs: Update man 7 samba.
[Samba/gebeck_regimport.git] / lib / ntdb / test / run-90-get-set-attributes.c
blob5548aa4f7e0fbd53f2b27aecbb1ecf5036bda829
1 #include "ntdb-source.h"
2 #include "tap-interface.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 uint32_t hash_fn(const void *key, size_t len, uint32_t seed,
17 void *priv)
19 return 0;
22 int main(int argc, char *argv[])
24 unsigned int i;
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",
54 flags[i] |MAYBE_NOSYNC,
55 O_RDWR|O_CREAT|O_TRUNC, 0600, NULL);
56 ok1(ntdb);
58 /* Get log on no attributes will fail */
59 attr.base.attr = NTDB_ATTRIBUTE_LOG;
60 ok1(ntdb_get_attribute(ntdb, &attr) == NTDB_ERR_NOEXIST);
61 /* These always work. */
62 attr.base.attr = NTDB_ATTRIBUTE_HASH;
63 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
64 ok1(attr.base.attr == NTDB_ATTRIBUTE_HASH);
65 ok1(attr.hash.fn == ntdb_jenkins_hash);
66 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
67 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
68 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
69 ok1(attr.flock.lock == ntdb_fcntl_lock);
70 ok1(attr.flock.unlock == ntdb_fcntl_unlock);
71 attr.base.attr = NTDB_ATTRIBUTE_SEED;
72 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
73 ok1(attr.base.attr == NTDB_ATTRIBUTE_SEED);
74 /* This is possible, just astronomically unlikely. */
75 ok1(attr.seed.seed != 0);
77 /* Unset attributes. */
78 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
79 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
81 /* Set them. */
82 ok1(ntdb_set_attribute(ntdb, &tap_log_attr) == 0);
83 ok1(ntdb_set_attribute(ntdb, &lock_attr) == 0);
84 /* These should fail. */
85 ok1(ntdb_set_attribute(ntdb, &seed_attr) == NTDB_ERR_EINVAL);
86 ok1(tap_log_messages == 1);
87 ok1(ntdb_set_attribute(ntdb, &hash_attr) == NTDB_ERR_EINVAL);
88 ok1(tap_log_messages == 2);
89 tap_log_messages = 0;
91 /* Getting them should work as expected. */
92 attr.base.attr = NTDB_ATTRIBUTE_LOG;
93 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
94 ok1(attr.base.attr == NTDB_ATTRIBUTE_LOG);
95 ok1(attr.log.fn == tap_log_attr.log.fn);
96 ok1(attr.log.data == tap_log_attr.log.data);
98 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
99 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
100 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
101 ok1(attr.flock.lock == mylock);
102 ok1(attr.flock.unlock == myunlock);
103 ok1(attr.flock.data == &lock_attr);
105 /* Unset them again. */
106 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
107 ok1(tap_log_messages == 0);
108 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
109 ok1(tap_log_messages == 0);
111 ntdb_close(ntdb);
112 ok1(tap_log_messages == 0);
114 /* Now open with all attributes. */
115 ntdb = ntdb_open("run-90-get-set-attributes.ntdb",
116 flags[i] | MAYBE_NOSYNC,
117 O_RDWR|O_CREAT|O_TRUNC, 0600,
118 &seed_attr);
120 ok1(ntdb);
122 /* Get will succeed */
123 attr.base.attr = NTDB_ATTRIBUTE_LOG;
124 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
125 ok1(attr.base.attr == NTDB_ATTRIBUTE_LOG);
126 ok1(attr.log.fn == tap_log_attr.log.fn);
127 ok1(attr.log.data == tap_log_attr.log.data);
129 attr.base.attr = NTDB_ATTRIBUTE_HASH;
130 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
131 ok1(attr.base.attr == NTDB_ATTRIBUTE_HASH);
132 ok1(attr.hash.fn == hash_fn);
133 ok1(attr.hash.data == &hash_attr);
135 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
136 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
137 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
138 ok1(attr.flock.lock == mylock);
139 ok1(attr.flock.unlock == myunlock);
140 ok1(attr.flock.data == &lock_attr);
142 attr.base.attr = NTDB_ATTRIBUTE_SEED;
143 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
144 ok1(attr.base.attr == NTDB_ATTRIBUTE_SEED);
145 ok1(attr.seed.seed == seed_attr.seed.seed);
147 /* Unset attributes. */
148 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_HASH);
149 ok1(tap_log_messages == 1);
150 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_SEED);
151 ok1(tap_log_messages == 2);
152 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
153 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
154 ok1(tap_log_messages == 2);
155 tap_log_messages = 0;
157 ntdb_close(ntdb);
160 return exit_status();