ptr_valid: test whether a ptr is valid.
[ccan] / ccan / ptr_valid / test / run.c
1 #include <ccan/ptr_valid/ptr_valid.h>
2 /* Include the C files directly. */
3 #include <ccan/ptr_valid/ptr_valid.c>
4 #include <ccan/tap/tap.h>
5 #include <sys/mman.h>
6
7 static bool check_batch(char *p, unsigned int num, bool expect)
8 {
9         struct ptr_valid_batch batch;
10         unsigned int i;
11
12         if (!ptr_valid_batch_start(&batch))
13                 return false;
14         for (i = 0; i < num; i++) {
15                 if (ptr_valid_batch(&batch, p + i, 1, 1, false) != expect)
16                         return false;
17                 if (ptr_valid_batch(&batch, p + i, 1, 1, true) != expect)
18                         return false;
19         }
20         ptr_valid_batch_end(&batch);
21         return true;
22 }
23
24 int main(void)
25 {
26         char *page;
27
28         /* This is how many tests you plan to run */
29         plan_tests(30);
30
31         page = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE,
32                     MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
33         ok1(ptr_valid_read(page));
34         ok1(ptr_valid_write(page));
35         ok1(ptr_valid(page, 1, getpagesize(), false));
36         ok1(ptr_valid(page, 1, getpagesize(), true));
37
38         /* Test alignment constraints. */
39         ok1(ptr_valid(page, getpagesize(), getpagesize(), false));
40         ok1(ptr_valid(page, getpagesize(), getpagesize(), true));
41         ok1(!ptr_valid(page+1, getpagesize(), 1, false));
42         ok1(!ptr_valid(page+1, getpagesize(), 1, true));
43
44         /* Test batch. */
45         ok1(check_batch(page, getpagesize(), true));
46
47         /* Unmap, all should fail. */
48         munmap(page, getpagesize());
49         ok1(!ptr_valid_read(page));
50         ok1(!ptr_valid_write(page));
51         ok1(!ptr_valid(page, 1, getpagesize(), false));
52         ok1(!ptr_valid(page, 1, getpagesize(), true));
53
54         /* Test alignment constraints. */
55         ok1(!ptr_valid(page, getpagesize(), getpagesize(), false));
56         ok1(!ptr_valid(page, getpagesize(), getpagesize(), true));
57         ok1(!ptr_valid(page+1, getpagesize(), 1, false));
58         ok1(!ptr_valid(page, getpagesize(), 1, true));
59
60         /* Test batch (slow, since each fails, so reduce count). */
61         ok1(check_batch(page, 4, false));
62
63         /* Check read-only */
64         page = mmap(NULL, getpagesize(), PROT_READ,
65                     MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
66         ok1(ptr_valid_read(page));
67         ok1(!ptr_valid_write(page));
68         ok1(ptr_valid(page, 1, getpagesize(), false));
69         ok1(!ptr_valid(page, 1, getpagesize(), true));
70
71         /* Test alignment constraints. */
72         ok1(ptr_valid(page, getpagesize(), getpagesize(), false));
73         ok1(!ptr_valid(page, getpagesize(), getpagesize(), true));
74         ok1(!ptr_valid(page+1, getpagesize(), 1, false));
75         ok1(!ptr_valid(page+1, getpagesize(), 1, true));
76         munmap(page, getpagesize());
77
78         /* Check for overrun. */
79         page = mmap(NULL, getpagesize()*2, PROT_READ|PROT_WRITE,
80                     MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
81         munmap(page + getpagesize(), getpagesize());
82
83         ok1(ptr_valid(page, 1, getpagesize(), false));
84         ok1(ptr_valid(page, 1, getpagesize(), true));
85         ok1(!ptr_valid(page, 1, getpagesize()+1, false));
86         ok1(!ptr_valid(page, 1, getpagesize()+1, true));
87
88         /* This exits depending on whether all tests passed */
89         return exit_status();
90 }