mirror of
				https://github.com/espressif/esp-protocols.git
				synced 2025-10-30 22:21:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			157 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
 | |
|  *
 | |
|  * SPDX-License-Identifier: Unlicense OR CC0-1.0
 | |
|  */
 | |
| 
 | |
| #include "mdns.h"
 | |
| #include "esp_event.h"
 | |
| #include "unity.h"
 | |
| #include "test_utils.h"
 | |
| 
 | |
| #include "unity_fixture.h"
 | |
| #include "memory_checks.h"
 | |
| 
 | |
| #define MDNS_HOSTNAME "test-hostname"
 | |
| #define MDNS_DELEGATE_HOSTNAME "delegate-hostname"
 | |
| #define MDNS_INSTANCE "test-instance"
 | |
| #define MDNS_SERVICE_NAME  "_http"
 | |
| #define MDNS_SERVICE_PROTO "_tcp"
 | |
| #define MDNS_SERVICE_PORT   80
 | |
| 
 | |
| TEST_GROUP(mdns);
 | |
| 
 | |
| TEST_SETUP(mdns)
 | |
| {
 | |
|     test_utils_record_free_mem();
 | |
|     TEST_ESP_OK(test_utils_set_leak_level(0, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL));
 | |
| }
 | |
| 
 | |
| TEST_TEAR_DOWN(mdns)
 | |
| {
 | |
|     test_utils_finish_and_evaluate_leaks(32, 64);
 | |
| }
 | |
| 
 | |
| static void yield_to_all_priorities(void)
 | |
| {
 | |
|     // Lower the test-task priority before testing to ensure other tasks got executed on forced context switch
 | |
|     size_t test_task_prio_before = uxTaskPriorityGet(NULL);
 | |
|     vTaskPrioritySet(NULL, tskIDLE_PRIORITY);
 | |
|     taskYIELD(); // Let the RTOS to switch context
 | |
|     vTaskPrioritySet(NULL, test_task_prio_before);
 | |
| }
 | |
| 
 | |
| 
 | |
| TEST(mdns, api_fails_with_invalid_state)
 | |
| {
 | |
|     TEST_ASSERT_NOT_EQUAL(ESP_OK, mdns_init() );
 | |
|     TEST_ASSERT_NOT_EQUAL(ESP_OK, mdns_hostname_set(MDNS_HOSTNAME) );
 | |
|     TEST_ASSERT_NOT_EQUAL(ESP_OK, mdns_instance_name_set(MDNS_INSTANCE) );
 | |
|     TEST_ASSERT_NOT_EQUAL(ESP_OK, mdns_service_add(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT, NULL, 0) );
 | |
| }
 | |
| 
 | |
| TEST(mdns, init_deinit)
 | |
| {
 | |
|     test_case_uses_tcpip();
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, esp_event_loop_create_default());
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_init() );
 | |
|     yield_to_all_priorities(); // Make sure that mdns task has executed to complete initialization
 | |
|     mdns_free();
 | |
|     esp_event_loop_delete_default();
 | |
| }
 | |
| 
 | |
| TEST(mdns, api_fails_with_expected_err)
 | |
| {
 | |
|     mdns_txt_item_t serviceTxtData[CONFIG_MDNS_MAX_SERVICES] = { {NULL, NULL},
 | |
|     };
 | |
|     mdns_ip_addr_t addr;
 | |
|     addr.addr.type = ESP_IPADDR_TYPE_V4;
 | |
|     addr.addr.u_addr.ip4.addr = esp_ip4addr_aton("127.0.0.1");
 | |
|     addr.next = NULL;
 | |
|     for (int i = 0; i < CONFIG_MDNS_MAX_SERVICES; ++i) {
 | |
|         serviceTxtData[i].key = "Key";
 | |
|         serviceTxtData[i].value = "Value";
 | |
|     }
 | |
|     test_case_uses_tcpip();
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, esp_event_loop_create_default());
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_init() );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_hostname_set(MDNS_HOSTNAME) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_delegate_hostname_add(MDNS_DELEGATE_HOSTNAME, &addr) );
 | |
|     yield_to_all_priorities();  // Make sure that mdns task has executed to add the hostname
 | |
|     TEST_ASSERT_TRUE(mdns_hostname_exists(MDNS_DELEGATE_HOSTNAME) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_instance_name_set(MDNS_INSTANCE) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_add(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT, serviceTxtData, CONFIG_MDNS_MAX_SERVICES) );
 | |
|     TEST_ASSERT_FALSE(mdns_service_exists(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_add_for_host(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME,
 | |
|                       MDNS_SERVICE_PORT, serviceTxtData, CONFIG_MDNS_MAX_SERVICES) );
 | |
|     TEST_ASSERT_TRUE(mdns_service_exists(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_txt_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, serviceTxtData, CONFIG_MDNS_MAX_SERVICES) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_txt_item_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, "key1", "value1") );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_txt_item_remove(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, "key1") );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_port_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 8080) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_remove(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO) );
 | |
|     yield_to_all_priorities();  // Make sure that mdns task has executed to remove the service
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_add(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT, NULL, 0) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_delegate_hostname_remove(MDNS_DELEGATE_HOSTNAME) );
 | |
|     yield_to_all_priorities();  // Make sure that mdns task has executed to remove the hostname
 | |
|     TEST_ASSERT_FALSE(mdns_service_exists(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME) );
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_remove_all() );
 | |
|     yield_to_all_priorities();  // Make sure that mdns task has executed to remove all services
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, mdns_service_port_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 8080) );
 | |
| 
 | |
|     mdns_free();
 | |
|     esp_event_loop_delete_default();
 | |
| }
 | |
| 
 | |
| TEST(mdns, query_api_fails_with_expected_err)
 | |
| {
 | |
|     mdns_result_t *results = NULL;
 | |
|     esp_ip6_addr_t addr6;
 | |
|     esp_ip4_addr_t addr4;
 | |
|     test_case_uses_tcpip();
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, esp_event_loop_create_default());
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_init() );
 | |
|     // check it is not possible to register a service or set an instance without configuring the hostname
 | |
|     TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, mdns_service_add(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT, NULL, 0));
 | |
|     TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, mdns_instance_name_set(MDNS_INSTANCE));
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_hostname_set(MDNS_HOSTNAME));
 | |
|     // hostname is set, now adding a service and instance should succeed
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_service_add(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT, NULL, 0));
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_instance_name_set(MDNS_INSTANCE));
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_query_ptr(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 10, CONFIG_MDNS_MAX_SERVICES,  &results) );
 | |
|     mdns_query_results_free(results);
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_query_srv(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 10, &results) );
 | |
|     mdns_query_results_free(results);
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_OK, mdns_query_txt(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 10, &results) );
 | |
|     mdns_query_results_free(results);
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, mdns_query_a(MDNS_HOSTNAME, 10, &addr4) );
 | |
|     mdns_query_results_free(results);
 | |
| 
 | |
|     TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, mdns_query_aaaa(MDNS_HOSTNAME, 10, &addr6) );
 | |
|     mdns_query_results_free(results);
 | |
| 
 | |
|     mdns_free();
 | |
|     esp_event_loop_delete_default();
 | |
| }
 | |
| 
 | |
| TEST_GROUP_RUNNER(mdns)
 | |
| {
 | |
|     RUN_TEST_CASE(mdns, api_fails_with_invalid_state)
 | |
|     RUN_TEST_CASE(mdns, api_fails_with_expected_err)
 | |
|     RUN_TEST_CASE(mdns, query_api_fails_with_expected_err)
 | |
|     RUN_TEST_CASE(mdns, init_deinit)
 | |
| }
 | |
| 
 | |
| void app_main(void)
 | |
| {
 | |
|     UNITY_MAIN(mdns);
 | |
| }
 |