1c87c5fbaSopenharmony_ci/* libcoap unit tests 2c87c5fbaSopenharmony_ci * 3c87c5fbaSopenharmony_ci * Copyright (C) 2013,2015,2022-2023 Olaf Bergmann <bergmann@tzi.org> 4c87c5fbaSopenharmony_ci * 5c87c5fbaSopenharmony_ci * SPDX-License-Identifier: BSD-2-Clause 6c87c5fbaSopenharmony_ci * 7c87c5fbaSopenharmony_ci * This file is part of the CoAP library libcoap. Please see 8c87c5fbaSopenharmony_ci * README for terms of use. 9c87c5fbaSopenharmony_ci */ 10c87c5fbaSopenharmony_ci 11c87c5fbaSopenharmony_ci#include "test_common.h" 12c87c5fbaSopenharmony_ci#include "test_sendqueue.h" 13c87c5fbaSopenharmony_ci 14c87c5fbaSopenharmony_ci#include <stdio.h> 15c87c5fbaSopenharmony_ci 16c87c5fbaSopenharmony_ci#if COAP_CLIENT_SUPPORT 17c87c5fbaSopenharmony_cistatic coap_context_t *ctx; /* Holds the coap context for most tests */ 18c87c5fbaSopenharmony_cistatic coap_session_t *session; /* Holds a reference-counted session object */ 19c87c5fbaSopenharmony_ci 20c87c5fbaSopenharmony_ci/* timestamps for tests. The first element in this array denotes the 21c87c5fbaSopenharmony_ci * base time in ticks, the following elements are timestamps relative 22c87c5fbaSopenharmony_ci * to this basetime. 23c87c5fbaSopenharmony_ci */ 24c87c5fbaSopenharmony_cistatic coap_tick_t timestamp[] = { 25c87c5fbaSopenharmony_ci 0, 100, 200, 30, 160 26c87c5fbaSopenharmony_ci}; 27c87c5fbaSopenharmony_ci 28c87c5fbaSopenharmony_ci/* nodes for testing. node[0] is left empty */ 29c87c5fbaSopenharmony_cicoap_queue_t *node[5]; 30c87c5fbaSopenharmony_ci 31c87c5fbaSopenharmony_cistatic coap_tick_t 32c87c5fbaSopenharmony_ciadd_timestamps(coap_queue_t *queue, size_t num) { 33c87c5fbaSopenharmony_ci coap_tick_t t = 0; 34c87c5fbaSopenharmony_ci while (queue && num--) { 35c87c5fbaSopenharmony_ci t += queue->t; 36c87c5fbaSopenharmony_ci queue = queue->next; 37c87c5fbaSopenharmony_ci } 38c87c5fbaSopenharmony_ci 39c87c5fbaSopenharmony_ci return t; 40c87c5fbaSopenharmony_ci} 41c87c5fbaSopenharmony_ci 42c87c5fbaSopenharmony_cistatic void 43c87c5fbaSopenharmony_cit_sendqueue1(void) { 44c87c5fbaSopenharmony_ci int result = coap_insert_node(&ctx->sendqueue, node[1]); 45c87c5fbaSopenharmony_ci 46c87c5fbaSopenharmony_ci CU_ASSERT(result > 0); 47c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 48c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[1]); 49c87c5fbaSopenharmony_ci CU_ASSERT(node[1]->t == timestamp[1]); 50c87c5fbaSopenharmony_ci} 51c87c5fbaSopenharmony_ci 52c87c5fbaSopenharmony_cistatic void 53c87c5fbaSopenharmony_cit_sendqueue2(void) { 54c87c5fbaSopenharmony_ci int result; 55c87c5fbaSopenharmony_ci 56c87c5fbaSopenharmony_ci result = coap_insert_node(&ctx->sendqueue, node[2]); 57c87c5fbaSopenharmony_ci 58c87c5fbaSopenharmony_ci CU_ASSERT(result > 0); 59c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[1]); 60c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue->next, node[2]); 61c87c5fbaSopenharmony_ci 62c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->t == timestamp[1]); 63c87c5fbaSopenharmony_ci CU_ASSERT(node[2]->t == timestamp[2] - timestamp[1]); 64c87c5fbaSopenharmony_ci} 65c87c5fbaSopenharmony_ci 66c87c5fbaSopenharmony_ci/* insert new node as first element in queue */ 67c87c5fbaSopenharmony_cistatic void 68c87c5fbaSopenharmony_cit_sendqueue3(void) { 69c87c5fbaSopenharmony_ci int result; 70c87c5fbaSopenharmony_ci result = coap_insert_node(&ctx->sendqueue, node[3]); 71c87c5fbaSopenharmony_ci 72c87c5fbaSopenharmony_ci CU_ASSERT(result > 0); 73c87c5fbaSopenharmony_ci 74c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[3]); 75c87c5fbaSopenharmony_ci CU_ASSERT(node[3]->t == timestamp[3]); 76c87c5fbaSopenharmony_ci 77c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next); 78c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next->next); 79c87c5fbaSopenharmony_ci 80c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->next->t == timestamp[1] - timestamp[3]); 81c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->next->next->t == timestamp[2] - timestamp[1]); 82c87c5fbaSopenharmony_ci} 83c87c5fbaSopenharmony_ci 84c87c5fbaSopenharmony_ci/* insert new node as fourth element in queue */ 85c87c5fbaSopenharmony_cistatic void 86c87c5fbaSopenharmony_cit_sendqueue4(void) { 87c87c5fbaSopenharmony_ci int result; 88c87c5fbaSopenharmony_ci 89c87c5fbaSopenharmony_ci result = coap_insert_node(&ctx->sendqueue, node[4]); 90c87c5fbaSopenharmony_ci 91c87c5fbaSopenharmony_ci CU_ASSERT(result > 0); 92c87c5fbaSopenharmony_ci 93c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[3]); 94c87c5fbaSopenharmony_ci 95c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next); 96c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue->next, node[1]); 97c87c5fbaSopenharmony_ci 98c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next->next); 99c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue->next->next, node[4]); 100c87c5fbaSopenharmony_ci 101c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next->next->next); 102c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue->next->next->next, node[2]); 103c87c5fbaSopenharmony_ci 104c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->next->t == timestamp[1] - timestamp[3]); 105c87c5fbaSopenharmony_ci CU_ASSERT(add_timestamps(ctx->sendqueue, 1) == timestamp[3]); 106c87c5fbaSopenharmony_ci CU_ASSERT(add_timestamps(ctx->sendqueue, 2) == timestamp[1]); 107c87c5fbaSopenharmony_ci CU_ASSERT(add_timestamps(ctx->sendqueue, 3) == timestamp[4]); 108c87c5fbaSopenharmony_ci CU_ASSERT(add_timestamps(ctx->sendqueue, 4) == timestamp[2]); 109c87c5fbaSopenharmony_ci} 110c87c5fbaSopenharmony_ci 111c87c5fbaSopenharmony_cistatic void 112c87c5fbaSopenharmony_cit_sendqueue5(void) { 113c87c5fbaSopenharmony_ci const coap_tick_diff_t delta1 = 20, delta2 = 130; 114c87c5fbaSopenharmony_ci unsigned int result; 115c87c5fbaSopenharmony_ci coap_tick_t now; 116c87c5fbaSopenharmony_ci 117c87c5fbaSopenharmony_ci /* space for saving the current node timestamps */ 118c87c5fbaSopenharmony_ci static coap_tick_t times[sizeof(timestamp)/sizeof(coap_tick_t)]; 119c87c5fbaSopenharmony_ci coap_queue_t *p; 120c87c5fbaSopenharmony_ci int i; 121c87c5fbaSopenharmony_ci 122c87c5fbaSopenharmony_ci /* save timestamps of nodes in the sendqueue in their actual order */ 123c87c5fbaSopenharmony_ci memset(times, 0, sizeof(times)); 124c87c5fbaSopenharmony_ci for (p = ctx->sendqueue, i = 0; p; p = p->next, i++) { 125c87c5fbaSopenharmony_ci times[i] = p->t; 126c87c5fbaSopenharmony_ci } 127c87c5fbaSopenharmony_ci 128c87c5fbaSopenharmony_ci coap_ticks(&now); 129c87c5fbaSopenharmony_ci ctx->sendqueue_basetime = now; 130c87c5fbaSopenharmony_ci 131c87c5fbaSopenharmony_ci now -= delta1; 132c87c5fbaSopenharmony_ci result = coap_adjust_basetime(ctx, now); 133c87c5fbaSopenharmony_ci 134c87c5fbaSopenharmony_ci CU_ASSERT(result == 0); 135c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 136c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue_basetime == now); 137c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->t == timestamp[3] + delta1); 138c87c5fbaSopenharmony_ci 139c87c5fbaSopenharmony_ci now += delta2; 140c87c5fbaSopenharmony_ci result = coap_adjust_basetime(ctx, now); 141c87c5fbaSopenharmony_ci CU_ASSERT(result == 2); 142c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue_basetime == now); 143c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 144c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->t == 0); 145c87c5fbaSopenharmony_ci 146c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next); 147c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->next->t == 0); 148c87c5fbaSopenharmony_ci 149c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next->next); 150c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->next->next->t == delta2 - delta1 - timestamp[1]); 151c87c5fbaSopenharmony_ci 152c87c5fbaSopenharmony_ci /* restore timestamps of nodes in the sendqueue */ 153c87c5fbaSopenharmony_ci for (p = ctx->sendqueue, i = 0; p; p = p->next, i++) { 154c87c5fbaSopenharmony_ci p->t = times[i]; 155c87c5fbaSopenharmony_ci } 156c87c5fbaSopenharmony_ci} 157c87c5fbaSopenharmony_ci 158c87c5fbaSopenharmony_cistatic void 159c87c5fbaSopenharmony_cit_sendqueue6(void) { 160c87c5fbaSopenharmony_ci unsigned int result; 161c87c5fbaSopenharmony_ci coap_tick_t now; 162c87c5fbaSopenharmony_ci const coap_tick_diff_t delta = 20; 163c87c5fbaSopenharmony_ci coap_queue_t *tmpqueue = ctx->sendqueue; 164c87c5fbaSopenharmony_ci 165c87c5fbaSopenharmony_ci /* space for saving the current node timestamps */ 166c87c5fbaSopenharmony_ci static coap_tick_t times[sizeof(timestamp)/sizeof(coap_tick_t)]; 167c87c5fbaSopenharmony_ci coap_queue_t *p; 168c87c5fbaSopenharmony_ci int i; 169c87c5fbaSopenharmony_ci 170c87c5fbaSopenharmony_ci /* save timestamps of nodes in the sendqueue in their actual order */ 171c87c5fbaSopenharmony_ci memset(times, 0, sizeof(times)); 172c87c5fbaSopenharmony_ci for (p = ctx->sendqueue, i = 0; p; p = p->next, i++) { 173c87c5fbaSopenharmony_ci times[i] = p->t; 174c87c5fbaSopenharmony_ci } 175c87c5fbaSopenharmony_ci 176c87c5fbaSopenharmony_ci coap_ticks(&now); 177c87c5fbaSopenharmony_ci ctx->sendqueue = NULL; 178c87c5fbaSopenharmony_ci ctx->sendqueue_basetime = now; 179c87c5fbaSopenharmony_ci 180c87c5fbaSopenharmony_ci result = coap_adjust_basetime(ctx, now + delta); 181c87c5fbaSopenharmony_ci 182c87c5fbaSopenharmony_ci CU_ASSERT(result == 0); 183c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue_basetime == now + delta); 184c87c5fbaSopenharmony_ci 185c87c5fbaSopenharmony_ci /* restore sendqueue */ 186c87c5fbaSopenharmony_ci ctx->sendqueue = tmpqueue; 187c87c5fbaSopenharmony_ci} 188c87c5fbaSopenharmony_ci 189c87c5fbaSopenharmony_cistatic void 190c87c5fbaSopenharmony_cit_sendqueue7(void) { 191c87c5fbaSopenharmony_ci int result; 192c87c5fbaSopenharmony_ci coap_queue_t *tmp_node; 193c87c5fbaSopenharmony_ci 194c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 195c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[3]); 196c87c5fbaSopenharmony_ci 197c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next); 198c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue->next, node[1]); 199c87c5fbaSopenharmony_ci 200c87c5fbaSopenharmony_ci result = coap_remove_from_queue(&ctx->sendqueue, session, 3, &tmp_node); 201c87c5fbaSopenharmony_ci 202c87c5fbaSopenharmony_ci CU_ASSERT(result == 1); 203c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(tmp_node); 204c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(tmp_node, node[3]); 205c87c5fbaSopenharmony_ci 206c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 207c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[1]); 208c87c5fbaSopenharmony_ci 209c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->t == timestamp[1]); 210c87c5fbaSopenharmony_ci} 211c87c5fbaSopenharmony_ci 212c87c5fbaSopenharmony_cistatic void 213c87c5fbaSopenharmony_cit_sendqueue8(void) { 214c87c5fbaSopenharmony_ci int result; 215c87c5fbaSopenharmony_ci coap_queue_t *tmp_node; 216c87c5fbaSopenharmony_ci 217c87c5fbaSopenharmony_ci result = coap_remove_from_queue(&ctx->sendqueue, session, 4, &tmp_node); 218c87c5fbaSopenharmony_ci 219c87c5fbaSopenharmony_ci CU_ASSERT(result == 1); 220c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(tmp_node); 221c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(tmp_node, node[4]); 222c87c5fbaSopenharmony_ci 223c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 224c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[1]); 225c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->t == timestamp[1]); 226c87c5fbaSopenharmony_ci 227c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue->next); 228c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue->next, node[2]); 229c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->next->t == timestamp[2] - timestamp[1]); 230c87c5fbaSopenharmony_ci 231c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NULL(ctx->sendqueue->next->next); 232c87c5fbaSopenharmony_ci} 233c87c5fbaSopenharmony_ci 234c87c5fbaSopenharmony_cistatic void 235c87c5fbaSopenharmony_cit_sendqueue9(void) { 236c87c5fbaSopenharmony_ci coap_queue_t *tmp_node; 237c87c5fbaSopenharmony_ci tmp_node = coap_peek_next(ctx); 238c87c5fbaSopenharmony_ci 239c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(tmp_node); 240c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(tmp_node, node[1]); 241c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(tmp_node, ctx->sendqueue); 242c87c5fbaSopenharmony_ci 243c87c5fbaSopenharmony_ci tmp_node = coap_pop_next(ctx); 244c87c5fbaSopenharmony_ci 245c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(tmp_node); 246c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(tmp_node, node[1]); 247c87c5fbaSopenharmony_ci 248c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(ctx->sendqueue); 249c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(ctx->sendqueue, node[2]); 250c87c5fbaSopenharmony_ci 251c87c5fbaSopenharmony_ci CU_ASSERT(tmp_node->t == timestamp[1]); 252c87c5fbaSopenharmony_ci CU_ASSERT(ctx->sendqueue->t == timestamp[2]); 253c87c5fbaSopenharmony_ci 254c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NULL(ctx->sendqueue->next); 255c87c5fbaSopenharmony_ci} 256c87c5fbaSopenharmony_ci 257c87c5fbaSopenharmony_cistatic void 258c87c5fbaSopenharmony_cit_sendqueue10(void) { 259c87c5fbaSopenharmony_ci coap_queue_t *tmp_node; 260c87c5fbaSopenharmony_ci 261c87c5fbaSopenharmony_ci tmp_node = coap_pop_next(ctx); 262c87c5fbaSopenharmony_ci 263c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NOT_NULL(tmp_node); 264c87c5fbaSopenharmony_ci CU_ASSERT_PTR_EQUAL(tmp_node, node[2]); 265c87c5fbaSopenharmony_ci 266c87c5fbaSopenharmony_ci CU_ASSERT_PTR_NULL(ctx->sendqueue); 267c87c5fbaSopenharmony_ci 268c87c5fbaSopenharmony_ci CU_ASSERT(tmp_node->t == timestamp[2]); 269c87c5fbaSopenharmony_ci} 270c87c5fbaSopenharmony_ci 271c87c5fbaSopenharmony_ci/* This function creates a set of nodes for testing. These nodes 272c87c5fbaSopenharmony_ci * will exist for all tests and are modified by coap_insert_node() 273c87c5fbaSopenharmony_ci * and coap_remove_from_queue(). 274c87c5fbaSopenharmony_ci */ 275c87c5fbaSopenharmony_cistatic int 276c87c5fbaSopenharmony_cit_sendqueue_tests_create(void) { 277c87c5fbaSopenharmony_ci size_t n, error = 0; 278c87c5fbaSopenharmony_ci coap_address_t addr; 279c87c5fbaSopenharmony_ci coap_address_init(&addr); 280c87c5fbaSopenharmony_ci 281c87c5fbaSopenharmony_ci addr.size = sizeof(struct sockaddr_in6); 282c87c5fbaSopenharmony_ci addr.addr.sin6.sin6_family = AF_INET6; 283c87c5fbaSopenharmony_ci addr.addr.sin6.sin6_addr = in6addr_any; 284c87c5fbaSopenharmony_ci addr.addr.sin6.sin6_port = htons(COAP_DEFAULT_PORT); 285c87c5fbaSopenharmony_ci 286c87c5fbaSopenharmony_ci ctx = coap_new_context(&addr); 287c87c5fbaSopenharmony_ci 288c87c5fbaSopenharmony_ci addr.addr.sin6.sin6_addr = in6addr_loopback; 289c87c5fbaSopenharmony_ci session = coap_new_client_session(ctx, NULL, &addr, COAP_PROTO_UDP); 290c87c5fbaSopenharmony_ci 291c87c5fbaSopenharmony_ci coap_ticks(×tamp[0]); 292c87c5fbaSopenharmony_ci 293c87c5fbaSopenharmony_ci memset(node, 0, sizeof(node)); 294c87c5fbaSopenharmony_ci for (n = 1; n < sizeof(node)/sizeof(coap_queue_t *); n++) { 295c87c5fbaSopenharmony_ci node[n] = coap_new_node(); 296c87c5fbaSopenharmony_ci if (!node[n]) { 297c87c5fbaSopenharmony_ci error = 1; 298c87c5fbaSopenharmony_ci break; 299c87c5fbaSopenharmony_ci } 300c87c5fbaSopenharmony_ci 301c87c5fbaSopenharmony_ci node[n]->id = n; 302c87c5fbaSopenharmony_ci node[n]->t = timestamp[n]; 303c87c5fbaSopenharmony_ci node[n]->session = coap_session_reference(session); 304c87c5fbaSopenharmony_ci } 305c87c5fbaSopenharmony_ci 306c87c5fbaSopenharmony_ci if (error) { 307c87c5fbaSopenharmony_ci /* destroy all test nodes and set entry to zero */ 308c87c5fbaSopenharmony_ci for (n = 0; n < sizeof(node)/sizeof(coap_queue_t *); n++) { 309c87c5fbaSopenharmony_ci if (node[n]) { 310c87c5fbaSopenharmony_ci coap_delete_node(node[n]); 311c87c5fbaSopenharmony_ci node[n] = NULL; 312c87c5fbaSopenharmony_ci } 313c87c5fbaSopenharmony_ci } 314c87c5fbaSopenharmony_ci coap_free_context(ctx); 315c87c5fbaSopenharmony_ci ctx = NULL; 316c87c5fbaSopenharmony_ci } 317c87c5fbaSopenharmony_ci 318c87c5fbaSopenharmony_ci return error; 319c87c5fbaSopenharmony_ci} 320c87c5fbaSopenharmony_ci 321c87c5fbaSopenharmony_cistatic int 322c87c5fbaSopenharmony_cit_sendqueue_tests_remove(void) { 323c87c5fbaSopenharmony_ci size_t n; 324c87c5fbaSopenharmony_ci for (n = 0; n < sizeof(node)/sizeof(coap_queue_t *); n++) { 325c87c5fbaSopenharmony_ci if (node[n]) { 326c87c5fbaSopenharmony_ci coap_delete_node(node[n]); 327c87c5fbaSopenharmony_ci node[n] = NULL; 328c87c5fbaSopenharmony_ci } 329c87c5fbaSopenharmony_ci } 330c87c5fbaSopenharmony_ci coap_free_context(ctx); 331c87c5fbaSopenharmony_ci return 0; 332c87c5fbaSopenharmony_ci} 333c87c5fbaSopenharmony_ci 334c87c5fbaSopenharmony_ciCU_pSuite 335c87c5fbaSopenharmony_cit_init_sendqueue_tests(void) { 336c87c5fbaSopenharmony_ci CU_pSuite suite; 337c87c5fbaSopenharmony_ci 338c87c5fbaSopenharmony_ci suite = CU_add_suite("sendqueue", 339c87c5fbaSopenharmony_ci t_sendqueue_tests_create, t_sendqueue_tests_remove); 340c87c5fbaSopenharmony_ci if (!suite) { /* signal error */ 341c87c5fbaSopenharmony_ci fprintf(stderr, "W: cannot add sendqueue test suite (%s)\n", 342c87c5fbaSopenharmony_ci CU_get_error_msg()); 343c87c5fbaSopenharmony_ci 344c87c5fbaSopenharmony_ci return NULL; 345c87c5fbaSopenharmony_ci } 346c87c5fbaSopenharmony_ci 347c87c5fbaSopenharmony_ci#define SENDQUEUE_TEST(s,t) \ 348c87c5fbaSopenharmony_ci if (!CU_ADD_TEST(s,t)) { \ 349c87c5fbaSopenharmony_ci fprintf(stderr, "W: cannot add sendqueue test (%s)\n", \ 350c87c5fbaSopenharmony_ci CU_get_error_msg()); \ 351c87c5fbaSopenharmony_ci } 352c87c5fbaSopenharmony_ci 353c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue1); 354c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue2); 355c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue3); 356c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue4); 357c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue5); 358c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue6); 359c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue7); 360c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue8); 361c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue9); 362c87c5fbaSopenharmony_ci SENDQUEUE_TEST(suite, t_sendqueue10); 363c87c5fbaSopenharmony_ci 364c87c5fbaSopenharmony_ci return suite; 365c87c5fbaSopenharmony_ci} 366c87c5fbaSopenharmony_ci#endif /* COAP_CLIENT_SUPPORT */ 367