STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
test_mem.c
Go to the documentation of this file.
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
16 mem_setup(void)
17 {
18 }
19 
20 static void
21 mem_teardown(void)
22 {
23 }
24 
25 
26 /* Test functions */
27 
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 
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 
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 
113 Suite *
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 }
#define TESTFUNC(x)
Definition: lwip_check.h:21
u16_t mem_size_t
Definition: mem.h:76
#define SIZE1
void mem_free(void *rmem)
Definition: mem.c:334
void * mem_trim(void *rmem, mem_size_t newsize)
Definition: mem.c:392
#define NULL
Definition: usbd_def.h:53
#define SIZE1_2
Suite * create_suite(const char *name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown)
START_TEST(test_mem_one)
Definition: test_mem.c:29
#define LWIP_ASSERT(message, assertion)
Definition: debug.h:70
#define SIZE2
END_TEST Suite * mem_suite(void)
Definition: test_mem.c:114
void * mem_malloc(mem_size_t size)
Definition: mem.c:517
#define LWIP_UNUSED_ARG(x)
Definition: arch.h:89