1 #include "test_mem.h"
2
3 #include "lwip/mem.h"
4 #include "lwip/stats.h"
5
6 #if !LWIP_STATS || !MEM_STATS
7 #error "This tests needs MEM-statistics enabled"
8 #endif
9 #if LWIP_DNS
10 #error "This test needs DNS turned off (as it mallocs on init)"
11 #endif
12
13 /* Setups/teardown functions */
14
15 static void
mem_setup(void)16 mem_setup(void)
17 {
18 }
19
20 static void
mem_teardown(void)21 mem_teardown(void)
22 {
23 }
24
25
26 /* Test functions */
27
28 /** Call mem_malloc, mem_free and mem_trim and check stats */
START_TEST(test_mem_one)29 START_TEST(test_mem_one)
30 {
31 #define SIZE1 16
32 #define SIZE1_2 12
33 #define SIZE2 16
34 void *p1, *p2;
35 mem_size_t s1, s2;
36 LWIP_UNUSED_ARG(_i);
37
38 fail_unless(lwip_stats.mem.used == 0);
39
40 p1 = mem_malloc(SIZE1);
41 fail_unless(p1 != NULL);
42 fail_unless(lwip_stats.mem.used >= SIZE1);
43 s1 = lwip_stats.mem.used;
44
45 p2 = mem_malloc(SIZE2);
46 fail_unless(p2 != NULL);
47 fail_unless(lwip_stats.mem.used >= SIZE2 + s1);
48 s2 = lwip_stats.mem.used;
49
50 mem_trim(p1, SIZE1_2);
51
52 mem_free(p2);
53 fail_unless(lwip_stats.mem.used <= s2 - SIZE2);
54
55 mem_free(p1);
56 fail_unless(lwip_stats.mem.used == 0);
57 }
58 END_TEST
59
malloc_keep_x(int x,int num,int size,int freestep)60 static void malloc_keep_x(int x, int num, int size, int freestep)
61 {
62 int i;
63 void* p[16];
64 LWIP_ASSERT("invalid size", size >= 0 && size < (mem_size_t)-1);
65 memset(p, 0, sizeof(p));
66 for(i = 0; i < num && i < 16; i++) {
67 p[i] = mem_malloc((mem_size_t)size);
68 fail_unless(p[i] != NULL);
69 }
70 for(i = 0; i < num && i < 16; i += freestep) {
71 if (i == x) {
72 continue;
73 }
74 mem_free(p[i]);
75 p[i] = NULL;
76 }
77 for(i = 0; i < num && i < 16; i++) {
78 if (i == x) {
79 continue;
80 }
81 if (p[i] != NULL) {
82 mem_free(p[i]);
83 p[i] = NULL;
84 }
85 }
86 fail_unless(p[x] != NULL);
87 mem_free(p[x]);
88 }
89
START_TEST(test_mem_random)90 START_TEST(test_mem_random)
91 {
92 const int num = 16;
93 int x;
94 int size;
95 int freestep;
96 LWIP_UNUSED_ARG(_i);
97
98 fail_unless(lwip_stats.mem.used == 0);
99
100 for (x = 0; x < num; x++) {
101 for (size = 1; size < 32; size++) {
102 for (freestep = 1; freestep <= 3; freestep++) {
103 fail_unless(lwip_stats.mem.used == 0);
104 malloc_keep_x(x, num, size, freestep);
105 fail_unless(lwip_stats.mem.used == 0);
106 }
107 }
108 }
109 }
110 END_TEST
111
112 /** Create the suite including all tests for this module */
113 Suite *
mem_suite(void)114 mem_suite(void)
115 {
116 testfunc tests[] = {
117 TESTFUNC(test_mem_one),
118 TESTFUNC(test_mem_random)
119 };
120 return create_suite("MEM", tests, sizeof(tests)/sizeof(testfunc), mem_setup, mem_teardown);
121 }
122