test_esp_netif.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "unity.h"
  2. #include "test_utils.h"
  3. #include "esp_netif.h"
  4. #include "esp_wifi.h"
  5. #include "nvs_flash.h"
  6. #include "esp_wifi_netif.h"
  7. #include <string.h>
  8. TEST_CASE("esp_netif: init and destroy", "[esp_netif]")
  9. {
  10. esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_STA();
  11. esp_netif_t *esp_netif = esp_netif_new(NULL);
  12. TEST_ASSERT_EQUAL(NULL, esp_netif);
  13. esp_netif = esp_netif_new(&cfg);
  14. TEST_ASSERT_NOT_EQUAL(NULL, esp_netif);
  15. esp_netif_destroy(esp_netif);
  16. }
  17. TEST_CASE("esp_netif: get from if_key", "[esp_netif][leaks=0]")
  18. {
  19. // init default netif
  20. esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_STA();
  21. esp_netif_t *esp_netif = esp_netif_new(&cfg);
  22. TEST_ASSERT_NOT_NULL(esp_netif);
  23. // check it's accessible by key
  24. TEST_ASSERT_EQUAL(esp_netif, esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"));
  25. // destroy it
  26. esp_netif_destroy(esp_netif);
  27. // check it's also destroyed in list
  28. TEST_ASSERT_EQUAL(NULL, esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"));
  29. }
  30. TEST_CASE("esp_netif: create and delete multiple netifs", "[esp_netif][leaks=0]")
  31. {
  32. // interface key has to be a unique identifier
  33. const char* if_keys[] = { "if1", "if2", "if3", "if4", "if5", "if6", "if7", "if8", "if9" };
  34. const int nr_of_netifs = sizeof(if_keys)/sizeof(char*);
  35. esp_netif_t *netifs[nr_of_netifs];
  36. // create 10 wifi stations
  37. for (int i=0; i<nr_of_netifs; ++i) {
  38. esp_netif_inherent_config_t base_netif_config = { .if_key = if_keys[i]};
  39. esp_netif_config_t cfg = { .base = &base_netif_config, .stack = ESP_NETIF_NETSTACK_DEFAULT_WIFI_STA };
  40. netifs[i] = esp_netif_new(&cfg);
  41. TEST_ASSERT_NOT_NULL(netifs[i]);
  42. }
  43. // there's no AP within created stations
  44. TEST_ASSERT_EQUAL(NULL, esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"));
  45. // destroy
  46. for (int i=0; i<nr_of_netifs; ++i) {
  47. esp_netif_destroy(netifs[i]);
  48. }
  49. }
  50. TEST_CASE("esp_netif: test dhcp client state transitions for wifi station", "[esp_netif]")
  51. {
  52. // init default wifi netif
  53. test_case_uses_tcpip();
  54. TEST_ESP_OK(nvs_flash_init());
  55. esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_STA();
  56. esp_netif_t *sta = esp_netif_new(&cfg);
  57. TEST_ASSERT_NOT_NULL(sta);
  58. esp_netif_attach_wifi_station(sta);
  59. wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
  60. TEST_ESP_OK(esp_wifi_init(&wifi_cfg));
  61. esp_netif_dhcp_status_t state;
  62. // testing DHCP states per netif state transitions
  63. esp_netif_action_start(sta, NULL, 0, NULL);
  64. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
  65. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);
  66. esp_netif_action_connected(sta, NULL, 0, NULL);
  67. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
  68. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  69. // test manual DHCP state transitions using dhcpc-start/stop API
  70. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_stop(sta));
  71. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
  72. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STOPPED, state);
  73. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_start(sta));
  74. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
  75. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  76. TEST_ASSERT_EQUAL(ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED, esp_netif_dhcpc_start(sta));
  77. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
  78. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  79. // stop the netif and test dhcp state update
  80. esp_netif_action_stop(sta, NULL, 0, NULL);
  81. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state));
  82. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);
  83. // destroy default wifi netif
  84. esp_netif_destroy(sta);
  85. TEST_ASSERT(esp_wifi_stop() == ESP_OK);
  86. TEST_ASSERT(esp_wifi_deinit() == ESP_OK);
  87. nvs_flash_deinit();
  88. }
  89. TEST_CASE("esp_netif: test dhcp server state transitions for wifi soft AP", "[esp_netif]")
  90. {
  91. // init default wifi netif
  92. test_case_uses_tcpip();
  93. TEST_ESP_OK(nvs_flash_init());
  94. esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_AP();
  95. esp_netif_t *ap = esp_netif_new(&cfg);
  96. TEST_ASSERT_NOT_NULL(ap);
  97. esp_netif_attach_wifi_station(ap);
  98. wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
  99. TEST_ESP_OK(esp_wifi_init(&wifi_cfg));
  100. esp_netif_dhcp_status_t state;
  101. // testing DHCP server states per netif state transitions
  102. esp_netif_action_start(ap, NULL, 0, NULL);
  103. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
  104. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  105. // test manual DHCP state transitions using dhcps-start/stop API
  106. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_stop(ap));
  107. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
  108. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STOPPED, state);
  109. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_start(ap));
  110. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
  111. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  112. TEST_ASSERT_EQUAL(ESP_ERR_ESP_NETIF_DHCP_ALREADY_STARTED, esp_netif_dhcps_start(ap));
  113. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
  114. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  115. // stop the netif and test dhcp state update
  116. esp_netif_action_stop(ap, NULL, 0, NULL);
  117. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state));
  118. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state);
  119. // destroy default wifi netif
  120. esp_netif_destroy(ap);
  121. TEST_ASSERT(esp_wifi_stop() == ESP_OK);
  122. TEST_ASSERT(esp_wifi_deinit() == ESP_OK);
  123. nvs_flash_deinit();
  124. }
  125. TEST_CASE("esp_netif: test dhcp state transitions for mesh netifs", "[esp_netif]")
  126. {
  127. esp_netif_t *ap = NULL;
  128. esp_netif_t *sta = NULL;
  129. esp_netif_dhcp_status_t state;
  130. // init two mesh network interfaces
  131. test_case_uses_tcpip();
  132. TEST_ESP_OK(nvs_flash_init());
  133. TEST_ESP_OK(esp_event_loop_create_default());
  134. TEST_ESP_OK(esp_netif_create_default_wifi_mesh_netifs(&sta, &ap));
  135. TEST_ASSERT_NOT_NULL(sta);
  136. TEST_ASSERT_NOT_NULL(ap);
  137. wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
  138. TEST_ESP_OK(esp_wifi_init(&wifi_cfg));
  139. // test both server and client are *not* STARTED after interfaces created
  140. TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state));
  141. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  142. TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state));
  143. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  144. // test both server and client are still *not* STARTED after start
  145. esp_netif_action_start(ap, NULL, 0, NULL);
  146. esp_netif_action_start(sta, NULL, 0, NULL);
  147. TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state));
  148. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  149. TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state));
  150. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  151. // test both server and client are still *not* STARTED even after connect
  152. esp_netif_action_connected(ap, NULL, 0, NULL);
  153. esp_netif_action_connected(sta, NULL, 0, NULL);
  154. TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state));
  155. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  156. TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state));
  157. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  158. // test station gets promoted to be a root (so DHCP client started manually) and client is in STATED state
  159. esp_netif_dhcpc_start(sta);
  160. esp_netif_action_connected(sta, NULL, 0, NULL);
  161. TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state));
  162. TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  163. esp_netif_dhcpc_stop(sta);
  164. // test both server and client are still *not* STARTED even after stop
  165. esp_netif_action_stop(sta, NULL, 0, NULL);
  166. esp_netif_action_stop(ap, NULL, 0, NULL);
  167. TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state));
  168. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  169. TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state));
  170. TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state);
  171. // destroy event_loop, netifs, wifi, nvs
  172. TEST_ESP_OK(esp_event_loop_delete_default());
  173. esp_netif_destroy(ap);
  174. esp_netif_destroy(sta);
  175. TEST_ASSERT(esp_wifi_stop() == ESP_OK);
  176. TEST_ASSERT(esp_wifi_deinit() == ESP_OK);
  177. nvs_flash_deinit();
  178. }
  179. TEST_CASE("esp_netif: create custom wifi interfaces", "[esp_netif][leaks=0]")
  180. {
  181. esp_netif_t *ap = NULL;
  182. esp_netif_t *sta = NULL;
  183. uint8_t configured_mac[6] = {1, 2, 3, 4, 5, 6};
  184. uint8_t actual_mac[6] = { 0 };
  185. // create customized station
  186. esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_WIFI_STA();
  187. esp_netif_config.if_desc = "custom wifi station";
  188. esp_netif_config.route_prio = 1;
  189. sta = esp_netif_create_wifi(WIFI_IF_STA, &esp_netif_config);
  190. TEST_ASSERT_NOT_NULL(sta);
  191. TEST_ASSERT_EQUAL_STRING("custom wifi station", esp_netif_get_desc(sta));
  192. TEST_ASSERT_EQUAL(1, esp_netif_get_route_prio(sta));
  193. // create customized access point
  194. esp_netif_inherent_config_t esp_netif_config2 = ESP_NETIF_INHERENT_DEFAULT_WIFI_AP();
  195. esp_netif_config2.if_desc = "custom wifi ap";
  196. esp_netif_config2.route_prio = 10;
  197. memcpy(esp_netif_config2.mac, configured_mac, 6);
  198. ap = esp_netif_create_wifi(WIFI_IF_AP, &esp_netif_config2);
  199. TEST_ASSERT_NOT_NULL(ap);
  200. TEST_ASSERT_EQUAL_STRING( "custom wifi ap", esp_netif_get_desc(ap));
  201. TEST_ASSERT_EQUAL(10, esp_netif_get_route_prio(ap));
  202. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_get_mac(ap, actual_mac));
  203. TEST_ASSERT_EQUAL_HEX8_ARRAY(configured_mac, actual_mac, 6);
  204. esp_wifi_destroy_if_driver(esp_netif_get_io_driver(ap));
  205. esp_wifi_destroy_if_driver(esp_netif_get_io_driver(sta));
  206. esp_netif_destroy(ap);
  207. esp_netif_destroy(sta);
  208. }
  209. TEST_CASE("esp_netif: get/set hostname", "[esp_netif]")
  210. {
  211. const char *hostname;
  212. esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_STA();
  213. test_case_uses_tcpip();
  214. esp_netif_t *esp_netif = esp_netif_new(&cfg);
  215. // specific hostname not set yet, get_hostname should fail
  216. TEST_ASSERT_NOT_EQUAL(ESP_OK, esp_netif_get_hostname(esp_netif, &hostname));
  217. TEST_ASSERT_NOT_NULL(esp_netif);
  218. esp_netif_attach_wifi_station(esp_netif);
  219. esp_netif_action_start(esp_netif, NULL, 0, NULL);
  220. // specific hostname not set yet, but if started, get_hostname to return default config value
  221. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_get_hostname(esp_netif, &hostname));
  222. TEST_ASSERT_EQUAL_STRING(hostname, CONFIG_LWIP_LOCAL_HOSTNAME);
  223. // specific hostname set and get
  224. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_set_hostname(esp_netif, "new_name"));
  225. TEST_ASSERT_EQUAL(ESP_OK, esp_netif_get_hostname(esp_netif, &hostname));
  226. TEST_ASSERT_EQUAL_STRING(hostname, "new_name");
  227. esp_netif_destroy(esp_netif);
  228. }