lwip_unittests.c 2.6 KB

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