|
1 | 1 | /*
|
2 |
| - * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD |
| 2 | + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD |
3 | 3 | *
|
4 | 4 | * SPDX-License-Identifier: Unlicense OR CC0-1.0
|
5 | 5 | */
|
6 | 6 |
|
| 7 | +#include <string.h> |
7 | 8 | #include "mdns.h"
|
8 | 9 | #include "esp_event.h"
|
9 | 10 | #include "unity.h"
|
@@ -142,12 +143,153 @@ TEST(mdns, query_api_fails_with_expected_err)
|
142 | 143 | esp_event_loop_delete_default();
|
143 | 144 | }
|
144 | 145 |
|
| 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 | +} |
145 | 284 | TEST_GROUP_RUNNER(mdns)
|
146 | 285 | {
|
147 | 286 | RUN_TEST_CASE(mdns, api_fails_with_invalid_state)
|
148 | 287 | RUN_TEST_CASE(mdns, api_fails_with_expected_err)
|
149 | 288 | RUN_TEST_CASE(mdns, query_api_fails_with_expected_err)
|
150 | 289 | RUN_TEST_CASE(mdns, init_deinit)
|
| 290 | + RUN_TEST_CASE(mdns, add_remove_service) |
| 291 | + RUN_TEST_CASE(mdns, add_remove_deleg_service) |
| 292 | + |
151 | 293 | }
|
152 | 294 |
|
153 | 295 | void app_main(void)
|
|
0 commit comments