]> git.ozlabs.org Git - ccan/blob - ccan/ntdb/test/run-90-get-set-attributes.c
Fix missing va_end()s
[ccan] / ccan / ntdb / test / run-90-get-set-attributes.c
1 #include "ntdb-source.h"
2 #include "tap-interface.h"
3 #include "logging.h"
4 #include "helprun-external-agent.h"
5
6 static int mylock(int fd, int rw, off_t off, off_t len, bool waitflag,
7                   void *unused)
8 {
9         return 0;
10 }
11
12 static int myunlock(int fd, int rw, off_t off, off_t len, void *unused)
13 {
14         return 0;
15 }
16
17 static uint32_t hash_fn(const void *key, size_t len, uint32_t seed,
18                         void *priv)
19 {
20         return 0;
21 }
22
23 int main(int argc, char *argv[])
24 {
25         unsigned int i;
26         struct ntdb_context *ntdb;
27         int flags[] = { NTDB_DEFAULT, NTDB_NOMMAP,
28                         NTDB_CONVERT, NTDB_NOMMAP|NTDB_CONVERT };
29         union ntdb_attribute seed_attr;
30         union ntdb_attribute hash_attr;
31         union ntdb_attribute lock_attr;
32
33         seed_attr.base.attr = NTDB_ATTRIBUTE_SEED;
34         seed_attr.base.next = &hash_attr;
35         seed_attr.seed.seed = 100;
36
37         hash_attr.base.attr = NTDB_ATTRIBUTE_HASH;
38         hash_attr.base.next = &lock_attr;
39         hash_attr.hash.fn = hash_fn;
40         hash_attr.hash.data = &hash_attr;
41
42         lock_attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
43         lock_attr.base.next = &tap_log_attr;
44         lock_attr.flock.lock = mylock;
45         lock_attr.flock.unlock = myunlock;
46         lock_attr.flock.data = &lock_attr;
47
48         plan_tests(sizeof(flags) / sizeof(flags[0]) * 50);
49
50         for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
51                 union ntdb_attribute attr;
52
53                 /* First open with no attributes. */
54                 ntdb = ntdb_open("run-90-get-set-attributes.ntdb",
55                                  flags[i] |MAYBE_NOSYNC,
56                                  O_RDWR|O_CREAT|O_TRUNC, 0600, NULL);
57                 ok1(ntdb);
58
59                 /* Get log on no attributes will fail */
60                 attr.base.attr = NTDB_ATTRIBUTE_LOG;
61                 ok1(ntdb_get_attribute(ntdb, &attr) == NTDB_ERR_NOEXIST);
62                 /* These always work. */
63                 attr.base.attr = NTDB_ATTRIBUTE_HASH;
64                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
65                 ok1(attr.base.attr == NTDB_ATTRIBUTE_HASH);
66                 ok1(attr.hash.fn == ntdb_jenkins_hash);
67                 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
68                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
69                 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
70                 ok1(attr.flock.lock == ntdb_fcntl_lock);
71                 ok1(attr.flock.unlock == ntdb_fcntl_unlock);
72                 attr.base.attr = NTDB_ATTRIBUTE_SEED;
73                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
74                 ok1(attr.base.attr == NTDB_ATTRIBUTE_SEED);
75                 /* This is possible, just astronomically unlikely. */
76                 ok1(attr.seed.seed != 0);
77
78                 /* Unset attributes. */
79                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
80                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
81
82                 /* Set them. */
83                 ok1(ntdb_set_attribute(ntdb, &tap_log_attr) == 0);
84                 ok1(ntdb_set_attribute(ntdb, &lock_attr) == 0);
85                 /* These should fail. */
86                 ok1(ntdb_set_attribute(ntdb, &seed_attr) == NTDB_ERR_EINVAL);
87                 ok1(tap_log_messages == 1);
88                 ok1(ntdb_set_attribute(ntdb, &hash_attr) == NTDB_ERR_EINVAL);
89                 ok1(tap_log_messages == 2);
90                 tap_log_messages = 0;
91
92                 /* Getting them should work as expected. */
93                 attr.base.attr = NTDB_ATTRIBUTE_LOG;
94                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
95                 ok1(attr.base.attr == NTDB_ATTRIBUTE_LOG);
96                 ok1(attr.log.fn == tap_log_attr.log.fn);
97                 ok1(attr.log.data == tap_log_attr.log.data);
98
99                 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
100                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
101                 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
102                 ok1(attr.flock.lock == mylock);
103                 ok1(attr.flock.unlock == myunlock);
104                 ok1(attr.flock.data == &lock_attr);
105
106                 /* Unset them again. */
107                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
108                 ok1(tap_log_messages == 0);
109                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
110                 ok1(tap_log_messages == 0);
111
112                 ntdb_close(ntdb);
113                 ok1(tap_log_messages == 0);
114
115                 /* Now open with all attributes. */
116                 ntdb = ntdb_open("run-90-get-set-attributes.ntdb",
117                                  flags[i] | MAYBE_NOSYNC,
118                                  O_RDWR|O_CREAT|O_TRUNC, 0600,
119                                  &seed_attr);
120
121                 ok1(ntdb);
122
123                 /* Get will succeed */
124                 attr.base.attr = NTDB_ATTRIBUTE_LOG;
125                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
126                 ok1(attr.base.attr == NTDB_ATTRIBUTE_LOG);
127                 ok1(attr.log.fn == tap_log_attr.log.fn);
128                 ok1(attr.log.data == tap_log_attr.log.data);
129
130                 attr.base.attr = NTDB_ATTRIBUTE_HASH;
131                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
132                 ok1(attr.base.attr == NTDB_ATTRIBUTE_HASH);
133                 ok1(attr.hash.fn == hash_fn);
134                 ok1(attr.hash.data == &hash_attr);
135
136                 attr.base.attr = NTDB_ATTRIBUTE_FLOCK;
137                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
138                 ok1(attr.base.attr == NTDB_ATTRIBUTE_FLOCK);
139                 ok1(attr.flock.lock == mylock);
140                 ok1(attr.flock.unlock == myunlock);
141                 ok1(attr.flock.data == &lock_attr);
142
143                 attr.base.attr = NTDB_ATTRIBUTE_SEED;
144                 ok1(ntdb_get_attribute(ntdb, &attr) == 0);
145                 ok1(attr.base.attr == NTDB_ATTRIBUTE_SEED);
146                 ok1(attr.seed.seed == seed_attr.seed.seed);
147
148                 /* Unset attributes. */
149                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_HASH);
150                 ok1(tap_log_messages == 1);
151                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_SEED);
152                 ok1(tap_log_messages == 2);
153                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_FLOCK);
154                 ntdb_unset_attribute(ntdb, NTDB_ATTRIBUTE_LOG);
155                 ok1(tap_log_messages == 2);
156                 tap_log_messages = 0;
157
158                 ntdb_close(ntdb);
159
160         }
161         return exit_status();
162 }