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",
54 flags
[i
] |MAYBE_NOSYNC
,
55 O_RDWR
|O_CREAT
|O_TRUNC
, 0600, NULL
);
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
);
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);
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);
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,
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;
160 return exit_status();