From 9f2a45f15fad59028272667bdd787dfc73c8f392 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Sun, 3 Nov 2019 20:44:44 +0100 Subject: [PATCH] esp_netif: add dhcp state transition unit tests for default wifi interfaces --- components/esp_netif/test/CMakeLists.txt | 2 +- components/esp_netif/test/test_esp_netif.c | 129 +++++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/components/esp_netif/test/CMakeLists.txt b/components/esp_netif/test/CMakeLists.txt index 9dfde6842..513d8ad98 100644 --- a/components/esp_netif/test/CMakeLists.txt +++ b/components/esp_netif/test/CMakeLists.txt @@ -1,5 +1,5 @@ set(COMPONENT_SRCDIRS ".") set(COMPONENT_PRIV_INCLUDEDIRS "../private_include" ".") -set(COMPONENT_PRIV_REQUIRES unity test_utils esp_netif) +set(COMPONENT_PRIV_REQUIRES unity test_utils esp_netif nvs_flash) register_component() \ No newline at end of file diff --git a/components/esp_netif/test/test_esp_netif.c b/components/esp_netif/test/test_esp_netif.c index 8013cdb1c..342018a32 100644 --- a/components/esp_netif/test/test_esp_netif.c +++ b/components/esp_netif/test/test_esp_netif.c @@ -1,6 +1,8 @@ #include "unity.h" +#include "test_utils.h" #include "esp_netif.h" #include "esp_wifi.h" +#include "nvs_flash.h" TEST_CASE("esp_netif: init and destroy", "[esp_netif]") { @@ -58,3 +60,130 @@ TEST_CASE("esp_netif: create and delete multiple netifs", "[esp_netif][leaks=0]" } } + +TEST_CASE("esp_netif: test dhcp client state transitions for wifi station", "[esp_netif]") +{ + // init default wifi netif + test_case_uses_tcpip(); + TEST_ESP_OK(nvs_flash_init()); + esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_STA(); + esp_netif_t *sta = esp_netif_new(&cfg); + TEST_ASSERT_NOT_NULL(sta); + esp_netif_attach_wifi_station(sta); + wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT(); + TEST_ESP_OK(esp_wifi_init(&wifi_cfg)); + + esp_netif_dhcp_status_t state; + + // testing DHCP states per netif state transitions + esp_netif_action_start(sta, NULL, 0, NULL); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); + + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state); + esp_netif_action_connected(sta, NULL, 0, NULL); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); + + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + esp_netif_action_stop(sta, NULL, 0, NULL); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcpc_get_status(sta, &state)); + + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state); + + // destroy default wifi netif + esp_netif_destroy(sta); + TEST_ASSERT(esp_wifi_stop() == ESP_OK); + TEST_ASSERT(esp_wifi_deinit() == ESP_OK); + nvs_flash_deinit(); +} + +TEST_CASE("esp_netif: test dhcp server state transitions for wifi soft AP", "[esp_netif]") +{ + // init default wifi netif + test_case_uses_tcpip(); + TEST_ESP_OK(nvs_flash_init()); + esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_AP(); + esp_netif_t *ap = esp_netif_new(&cfg); + TEST_ASSERT_NOT_NULL(ap); + esp_netif_attach_wifi_station(ap); + wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT(); + TEST_ESP_OK(esp_wifi_init(&wifi_cfg)); + + esp_netif_dhcp_status_t state; + + // testing DHCP server states per netif state transitions + esp_netif_action_start(ap, NULL, 0, NULL); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + esp_netif_action_stop(ap, NULL, 0, NULL); + TEST_ASSERT_EQUAL(ESP_OK, esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_INIT, state); + + // destroy default wifi netif + esp_netif_destroy(ap); + TEST_ASSERT(esp_wifi_stop() == ESP_OK); + TEST_ASSERT(esp_wifi_deinit() == ESP_OK); + nvs_flash_deinit(); +} + +TEST_CASE("esp_netif: test dhcp state transitions for mesh netifs", "[esp_netif]") +{ + esp_netif_t *ap = NULL; + esp_netif_t *sta = NULL; + esp_netif_dhcp_status_t state; + + // init two mesh network interfaces + test_case_uses_tcpip(); + TEST_ESP_OK(nvs_flash_init()); + TEST_ESP_OK(esp_event_loop_create_default()); + TEST_ESP_OK(esp_netif_create_default_wifi_mesh_netifs(&sta, &ap)); + TEST_ASSERT_NOT_NULL(sta); + TEST_ASSERT_NOT_NULL(ap); + wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT(); + TEST_ESP_OK(esp_wifi_init(&wifi_cfg)); + + // test both server and client are *not* STARTED after interfaces created + TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // test both server and client are still *not* STARTED after start + esp_netif_action_start(ap, NULL, 0, NULL); + esp_netif_action_start(sta, NULL, 0, NULL); + TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // test both server and client are still *not* STARTED even after connect + esp_netif_action_connected(ap, NULL, 0, NULL); + esp_netif_action_connected(sta, NULL, 0, NULL); + TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // test station gets promoted to be a root (so DHCP client started manually) and client is in STATED state + esp_netif_dhcpc_start(sta); + esp_netif_action_connected(sta, NULL, 0, NULL); + TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + esp_netif_dhcpc_stop(sta); + + // test both server and client are still *not* STARTED even after stop + esp_netif_action_stop(sta, NULL, 0, NULL); + esp_netif_action_stop(ap, NULL, 0, NULL); + TEST_ESP_OK(esp_netif_dhcpc_get_status(sta, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + TEST_ESP_OK(esp_netif_dhcps_get_status(ap, &state)); + TEST_ASSERT_NOT_EQUAL(ESP_NETIF_DHCP_STARTED, state); + + // destroy event_loop, netifs, wifi, nvs + TEST_ESP_OK(esp_event_loop_delete_default()); + esp_netif_destroy(ap); + esp_netif_destroy(sta); + TEST_ASSERT(esp_wifi_stop() == ESP_OK); + TEST_ASSERT(esp_wifi_deinit() == ESP_OK); + nvs_flash_deinit(); +}