1 #include "lwip_check.h"
2
3 #include "ip4/test_ip4.h"
4 #include "ip6/test_ip6.h"
5 #include "udp/test_udp.h"
6 #include "tcp/test_tcp.h"
7 #include "tcp/test_tcp_oos.h"
8 #include "tcp/test_tcp_state.h"
9 #include "core/test_def.h"
10 #include "core/test_dns.h"
11 #include "core/test_mem.h"
12 #include "core/test_netif.h"
13 #include "core/test_pbuf.h"
14 #include "core/test_timers.h"
15 #include "etharp/test_etharp.h"
16 #include "dhcp/test_dhcp.h"
17 #include "mdns/test_mdns.h"
18 #include "mqtt/test_mqtt.h"
19 #include "api/test_sockets.h"
20 #include "ppp/test_pppos.h"
21
22 #include "lwip/init.h"
23 #if !NO_SYS
24 #include "lwip/tcpip.h"
25 #endif
26
27 /* This function is used for LWIP_RAND by some ports... */
28 unsigned int
lwip_port_rand(void)29 lwip_port_rand(void)
30 {
31 return (unsigned int)rand();
32 }
33
create_suite(const char * name,testfunc * tests,size_t num_tests,SFun setup,SFun teardown)34 Suite* create_suite(const char* name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown)
35 {
36 size_t i;
37 Suite *s = suite_create(name);
38
39 for(i = 0; i < num_tests; i++) {
40 TCase *tc_core = tcase_create(name);
41 if ((setup != NULL) || (teardown != NULL)) {
42 tcase_add_checked_fixture(tc_core, setup, teardown);
43 }
44 tcase_add_named_test(tc_core, tests[i]);
45 suite_add_tcase(s, tc_core);
46 }
47 return s;
48 }
49
lwip_check_ensure_no_alloc(unsigned int skip)50 void lwip_check_ensure_no_alloc(unsigned int skip)
51 {
52 int i;
53 unsigned int mask;
54
55 if (!(skip & SKIP_HEAP)) {
56 fail_unless(lwip_stats.mem.used == 0,
57 "mem heap still has %d bytes allocated", lwip_stats.mem.used);
58 }
59 for (i = 0, mask = 1; i < MEMP_MAX; i++, mask <<= 1) {
60 if (!(skip & mask)) {
61 #if defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY
62 fail_unless(lwip_stats.memp[i]->used == 0,
63 "memp pool '%s' still has %d entries allocated",
64 lwip_stats.memp[i]->name, lwip_stats.memp[i]->used);
65 #else
66 fail_unless(lwip_stats.memp[i]->used == 0,
67 "memp pool %d still has %d entries allocated",
68 i, lwip_stats.memp[i]->used);
69 #endif
70 }
71 }
72 }
73
74 #ifdef LWIP_UNITTESTS_LIB
lwip_unittests_run(void)75 int lwip_unittests_run(void)
76 #else
77 int main(void)
78 #endif
79 {
80 int number_failed;
81 SRunner *sr;
82 size_t i;
83 suite_getter_fn* suites[] = {
84 ip4_suite,
85 ip6_suite,
86 udp_suite,
87 tcp_suite,
88 tcp_oos_suite,
89 tcp_state_suite,
90 def_suite,
91 dns_suite,
92 mem_suite,
93 netif_suite,
94 pbuf_suite,
95 timers_suite,
96 etharp_suite,
97 dhcp_suite,
98 mdns_suite,
99 mqtt_suite,
100 sockets_suite
101 #if PPP_SUPPORT && PPPOS_SUPPORT
102 , pppos_suite
103 #endif /* PPP_SUPPORT && PPPOS_SUPPORT */
104 };
105 size_t num = sizeof(suites)/sizeof(void*);
106 LWIP_ASSERT("No suites defined", num > 0);
107
108 #if NO_SYS
109 lwip_init();
110 #else
111 tcpip_init(NULL, NULL);
112 #endif
113
114 sr = srunner_create((suites[0])());
115 srunner_set_xml(sr, "lwip_unittests.xml");
116 for(i = 1; i < num; i++) {
117 srunner_add_suite(sr, ((suite_getter_fn*)suites[i])());
118 }
119
120 #ifdef LWIP_UNITTESTS_NOFORK
121 srunner_set_fork_status(sr, CK_NOFORK);
122 #endif
123 #ifdef LWIP_UNITTESTS_FORK
124 srunner_set_fork_status(sr, CK_FORK);
125 #endif
126
127 srunner_run_all(sr, CK_NORMAL);
128 number_failed = srunner_ntests_failed(sr);
129 srunner_free(sr);
130 return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
131 }
132