Skip to content

Commit 7e5ac87

Browse files
authored
Merge pull request #619 from david-cermak/feat/more_unit_tests
[mdns]: Add unit test for services
2 parents a8f13bc + d4da9cb commit 7e5ac87

File tree

2 files changed

+147
-1
lines changed

2 files changed

+147
-1
lines changed

components/mdns/mdns.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6185,6 +6185,10 @@ static mdns_txt_item_t *_copy_mdns_txt_items(mdns_txt_linked_item_t *items, uint
61856185
ret_index++;
61866186
}
61876187
*txt_count = ret_index;
6188+
if (ret_index == 0) { // handle empty TXT
6189+
*txt_value_len = NULL;
6190+
return NULL;
6191+
}
61886192
ret = (mdns_txt_item_t *)calloc(ret_index, sizeof(mdns_txt_item_t));
61896193
*txt_value_len = (uint8_t *)calloc(ret_index, sizeof(uint8_t));
61906194
if (!ret || !(*txt_value_len)) {

components/mdns/tests/unit_test/main/test_mdns.c

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Unlicense OR CC0-1.0
55
*/
66

7+
#include <string.h>
78
#include "mdns.h"
89
#include "esp_event.h"
910
#include "unity.h"
@@ -142,12 +143,153 @@ TEST(mdns, query_api_fails_with_expected_err)
142143
esp_event_loop_delete_default();
143144
}
144145

146+
TEST(mdns, add_remove_service)
147+
{
148+
mdns_result_t *results = NULL;
149+
test_case_uses_tcpip();
150+
TEST_ASSERT_EQUAL(ESP_OK, esp_event_loop_create_default());
151+
TEST_ASSERT_EQUAL(ESP_OK, mdns_init() );
152+
TEST_ASSERT_EQUAL(ESP_OK, mdns_hostname_set(MDNS_HOSTNAME));
153+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_add(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT, NULL, 0));
154+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
155+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_selfhosted_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
156+
TEST_ASSERT_NOT_EQUAL(NULL, results);
157+
TEST_ASSERT_EQUAL_STRING(MDNS_INSTANCE, results->instance_name);
158+
TEST_ASSERT_EQUAL_STRING(MDNS_SERVICE_NAME, results->service_type);
159+
TEST_ASSERT_EQUAL(MDNS_SERVICE_PORT, results->port);
160+
TEST_ASSERT_EQUAL(NULL, results->txt);
161+
mdns_query_results_free(results);
162+
163+
// Update service properties: port
164+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_port_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_SERVICE_PORT + 1));
165+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
166+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_selfhosted_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
167+
TEST_ASSERT_NOT_EQUAL(NULL, results);
168+
TEST_ASSERT_EQUAL(MDNS_SERVICE_PORT + 1, results->port);
169+
mdns_query_results_free(results);
170+
171+
// Update service properties: instance
172+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_instance_name_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_INSTANCE "1" ));
173+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
174+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_selfhosted_service(MDNS_INSTANCE "1", MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
175+
TEST_ASSERT_NOT_EQUAL(NULL, results);
176+
TEST_ASSERT_EQUAL_STRING(MDNS_INSTANCE "1", results->instance_name);
177+
mdns_query_results_free(results);
178+
179+
// Update service properties: txt
180+
mdns_txt_item_t txt_data[] = {
181+
{"key1", "esp32"},
182+
{"key2", "value"},
183+
{"key3", "value3"},
184+
};
185+
const size_t txt_data_cout = sizeof(txt_data) / sizeof(txt_data[0]);
186+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_txt_set(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, txt_data, txt_data_cout));
187+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
188+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_selfhosted_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
189+
TEST_ASSERT_NOT_EQUAL(NULL, results);
190+
TEST_ASSERT_NOT_EQUAL(NULL, results->txt);
191+
TEST_ASSERT_EQUAL(txt_data_cout, results->txt_count);
192+
// compare txt values by keys
193+
size_t matches = 0;
194+
for (int i = 0; i < results->txt_count; ++i) // iterates over the results we get from mdns_lookup()
195+
for (int j = 0; j < txt_data_cout; ++j) // iterates over our test records
196+
if (strcmp(results->txt[i].key, txt_data[j].key) == 0) { // we compare the value only if the key matches
197+
TEST_ASSERT_EQUAL_STRING(results->txt[i].value, txt_data[j].value);
198+
++matches;
199+
}
200+
TEST_ASSERT_EQUAL(txt_data_cout, matches); // checks that we went over all our txt items
201+
mdns_query_results_free(results);
202+
203+
// Now remove the service
204+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_remove(MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO));
205+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
206+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_selfhosted_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
207+
TEST_ASSERT_EQUAL(NULL, results);
208+
209+
mdns_free();
210+
esp_event_loop_delete_default();
211+
}
212+
213+
TEST(mdns, add_remove_deleg_service)
214+
{
215+
mdns_ip_addr_t addr;
216+
addr.addr.type = ESP_IPADDR_TYPE_V4;
217+
addr.addr.u_addr.ip4.addr = esp_ip4addr_aton("127.0.0.1");
218+
addr.next = NULL;
219+
mdns_result_t *results = NULL;
220+
test_case_uses_tcpip();
221+
TEST_ASSERT_EQUAL(ESP_OK, esp_event_loop_create_default());
222+
TEST_ASSERT_EQUAL(ESP_OK, mdns_init() );
223+
TEST_ASSERT_EQUAL(ESP_OK, mdns_hostname_set(MDNS_HOSTNAME));
224+
TEST_ASSERT_EQUAL(ESP_OK, mdns_delegate_hostname_add(MDNS_DELEGATE_HOSTNAME, &addr) );
225+
226+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_add_for_host(MDNS_INSTANCE, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME, MDNS_SERVICE_PORT, NULL, 0));
227+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
228+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_delegated_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
229+
TEST_ASSERT_NOT_EQUAL(NULL, results);
230+
TEST_ASSERT_EQUAL_STRING(MDNS_INSTANCE, results->instance_name);
231+
TEST_ASSERT_EQUAL_STRING(MDNS_SERVICE_NAME, results->service_type);
232+
TEST_ASSERT_EQUAL(MDNS_SERVICE_PORT, results->port);
233+
TEST_ASSERT_EQUAL(NULL, results->txt);
234+
mdns_query_results_free(results);
235+
236+
// Update service properties: port
237+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_port_set_for_host(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME, MDNS_SERVICE_PORT + 1));
238+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
239+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_delegated_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
240+
TEST_ASSERT_NOT_EQUAL(NULL, results);
241+
TEST_ASSERT_EQUAL(MDNS_SERVICE_PORT + 1, results->port);
242+
mdns_query_results_free(results);
243+
244+
// Update service properties: instance
245+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_instance_name_set_for_host(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME, MDNS_INSTANCE "1" ));
246+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
247+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_delegated_service(MDNS_INSTANCE "1", MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
248+
TEST_ASSERT_NOT_EQUAL(NULL, results);
249+
TEST_ASSERT_EQUAL_STRING(MDNS_INSTANCE "1", results->instance_name);
250+
mdns_query_results_free(results);
251+
252+
// Update service properties: txt
253+
mdns_txt_item_t txt_data[] = {
254+
{"key1", "esp32"},
255+
{"key2", "value"},
256+
};
257+
const size_t txt_data_cout = sizeof(txt_data) / sizeof(txt_data[0]);
258+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_txt_set_for_host(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME, txt_data, txt_data_cout));
259+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
260+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_delegated_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
261+
TEST_ASSERT_NOT_EQUAL(NULL, results);
262+
TEST_ASSERT_NOT_EQUAL(NULL, results->txt);
263+
TEST_ASSERT_EQUAL(txt_data_cout, results->txt_count);
264+
// compare txt values by keys
265+
size_t matches = 0;
266+
for (int i = 0; i < results->txt_count; ++i) // iterates over the results we get from mdns_lookup()
267+
for (int j = 0; j < txt_data_cout; ++j) // iterates over our test records
268+
if (strcmp(results->txt[i].key, txt_data[j].key) == 0) { // we compare the value only if the key matches
269+
TEST_ASSERT_EQUAL_STRING(results->txt[i].value, txt_data[j].value);
270+
++matches;
271+
}
272+
TEST_ASSERT_EQUAL(txt_data_cout, matches); // checks that we went over all our txt items
273+
mdns_query_results_free(results);
274+
275+
// Now remove the service
276+
TEST_ASSERT_EQUAL(ESP_OK, mdns_service_remove_for_host(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, MDNS_DELEGATE_HOSTNAME));
277+
yield_to_all_priorities(); // Make sure that mdns task has executed to add the hostname
278+
TEST_ASSERT_EQUAL(ESP_OK, mdns_lookup_delegated_service(NULL, MDNS_SERVICE_NAME, MDNS_SERVICE_PROTO, 1, &results));
279+
TEST_ASSERT_EQUAL(NULL, results);
280+
281+
mdns_free();
282+
esp_event_loop_delete_default();
283+
}
145284
TEST_GROUP_RUNNER(mdns)
146285
{
147286
RUN_TEST_CASE(mdns, api_fails_with_invalid_state)
148287
RUN_TEST_CASE(mdns, api_fails_with_expected_err)
149288
RUN_TEST_CASE(mdns, query_api_fails_with_expected_err)
150289
RUN_TEST_CASE(mdns, init_deinit)
290+
RUN_TEST_CASE(mdns, add_remove_service)
291+
RUN_TEST_CASE(mdns, add_remove_deleg_service)
292+
151293
}
152294

153295
void app_main(void)

0 commit comments

Comments
 (0)