jmap: fix aliasing issues, one real testcase bug
[ccan] / ccan / jmap / test / run-access-count.c
1 /* Test our access counting failures. */
2 #include <ccan/jmap/jmap.c>
3 #include <ccan/tap/tap.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6 #include <unistd.h>
7
8 int main(int argc, char *argv[])
9 {
10         struct jmap *map;
11         size_t *value;
12         int status;
13
14         plan_tests(9);
15
16         map = jmap_new();
17         ok1(jmap_error(map) == NULL);
18         ok1(jmap_add(map, 0, 1));
19
20         /* add while holding value. */
21         value = jmap_getval(map, 0);
22         ok1(value);
23         if (!fork()) {
24                 jmap_add(map, 1, 2);
25                 exit(0);
26         } else {
27                 wait(&status);
28                 ok1(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT);
29         }
30         jmap_putval(map, &value);
31
32         /* del while holding value. */
33         value = jmap_getval(map, 0);
34         ok1(value);
35         if (!fork()) {
36                 jmap_del(map, 0);
37                 exit(0);
38         } else {
39                 wait(&status);
40                 ok1(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT);
41         }
42         jmap_putval(map, &value);
43
44         ok1(jmap_add(map, 0, 1));
45
46         /* set while holding value ok. */
47         value = jmap_getval(map, 0);
48         ok1(value);
49         if (!fork()) {
50                 jmap_set(map, 0, 2);
51                 exit(0);
52         } else {
53                 wait(&status);
54                 ok1(WIFEXITED(status) && WEXITSTATUS(status) == 0);
55         }
56         jmap_putval(map, &value);
57
58         /* FIXME: test jmap_nthval, jmap_firstval etc. */
59         jmap_free(map);
60
61         return exit_status();
62 }