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>
7 static bool check_batch(char *p, unsigned int num, bool expect)
9 struct ptr_valid_batch batch;
12 if (!ptr_valid_batch_start(&batch))
14 for (i = 0; i < num; i++) {
15 if (ptr_valid_batch(&batch, p + i, 1, 1, false) != expect)
17 if (ptr_valid_batch(&batch, p + i, 1, 1, true) != expect)
20 ptr_valid_batch_end(&batch);
28 /* This is how many tests you plan to run */
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));
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));
45 ok1(check_batch(page, getpagesize(), true));
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));
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));
60 /* Test batch (slow, since each fails, so reduce count). */
61 ok1(check_batch(page, 4, false));
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));
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());
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());
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));
88 /* This exits depending on whether all tests passed */