test_wifi_init.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #include "unity.h"
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "esp_wifi.h"
  5. #include "esp_event.h"
  6. #include "esp_log.h"
  7. #include "nvs_flash.h"
  8. #include "test_utils.h"
  9. #include "freertos/event_groups.h"
  10. #define GOT_IP_EVENT 0x00000001
  11. #define DISCONNECT_EVENT 0x00000002
  12. #define EVENT_HANDLER_FLAG_DO_NOT_AUTO_RECONNECT 0x00000001
  13. #define EMPH_STR(s) "****** "s" ******"
  14. static const char* TAG = "test_wifi_init";
  15. static uint32_t wifi_event_handler_flag;
  16. static EventGroupHandle_t wifi_events;
  17. static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
  18. {
  19. printf("wifi ev_handle_called.\n");
  20. switch(event_id) {
  21. case WIFI_EVENT_STA_START:
  22. ESP_LOGI(TAG, "WIFI_EVENT_STA_START");
  23. break;
  24. case WIFI_EVENT_STA_DISCONNECTED:
  25. ESP_LOGI(TAG, "WIFI_EVENT_STA_DISCONNECTED");
  26. if (! (EVENT_HANDLER_FLAG_DO_NOT_AUTO_RECONNECT & wifi_event_handler_flag) ) {
  27. TEST_ESP_OK(esp_wifi_connect());
  28. }
  29. if (wifi_events) {
  30. xEventGroupSetBits(wifi_events, DISCONNECT_EVENT);
  31. }
  32. break;
  33. default:
  34. break;
  35. }
  36. return;
  37. }
  38. static void ip_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
  39. {
  40. ip_event_got_ip_t *event;
  41. printf("ip ev_handle_called.\n");
  42. switch(event_id) {
  43. case IP_EVENT_STA_GOT_IP:
  44. event = (ip_event_got_ip_t*)event_data;
  45. ESP_LOGI(TAG, "IP_EVENT_STA_GOT_IP");
  46. ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
  47. if (wifi_events) {
  48. xEventGroupSetBits(wifi_events, GOT_IP_EVENT);
  49. }
  50. break;
  51. default:
  52. break;
  53. }
  54. return;
  55. }
  56. static esp_err_t event_init(void)
  57. {
  58. ESP_ERROR_CHECK(esp_event_loop_create_default());
  59. ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
  60. ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, &ip_event_handler, NULL));
  61. return ESP_OK;
  62. }
  63. static esp_err_t event_deinit(void)
  64. {
  65. ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handler));
  66. ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT,ESP_EVENT_ANY_ID,&ip_event_handler));
  67. ESP_ERROR_CHECK(esp_event_loop_delete_default());
  68. return ESP_OK;
  69. }
  70. static void wifi_driver_can_start_on_APP_CPU_task(void* arg)
  71. {
  72. SemaphoreHandle_t *sema = (SemaphoreHandle_t *) arg;
  73. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  74. ESP_LOGI(TAG, EMPH_STR("nvs_flash_init"));
  75. esp_err_t r = nvs_flash_init();
  76. if (r == ESP_ERR_NVS_NO_FREE_PAGES || r == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  77. ESP_LOGI(TAG, EMPH_STR("no free pages or NFS version mismatch, erase.."));
  78. TEST_ESP_OK(nvs_flash_erase());
  79. r = nvs_flash_init();
  80. }
  81. TEST_ESP_OK(r);
  82. ESP_LOGI(TAG, EMPH_STR("event_init"));
  83. TEST_ESP_OK(event_init());
  84. ESP_LOGI(TAG, EMPH_STR("esp_wifi_init"));
  85. TEST_ESP_OK(esp_wifi_init(&cfg));
  86. ESP_LOGI(TAG, EMPH_STR("esp_wifi_deinit..."));
  87. TEST_ESP_OK(esp_wifi_deinit());
  88. ESP_LOGI(TAG, EMPH_STR("event_deinit"));
  89. TEST_ESP_OK(event_deinit());
  90. ESP_LOGI(TAG, EMPH_STR("nvs_flash_deinit..."));
  91. TEST_ESP_OK(nvs_flash_deinit());
  92. ESP_LOGI(TAG, "exit task...");
  93. xSemaphoreGive(*sema);
  94. vTaskSuspend(NULL);
  95. }
  96. TEST_CASE("wifi driver can start on APP CPU", "[wifi_init]")
  97. {
  98. TaskHandle_t th = NULL;
  99. SemaphoreHandle_t sema = xSemaphoreCreateBinary();
  100. TEST_ASSERT_NOT_NULL(sema);
  101. printf("Creating tasks\n");
  102. #ifndef CONFIG_FREERTOS_UNICORE
  103. xTaskCreatePinnedToCore(wifi_driver_can_start_on_APP_CPU_task, "wifi_driver_can_start_on_APP_CPU_task", 2048*2, &sema, 3, &th, 1);
  104. #else
  105. xTaskCreate(wifi_driver_can_start_on_APP_CPU_task, "wifi_driver_can_start_on_APP_CPU_task", 2048*2, &sema, 3, &th);
  106. #endif
  107. TEST_ASSERT_NOT_NULL(th);
  108. xSemaphoreTake(sema, portMAX_DELAY);
  109. vSemaphoreDelete(sema);
  110. sema = NULL;
  111. test_utils_task_delete(th);
  112. }
  113. static void wifi_start_stop_task(void* arg)
  114. {
  115. SemaphoreHandle_t *sema = (SemaphoreHandle_t *) arg;
  116. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  117. ESP_LOGI(TAG, EMPH_STR("nvs_flash_init"));
  118. esp_err_t r = nvs_flash_init();
  119. if (r == ESP_ERR_NVS_NO_FREE_PAGES || r == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  120. ESP_LOGI(TAG, EMPH_STR("no free pages or NFS version mismatch, erase.."));
  121. TEST_ESP_OK(nvs_flash_erase());
  122. r = nvs_flash_init();
  123. }
  124. TEST_ESP_OK(r);
  125. //init tcpip stack
  126. test_case_uses_tcpip();
  127. ESP_LOGI(TAG, EMPH_STR("event_init"));
  128. TEST_ESP_OK(event_init());
  129. ESP_LOGI(TAG, EMPH_STR("esp_wifi_init"));
  130. TEST_ESP_OK(esp_wifi_init(&cfg));
  131. ESP_LOGI(TAG, EMPH_STR("esp_wifi_start"));
  132. TEST_ESP_OK(esp_wifi_start());
  133. ESP_LOGI(TAG, EMPH_STR("esp_wifi_stop"));
  134. TEST_ESP_OK(esp_wifi_stop());
  135. ESP_LOGI(TAG, EMPH_STR("esp_wifi_stop"));
  136. TEST_ESP_OK(esp_wifi_stop());
  137. ESP_LOGI(TAG, EMPH_STR("esp_wifi_deinit"));
  138. TEST_ESP_OK(esp_wifi_deinit());
  139. ESP_LOGI(TAG, EMPH_STR("event_deinit"));
  140. TEST_ESP_OK(event_deinit());
  141. ESP_LOGI(TAG, EMPH_STR("nvs_flash_deinit..."));
  142. nvs_flash_deinit();
  143. ESP_LOGI(TAG, "test passed...");
  144. xSemaphoreGive(*sema);
  145. vTaskSuspend(NULL);
  146. }
  147. TEST_CASE("Calling esp_wifi_stop() with start", "[wifi_init]")
  148. {
  149. TaskHandle_t th = NULL;
  150. SemaphoreHandle_t sema = xSemaphoreCreateBinary();
  151. TEST_ASSERT_NOT_NULL(sema);
  152. printf("Creating tasks\n");
  153. #ifndef CONFIG_FREERTOS_UNICORE
  154. xTaskCreatePinnedToCore(wifi_start_stop_task, "wifi_start_stop_task", 2048*2, &sema, 3, &th, 0);
  155. #else
  156. xTaskCreate(wifi_start_stop_task, "wifi_start_stop_task", 2048*2, &sema, 3, &th);
  157. #endif
  158. TEST_ASSERT_NOT_NULL(th);
  159. xSemaphoreTake(sema, portMAX_DELAY);
  160. vSemaphoreDelete(sema);
  161. sema = NULL;
  162. test_utils_task_delete(th);
  163. }
  164. static void wifi_stop_task(void* arg)
  165. {
  166. SemaphoreHandle_t *sema = (SemaphoreHandle_t *) arg;
  167. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  168. ESP_LOGI(TAG, EMPH_STR("nvs_flash_init"));
  169. esp_err_t r = nvs_flash_init();
  170. if (r == ESP_ERR_NVS_NO_FREE_PAGES || r == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  171. ESP_LOGI(TAG, EMPH_STR("no free pages or NFS version mismatch, erase.."));
  172. TEST_ESP_OK(nvs_flash_erase());
  173. r = nvs_flash_init();
  174. }
  175. TEST_ESP_OK(r);
  176. ESP_LOGI(TAG, EMPH_STR("event_init"));
  177. TEST_ESP_OK(event_init());
  178. ESP_LOGI(TAG, EMPH_STR("esp_wifi_init"));
  179. TEST_ESP_OK(esp_wifi_init(&cfg));
  180. ESP_LOGI(TAG, EMPH_STR("esp_wifi_stop"));
  181. TEST_ESP_OK(esp_wifi_stop());
  182. ESP_LOGI(TAG, EMPH_STR("esp_wifi_stop"));
  183. TEST_ESP_OK(esp_wifi_stop());
  184. ESP_LOGI(TAG, EMPH_STR("esp_wifi_deinit"));
  185. TEST_ESP_OK(esp_wifi_deinit());
  186. ESP_LOGI(TAG, EMPH_STR("event_deinit"));
  187. TEST_ESP_OK(event_deinit());
  188. ESP_LOGI(TAG, EMPH_STR("nvs_flash_deinit..."));
  189. nvs_flash_deinit();
  190. ESP_LOGI(TAG, "test passed...");
  191. xSemaphoreGive(*sema);
  192. vTaskSuspend(NULL);
  193. }
  194. TEST_CASE("Calling esp_wifi_stop() without start", "[wifi_init]")
  195. {
  196. TaskHandle_t th = NULL;
  197. SemaphoreHandle_t sema = xSemaphoreCreateBinary();
  198. TEST_ASSERT_NOT_NULL(sema);
  199. printf("Creating tasks\n");
  200. #ifndef CONFIG_FREERTOS_UNICORE
  201. xTaskCreatePinnedToCore(wifi_stop_task, "wifi_stop_task", 2048*2, &sema, 3, &th, 0);
  202. #else
  203. xTaskCreate(wifi_stop_task, "wifi_stop_task", 2048*2, &sema, 3, &th);
  204. #endif
  205. TEST_ASSERT_NOT_NULL(th);
  206. xSemaphoreTake(sema, portMAX_DELAY);
  207. vSemaphoreDelete(sema);
  208. sema = NULL;
  209. test_utils_task_delete(th);
  210. }
  211. static void wifi_deinit_task(void* arg)
  212. {
  213. SemaphoreHandle_t *sema = (SemaphoreHandle_t *) arg;
  214. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  215. ESP_LOGI(TAG, EMPH_STR("nvs_flash_init"));
  216. esp_err_t r = nvs_flash_init();
  217. if (r == ESP_ERR_NVS_NO_FREE_PAGES || r == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  218. ESP_LOGI(TAG, EMPH_STR("no free pages or NFS version mismatch, erase.."));
  219. TEST_ESP_OK(nvs_flash_erase());
  220. r = nvs_flash_init();
  221. }
  222. TEST_ESP_OK(r);
  223. //init tcpip stack
  224. test_case_uses_tcpip();
  225. ESP_LOGI(TAG, EMPH_STR("event_init"));
  226. TEST_ESP_OK(event_init());
  227. ESP_LOGI(TAG, EMPH_STR("esp_wifi_init"));
  228. TEST_ESP_OK(esp_wifi_init(&cfg));
  229. ESP_LOGI(TAG, EMPH_STR("esp_wifi_start"));
  230. TEST_ESP_OK(esp_wifi_start());
  231. ESP_LOGI(TAG, EMPH_STR("esp_wifi_deinit"));
  232. TEST_ESP_ERR(ESP_ERR_WIFI_NOT_STOPPED, esp_wifi_deinit());
  233. ESP_LOGI(TAG, EMPH_STR("esp_wifi_stop"));
  234. TEST_ESP_OK(esp_wifi_stop());
  235. ESP_LOGI(TAG, EMPH_STR("esp_wifi_deinit"));
  236. TEST_ESP_OK(esp_wifi_deinit());
  237. ESP_LOGI(TAG, EMPH_STR("event_deinit"));
  238. TEST_ESP_OK(event_deinit());
  239. ESP_LOGI(TAG, EMPH_STR("nvs_flash_deinit..."));
  240. nvs_flash_deinit();
  241. ESP_LOGI(TAG, "test passed...");
  242. xSemaphoreGive(*sema);
  243. vTaskSuspend(NULL);
  244. }
  245. TEST_CASE("Calling esp_wifi_deinit() without stop", "[wifi_init]")
  246. {
  247. TaskHandle_t th = NULL;
  248. SemaphoreHandle_t sema = xSemaphoreCreateBinary();
  249. TEST_ASSERT_NOT_NULL(sema);
  250. printf("Creating tasks\n");
  251. #ifndef CONFIG_FREERTOS_UNICORE
  252. xTaskCreatePinnedToCore(wifi_deinit_task, "wifi_deinit_task", 2048*2, &sema, 3, &th, 0);
  253. #else
  254. xTaskCreate(wifi_deinit_task, "wifi_deinit_task", 2048*2, &sema, 3, &th);
  255. #endif
  256. TEST_ASSERT_NOT_NULL(th);
  257. xSemaphoreTake(sema, portMAX_DELAY);
  258. vSemaphoreDelete(sema);
  259. sema = NULL;
  260. test_utils_task_delete(th);
  261. }