1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#define TEST_SMART_MMAP
#include "test.h"
static const size_t corner_cases[] = { 0, 10, 24, 24 + offsetof(struct block_header, contents),
REGION_MIN_SIZE - offsetof(struct block_header, contents), REGION_MIN_SIZE };
static size_t test_length = 0;
static int mmap_counter = 0;
DEFINE_MAP_PAGES_IMPL(fail) {
assert(addr == HEAP_START && length == region_actual_size(test_length + offsetof(struct block_header, contents)));
++mmap_counter;
return MAP_PAGES_FAILURE;
}
// test when mmap failed
DEFINE_TEST(fail) {
USE_MAP_PAGES_IMPL(fail);
for (size_t i = 0; i < sizeof(corner_cases) / sizeof(*corner_cases); ++i) {
test_length = corner_cases[i];
mmap_counter = 0;
fprintf(stderr, "heap_init(%zu)\n", test_length);
assert(heap_init(test_length) == NULL);
assert(mmap_counter == 2);
}
}
static void * mmap_result = NULL;
DEFINE_MAP_PAGES_IMPL(success) {
assert(addr == HEAP_START && length == region_actual_size(test_length + offsetof(struct block_header, contents)));
++mmap_counter;
return (mmap_result = platform_map_pages(addr, length, location));
}
// test when mmap success
DEFINE_TEST(success) {
USE_MAP_PAGES_IMPL(success);
for (size_t i = 0; i < sizeof(corner_cases) / sizeof(*corner_cases); ++i) {
test_length = corner_cases[i];
mmap_counter = 0;
fprintf(stderr, "heap_init(%zu)\n", test_length);
void * const result = heap_init(test_length);
assert(result == mmap_result);
assert(mmap_counter == 1);
unmap_pages(result, region_actual_size(test_length + offsetof(struct block_header, contents)));
}
}
int main() {
RUN_SINGLE_TEST(fail);
RUN_SINGLE_TEST(success);
return 0;
}