1 #include "tdb2-source.h"
2 #include <ccan/tap/tap.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 uint64_t hash_fn(const void *key
, size_t len
, uint64_t seed
,
22 int main(int argc
, char *argv
[])
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
);
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
);
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
);
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
);
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);
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,
131 if (flags
[i
] & TDB_VERSION1
) {
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,
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;
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;
185 return exit_status();