1c87c5fbaSopenharmony_ci/* libcoap unit tests
2c87c5fbaSopenharmony_ci *
3c87c5fbaSopenharmony_ci * Copyright (C) 2019-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_encode.h"
13c87c5fbaSopenharmony_ci
14c87c5fbaSopenharmony_ci#include <stdio.h>
15c87c5fbaSopenharmony_ci#include <stdlib.h>
16c87c5fbaSopenharmony_ci#include <string.h>
17c87c5fbaSopenharmony_ci
18c87c5fbaSopenharmony_ci/************************************************************************
19c87c5fbaSopenharmony_ci ** decoder tests
20c87c5fbaSopenharmony_ci ************************************************************************/
21c87c5fbaSopenharmony_ci
22c87c5fbaSopenharmony_cistatic void
23c87c5fbaSopenharmony_cit_decode1(void) {
24c87c5fbaSopenharmony_ci  const coap_binary_t teststr = {  0, NULL };
25c87c5fbaSopenharmony_ci  unsigned int result;
26c87c5fbaSopenharmony_ci
27c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes(teststr.s, teststr.length);
28c87c5fbaSopenharmony_ci
29c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0);
30c87c5fbaSopenharmony_ci}
31c87c5fbaSopenharmony_ci
32c87c5fbaSopenharmony_cistatic void
33c87c5fbaSopenharmony_cit_decode2(void) {
34c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01 };
35c87c5fbaSopenharmony_ci  coap_binary_t teststr = {  sizeof(data), data };
36c87c5fbaSopenharmony_ci  unsigned int result;
37c87c5fbaSopenharmony_ci
38c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes8(teststr.s, teststr.length);
39c87c5fbaSopenharmony_ci
40c87c5fbaSopenharmony_ci  CU_ASSERT(result == 1);
41c87c5fbaSopenharmony_ci}
42c87c5fbaSopenharmony_ci
43c87c5fbaSopenharmony_cistatic void
44c87c5fbaSopenharmony_cit_decode3(void) {
45c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01, 0x00, 0x00, 0x00 };
46c87c5fbaSopenharmony_ci  coap_binary_t teststr = { sizeof(data), data };
47c87c5fbaSopenharmony_ci  unsigned int result;
48c87c5fbaSopenharmony_ci
49c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes(teststr.s, teststr.length);
50c87c5fbaSopenharmony_ci
51c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0x01000000);
52c87c5fbaSopenharmony_ci}
53c87c5fbaSopenharmony_ci
54c87c5fbaSopenharmony_cistatic void
55c87c5fbaSopenharmony_cit_decode4(void) {
56c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x05, 0x06, 0x07, 0x08 };
57c87c5fbaSopenharmony_ci  coap_binary_t teststr = { sizeof(data), data };
58c87c5fbaSopenharmony_ci  unsigned int result;
59c87c5fbaSopenharmony_ci
60c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes(teststr.s, teststr.length);
61c87c5fbaSopenharmony_ci
62c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0x05060708);
63c87c5fbaSopenharmony_ci}
64c87c5fbaSopenharmony_ci
65c87c5fbaSopenharmony_cistatic void
66c87c5fbaSopenharmony_cit_decode5(void) {
67c87c5fbaSopenharmony_ci  const coap_binary_t teststr = {  0, NULL };
68c87c5fbaSopenharmony_ci  uint64_t result;
69c87c5fbaSopenharmony_ci
70c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes8(teststr.s, teststr.length);
71c87c5fbaSopenharmony_ci
72c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0);
73c87c5fbaSopenharmony_ci}
74c87c5fbaSopenharmony_ci
75c87c5fbaSopenharmony_cistatic void
76c87c5fbaSopenharmony_cit_decode6(void) {
77c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01 };
78c87c5fbaSopenharmony_ci  coap_binary_t teststr = {  sizeof(data), data };
79c87c5fbaSopenharmony_ci  uint64_t result;
80c87c5fbaSopenharmony_ci
81c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes8(teststr.s, teststr.length);
82c87c5fbaSopenharmony_ci
83c87c5fbaSopenharmony_ci  CU_ASSERT(result == 1);
84c87c5fbaSopenharmony_ci}
85c87c5fbaSopenharmony_ci
86c87c5fbaSopenharmony_cistatic void
87c87c5fbaSopenharmony_cit_decode7(void) {
88c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
89c87c5fbaSopenharmony_ci  coap_binary_t teststr = { sizeof(data), data };
90c87c5fbaSopenharmony_ci  uint64_t result;
91c87c5fbaSopenharmony_ci
92c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes8(teststr.s, teststr.length);
93c87c5fbaSopenharmony_ci
94c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0x0100000000000000);
95c87c5fbaSopenharmony_ci}
96c87c5fbaSopenharmony_ci
97c87c5fbaSopenharmony_cistatic void
98c87c5fbaSopenharmony_cit_decode8(void) {
99c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
100c87c5fbaSopenharmony_ci  coap_binary_t teststr = { sizeof(data), data };
101c87c5fbaSopenharmony_ci  uint64_t result;
102c87c5fbaSopenharmony_ci
103c87c5fbaSopenharmony_ci  result = coap_decode_var_bytes8(teststr.s, teststr.length);
104c87c5fbaSopenharmony_ci
105c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0x0102030405060708);
106c87c5fbaSopenharmony_ci}
107c87c5fbaSopenharmony_ci
108c87c5fbaSopenharmony_ci/************************************************************************
109c87c5fbaSopenharmony_ci ** encoder tests
110c87c5fbaSopenharmony_ci ************************************************************************/
111c87c5fbaSopenharmony_ci
112c87c5fbaSopenharmony_cistatic void
113c87c5fbaSopenharmony_cit_encode1(void) {
114c87c5fbaSopenharmony_ci  uint8_t buf[16];
115c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x00 };
116c87c5fbaSopenharmony_ci  unsigned int result;
117c87c5fbaSopenharmony_ci
118c87c5fbaSopenharmony_ci  result = coap_encode_var_safe(buf, sizeof(buf), 0x00);
119c87c5fbaSopenharmony_ci
120c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0);
121c87c5fbaSopenharmony_ci
122c87c5fbaSopenharmony_ci  CU_ASSERT(memcmp(buf, data, result) == 0);
123c87c5fbaSopenharmony_ci}
124c87c5fbaSopenharmony_ci
125c87c5fbaSopenharmony_cistatic void
126c87c5fbaSopenharmony_cit_encode2(void) {
127c87c5fbaSopenharmony_ci  uint8_t buf[16];
128c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01 };
129c87c5fbaSopenharmony_ci  unsigned int result;
130c87c5fbaSopenharmony_ci
131c87c5fbaSopenharmony_ci  result = coap_encode_var_safe(buf, sizeof(buf), 0x01);
132c87c5fbaSopenharmony_ci
133c87c5fbaSopenharmony_ci  CU_ASSERT(result == sizeof(data));
134c87c5fbaSopenharmony_ci
135c87c5fbaSopenharmony_ci  CU_ASSERT(memcmp(buf, data, result) == 0);
136c87c5fbaSopenharmony_ci}
137c87c5fbaSopenharmony_ci
138c87c5fbaSopenharmony_cistatic void
139c87c5fbaSopenharmony_cit_encode3(void) {
140c87c5fbaSopenharmony_ci  uint8_t buf[16];
141c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x05, 0x06, 0x07, 0x08 };
142c87c5fbaSopenharmony_ci  unsigned int result;
143c87c5fbaSopenharmony_ci
144c87c5fbaSopenharmony_ci  result = coap_encode_var_safe8(buf, sizeof(buf), 0x05060708);
145c87c5fbaSopenharmony_ci
146c87c5fbaSopenharmony_ci  CU_ASSERT(result == sizeof(data));
147c87c5fbaSopenharmony_ci
148c87c5fbaSopenharmony_ci  CU_ASSERT(memcmp(buf, data, result) == 0);
149c87c5fbaSopenharmony_ci}
150c87c5fbaSopenharmony_ci
151c87c5fbaSopenharmony_cistatic void
152c87c5fbaSopenharmony_cit_encode4(void) {
153c87c5fbaSopenharmony_ci  unsigned int result = 0;
154c87c5fbaSopenharmony_ci  /* This check will abort the program if configured with --enable-assert */
155c87c5fbaSopenharmony_ci#ifdef NDEBUG
156c87c5fbaSopenharmony_ci  uint8_t buf[16];
157c87c5fbaSopenharmony_ci  result = coap_encode_var_safe(buf, 2, 0x01020304);
158c87c5fbaSopenharmony_ci#endif /* NDEBUG */
159c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0);
160c87c5fbaSopenharmony_ci}
161c87c5fbaSopenharmony_ci
162c87c5fbaSopenharmony_cistatic void
163c87c5fbaSopenharmony_cit_encode5(void) {
164c87c5fbaSopenharmony_ci  uint8_t buf[16];
165c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x00 };
166c87c5fbaSopenharmony_ci  unsigned int result;
167c87c5fbaSopenharmony_ci
168c87c5fbaSopenharmony_ci  result = coap_encode_var_safe8(buf, sizeof(buf), 0x00);
169c87c5fbaSopenharmony_ci
170c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0);
171c87c5fbaSopenharmony_ci
172c87c5fbaSopenharmony_ci  CU_ASSERT(memcmp(buf, data, result) == 0);
173c87c5fbaSopenharmony_ci}
174c87c5fbaSopenharmony_ci
175c87c5fbaSopenharmony_cistatic void
176c87c5fbaSopenharmony_cit_encode6(void) {
177c87c5fbaSopenharmony_ci  uint8_t buf[16];
178c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01 };
179c87c5fbaSopenharmony_ci  unsigned int result;
180c87c5fbaSopenharmony_ci
181c87c5fbaSopenharmony_ci  result = coap_encode_var_safe8(buf, sizeof(buf), 0x01);
182c87c5fbaSopenharmony_ci
183c87c5fbaSopenharmony_ci  CU_ASSERT(result == sizeof(data));
184c87c5fbaSopenharmony_ci
185c87c5fbaSopenharmony_ci  CU_ASSERT(memcmp(buf, data, result) == 0);
186c87c5fbaSopenharmony_ci}
187c87c5fbaSopenharmony_ci
188c87c5fbaSopenharmony_cistatic void
189c87c5fbaSopenharmony_cit_encode7(void) {
190c87c5fbaSopenharmony_ci  uint8_t buf[16];
191c87c5fbaSopenharmony_ci  uint8_t data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
192c87c5fbaSopenharmony_ci  unsigned int result;
193c87c5fbaSopenharmony_ci
194c87c5fbaSopenharmony_ci  result = coap_encode_var_safe8(buf, sizeof(buf), 0x0102030405060708);
195c87c5fbaSopenharmony_ci
196c87c5fbaSopenharmony_ci  CU_ASSERT(result == sizeof(data));
197c87c5fbaSopenharmony_ci
198c87c5fbaSopenharmony_ci  CU_ASSERT(memcmp(buf, data, result) == 0);
199c87c5fbaSopenharmony_ci}
200c87c5fbaSopenharmony_ci
201c87c5fbaSopenharmony_cistatic void
202c87c5fbaSopenharmony_cit_encode8(void) {
203c87c5fbaSopenharmony_ci  unsigned int result = 0;
204c87c5fbaSopenharmony_ci  /* This check will abort the program if configured with --enable-assert */
205c87c5fbaSopenharmony_ci#ifdef NDEBUG
206c87c5fbaSopenharmony_ci  uint8_t buf[16];
207c87c5fbaSopenharmony_ci  result = coap_encode_var_safe8(buf, 2, 0x0102030405060708);
208c87c5fbaSopenharmony_ci#endif /* NDEBUG */
209c87c5fbaSopenharmony_ci  CU_ASSERT(result == 0);
210c87c5fbaSopenharmony_ci}
211c87c5fbaSopenharmony_ci
212c87c5fbaSopenharmony_ci/************************************************************************
213c87c5fbaSopenharmony_ci ** initialization
214c87c5fbaSopenharmony_ci ************************************************************************/
215c87c5fbaSopenharmony_ci
216c87c5fbaSopenharmony_ciCU_pSuite
217c87c5fbaSopenharmony_cit_init_encode_tests(void) {
218c87c5fbaSopenharmony_ci  CU_pSuite suite[5];
219c87c5fbaSopenharmony_ci
220c87c5fbaSopenharmony_ci  suite[0] = CU_add_suite("byte value decoder", NULL, NULL);
221c87c5fbaSopenharmony_ci  if (!suite[0]) {                        /* signal error */
222c87c5fbaSopenharmony_ci    fprintf(stderr, "W: cannot add byte value decoder test suite (%s)\n",
223c87c5fbaSopenharmony_ci            CU_get_error_msg());
224c87c5fbaSopenharmony_ci
225c87c5fbaSopenharmony_ci    return NULL;
226c87c5fbaSopenharmony_ci  }
227c87c5fbaSopenharmony_ci
228c87c5fbaSopenharmony_ci#define DECODE_TEST(n,s)                                       \
229c87c5fbaSopenharmony_ci  if (!CU_add_test(suite[0], s, t_decode##n)) {                \
230c87c5fbaSopenharmony_ci    fprintf(stderr, "W: cannot add decoder test (%s)\n",       \
231c87c5fbaSopenharmony_ci            CU_get_error_msg());                               \
232c87c5fbaSopenharmony_ci  }
233c87c5fbaSopenharmony_ci
234c87c5fbaSopenharmony_ci  DECODE_TEST(1, "decode value #1");
235c87c5fbaSopenharmony_ci  DECODE_TEST(2, "decode value #2");
236c87c5fbaSopenharmony_ci  DECODE_TEST(3, "decode value #3");
237c87c5fbaSopenharmony_ci  DECODE_TEST(4, "decode value #4");
238c87c5fbaSopenharmony_ci  DECODE_TEST(5, "decode value #5");
239c87c5fbaSopenharmony_ci  DECODE_TEST(6, "decode value #6");
240c87c5fbaSopenharmony_ci  DECODE_TEST(7, "decode value #7");
241c87c5fbaSopenharmony_ci  DECODE_TEST(8, "decode value #8");
242c87c5fbaSopenharmony_ci
243c87c5fbaSopenharmony_ci  if ((suite[1] = CU_add_suite("byte value encoder", NULL, NULL))) {
244c87c5fbaSopenharmony_ci#define ENCODE_TEST(n,s)                                          \
245c87c5fbaSopenharmony_ci  if (!CU_add_test(suite[1], s, t_encode##n)) {                 \
246c87c5fbaSopenharmony_ci    fprintf(stderr, "W: cannot add encoder test (%s)\n",        \
247c87c5fbaSopenharmony_ci            CU_get_error_msg());                                \
248c87c5fbaSopenharmony_ci  }
249c87c5fbaSopenharmony_ci
250c87c5fbaSopenharmony_ci    ENCODE_TEST(1, "encode value #1");
251c87c5fbaSopenharmony_ci    ENCODE_TEST(2, "encode value #2");
252c87c5fbaSopenharmony_ci    ENCODE_TEST(3, "encode value #3");
253c87c5fbaSopenharmony_ci    ENCODE_TEST(4, "encode value #4");
254c87c5fbaSopenharmony_ci    ENCODE_TEST(5, "encode value #5");
255c87c5fbaSopenharmony_ci    ENCODE_TEST(6, "encode value #6");
256c87c5fbaSopenharmony_ci    ENCODE_TEST(7, "encode value #7");
257c87c5fbaSopenharmony_ci    ENCODE_TEST(8, "encode value #8");
258c87c5fbaSopenharmony_ci
259c87c5fbaSopenharmony_ci  } else {
260c87c5fbaSopenharmony_ci    fprintf(stderr, "W: cannot add byte value encoder test suite (%s)\n",
261c87c5fbaSopenharmony_ci            CU_get_error_msg());
262c87c5fbaSopenharmony_ci  }
263c87c5fbaSopenharmony_ci
264c87c5fbaSopenharmony_ci  return suite[0];
265c87c5fbaSopenharmony_ci}
266