xref: /freebsd/contrib/libcbor/test/cbor_serialize_test.c (revision abd872540f24cfc7dbd1ea29b6918c7082a22108)
110ff414cSEd Maste /*
210ff414cSEd Maste  * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
310ff414cSEd Maste  *
410ff414cSEd Maste  * libcbor is free software; you can redistribute it and/or modify
510ff414cSEd Maste  * it under the terms of the MIT license. See LICENSE for details.
610ff414cSEd Maste  */
710ff414cSEd Maste 
85d3e7166SEd Maste // cbor_serialize_alloc
95d3e7166SEd Maste #pragma clang diagnostic ignored "-Wdeprecated-declarations"
105d3e7166SEd Maste #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
115d3e7166SEd Maste 
125d3e7166SEd Maste #include <math.h>
1310ff414cSEd Maste #include <setjmp.h>
1410ff414cSEd Maste #include <stdarg.h>
1510ff414cSEd Maste #include <stddef.h>
165d3e7166SEd Maste #include <stdint.h>
175d3e7166SEd Maste #include <string.h>
1810ff414cSEd Maste 
1910ff414cSEd Maste #include <cmocka.h>
2010ff414cSEd Maste 
215d3e7166SEd Maste #include "assertions.h"
2210ff414cSEd Maste #include "cbor.h"
235d3e7166SEd Maste #include "test_allocator.h"
2410ff414cSEd Maste 
2510ff414cSEd Maste unsigned char buffer[512];
2610ff414cSEd Maste 
275d3e7166SEd Maste static void test_serialize_uint8_embed(void **_CBOR_UNUSED(_state)) {
2810ff414cSEd Maste   cbor_item_t *item = cbor_new_int8();
2910ff414cSEd Maste   cbor_set_uint8(item, 0);
305d3e7166SEd Maste   assert_size_equal(1, cbor_serialize(item, buffer, 512));
3110ff414cSEd Maste   assert_memory_equal(buffer, (unsigned char[]){0x00}, 1);
325d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
3310ff414cSEd Maste   cbor_decref(&item);
3410ff414cSEd Maste }
3510ff414cSEd Maste 
365d3e7166SEd Maste static void test_serialize_uint8(void **_CBOR_UNUSED(_state)) {
375d3e7166SEd Maste   cbor_item_t *item = cbor_new_int8();
385d3e7166SEd Maste   cbor_set_uint8(item, 42);
395d3e7166SEd Maste   assert_size_equal(2, cbor_serialize(item, buffer, 512));
405d3e7166SEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x18, 0x2a}), 2);
415d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
425d3e7166SEd Maste   cbor_decref(&item);
435d3e7166SEd Maste }
445d3e7166SEd Maste 
455d3e7166SEd Maste static void test_serialize_uint16(void **_CBOR_UNUSED(_state)) {
4610ff414cSEd Maste   cbor_item_t *item = cbor_new_int16();
4710ff414cSEd Maste   cbor_set_uint16(item, 1000);
485d3e7166SEd Maste   assert_size_equal(3, cbor_serialize(item, buffer, 512));
4910ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x19, 0x03, 0xE8}), 3);
505d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
5110ff414cSEd Maste   cbor_decref(&item);
5210ff414cSEd Maste }
5310ff414cSEd Maste 
545d3e7166SEd Maste static void test_serialize_uint32(void **_CBOR_UNUSED(_state)) {
5510ff414cSEd Maste   cbor_item_t *item = cbor_new_int32();
5610ff414cSEd Maste   cbor_set_uint32(item, 1000000);
575d3e7166SEd Maste   assert_size_equal(5, cbor_serialize(item, buffer, 512));
5810ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x1A, 0x00, 0x0F, 0x42, 0x40}),
5910ff414cSEd Maste                       5);
605d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 5);
6110ff414cSEd Maste   cbor_decref(&item);
6210ff414cSEd Maste }
6310ff414cSEd Maste 
645d3e7166SEd Maste static void test_serialize_uint64(void **_CBOR_UNUSED(_state)) {
6510ff414cSEd Maste   cbor_item_t *item = cbor_new_int64();
6610ff414cSEd Maste   cbor_set_uint64(item, 1000000000000);
675d3e7166SEd Maste   assert_size_equal(9, cbor_serialize(item, buffer, 512));
6810ff414cSEd Maste   assert_memory_equal(
6910ff414cSEd Maste       buffer,
7010ff414cSEd Maste       ((unsigned char[]){0x1B, 0x00, 0x00, 0x00, 0xE8, 0xD4, 0xA5, 0x10, 0x00}),
7110ff414cSEd Maste       9);
725d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 9);
7310ff414cSEd Maste   cbor_decref(&item);
7410ff414cSEd Maste }
7510ff414cSEd Maste 
765d3e7166SEd Maste static void test_serialize_negint8_embed(void **_CBOR_UNUSED(_state)) {
7710ff414cSEd Maste   cbor_item_t *item = cbor_new_int8();
7810ff414cSEd Maste   cbor_set_uint8(item, 0);
7910ff414cSEd Maste   cbor_mark_negint(item);
805d3e7166SEd Maste   assert_size_equal(1, cbor_serialize(item, buffer, 512));
8110ff414cSEd Maste   assert_memory_equal(buffer, (unsigned char[]){0x20}, 1);
825d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
8310ff414cSEd Maste   cbor_decref(&item);
8410ff414cSEd Maste }
8510ff414cSEd Maste 
865d3e7166SEd Maste static void test_serialize_negint8(void **_CBOR_UNUSED(_state)) {
875d3e7166SEd Maste   cbor_item_t *item = cbor_new_int8();
885d3e7166SEd Maste   cbor_set_uint8(item, 42);
895d3e7166SEd Maste   cbor_mark_negint(item);
905d3e7166SEd Maste   assert_size_equal(2, cbor_serialize(item, buffer, 512));
915d3e7166SEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x38, 0x2a}), 2);
925d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
935d3e7166SEd Maste   cbor_decref(&item);
945d3e7166SEd Maste }
955d3e7166SEd Maste 
965d3e7166SEd Maste static void test_serialize_negint16(void **_CBOR_UNUSED(_state)) {
9710ff414cSEd Maste   cbor_item_t *item = cbor_new_int16();
9810ff414cSEd Maste   cbor_set_uint16(item, 1000);
9910ff414cSEd Maste   cbor_mark_negint(item);
1005d3e7166SEd Maste   assert_size_equal(3, cbor_serialize(item, buffer, 512));
10110ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x39, 0x03, 0xE8}), 3);
1025d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
10310ff414cSEd Maste   cbor_decref(&item);
10410ff414cSEd Maste }
10510ff414cSEd Maste 
1065d3e7166SEd Maste static void test_serialize_negint32(void **_CBOR_UNUSED(_state)) {
10710ff414cSEd Maste   cbor_item_t *item = cbor_new_int32();
10810ff414cSEd Maste   cbor_set_uint32(item, 1000000);
10910ff414cSEd Maste   cbor_mark_negint(item);
1105d3e7166SEd Maste   assert_size_equal(5, cbor_serialize(item, buffer, 512));
11110ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x3A, 0x00, 0x0F, 0x42, 0x40}),
11210ff414cSEd Maste                       5);
1135d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 5);
11410ff414cSEd Maste   cbor_decref(&item);
11510ff414cSEd Maste }
11610ff414cSEd Maste 
1175d3e7166SEd Maste static void test_serialize_negint64(void **_CBOR_UNUSED(_state)) {
11810ff414cSEd Maste   cbor_item_t *item = cbor_new_int64();
11910ff414cSEd Maste   cbor_set_uint64(item, 1000000000000);
12010ff414cSEd Maste   cbor_mark_negint(item);
1215d3e7166SEd Maste   assert_size_equal(9, cbor_serialize(item, buffer, 512));
12210ff414cSEd Maste   assert_memory_equal(
12310ff414cSEd Maste       buffer,
12410ff414cSEd Maste       ((unsigned char[]){0x3B, 0x00, 0x00, 0x00, 0xE8, 0xD4, 0xA5, 0x10, 0x00}),
12510ff414cSEd Maste       9);
1265d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 9);
12710ff414cSEd Maste   cbor_decref(&item);
12810ff414cSEd Maste }
12910ff414cSEd Maste 
1305d3e7166SEd Maste static void test_serialize_definite_bytestring(void **_CBOR_UNUSED(_state)) {
13110ff414cSEd Maste   cbor_item_t *item = cbor_new_definite_bytestring();
13210ff414cSEd Maste   unsigned char *data = malloc(256);
13310ff414cSEd Maste   cbor_bytestring_set_handle(item, data, 256);
1345d3e7166SEd Maste   memset(data, 0, 256); /* Prevent undefined behavior in comparison */
1355d3e7166SEd Maste   assert_size_equal(256 + 3, cbor_serialize(item, buffer, 512));
13610ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x59, 0x01, 0x00}), 3);
13710ff414cSEd Maste   assert_memory_equal(buffer + 3, data, 256);
1385d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 259);
13910ff414cSEd Maste   cbor_decref(&item);
14010ff414cSEd Maste }
14110ff414cSEd Maste 
1425d3e7166SEd Maste static void test_serialize_indefinite_bytestring(void **_CBOR_UNUSED(_state)) {
14310ff414cSEd Maste   cbor_item_t *item = cbor_new_indefinite_bytestring();
14410ff414cSEd Maste 
14510ff414cSEd Maste   cbor_item_t *chunk = cbor_new_definite_bytestring();
14610ff414cSEd Maste   unsigned char *data = malloc(256);
1475d3e7166SEd Maste   memset(data, 0, 256); /* Prevent undefined behavior in comparison */
14810ff414cSEd Maste   cbor_bytestring_set_handle(chunk, data, 256);
14910ff414cSEd Maste 
1505d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(item, cbor_move(chunk)));
1515d3e7166SEd Maste   assert_size_equal(cbor_bytestring_chunk_count(item), 1);
15210ff414cSEd Maste 
1535d3e7166SEd Maste   assert_size_equal(1 + 3 + 256 + 1, cbor_serialize(item, buffer, 512));
15410ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x5F, 0x59, 0x01, 0x00}), 4);
15510ff414cSEd Maste   assert_memory_equal(buffer + 4, data, 256);
15610ff414cSEd Maste   assert_memory_equal(buffer + 4 + 256, ((unsigned char[]){0xFF}), 1);
1575d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 261);
15810ff414cSEd Maste   cbor_decref(&item);
15910ff414cSEd Maste }
16010ff414cSEd Maste 
1615d3e7166SEd Maste static void test_serialize_bytestring_size_overflow(
1625d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
1635d3e7166SEd Maste   cbor_item_t *item = cbor_new_definite_bytestring();
1645d3e7166SEd Maste 
1655d3e7166SEd Maste   // Fake having a huge chunk of data
1665d3e7166SEd Maste   unsigned char *data = malloc(1);
1675d3e7166SEd Maste   cbor_bytestring_set_handle(item, data, SIZE_MAX);
1685d3e7166SEd Maste 
1695d3e7166SEd Maste   // Would require 1 + 8 + SIZE_MAX bytes, which overflows size_t
1705d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 512), 0);
1715d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 0);
1725d3e7166SEd Maste   cbor_decref(&item);
1735d3e7166SEd Maste }
1745d3e7166SEd Maste 
1755d3e7166SEd Maste static void test_serialize_bytestring_no_space(void **_CBOR_UNUSED(_state)) {
1765d3e7166SEd Maste   cbor_item_t *item = cbor_new_definite_bytestring();
1775d3e7166SEd Maste   unsigned char *data = malloc(12);
1785d3e7166SEd Maste   cbor_bytestring_set_handle(item, data, 12);
1795d3e7166SEd Maste 
1805d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 1), 0);
1815d3e7166SEd Maste 
1825d3e7166SEd Maste   cbor_decref(&item);
1835d3e7166SEd Maste }
1845d3e7166SEd Maste 
1855d3e7166SEd Maste static void test_serialize_indefinite_bytestring_no_space(
1865d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
1875d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_bytestring();
1885d3e7166SEd Maste   cbor_item_t *chunk = cbor_new_definite_bytestring();
1895d3e7166SEd Maste   unsigned char *data = malloc(256);
1905d3e7166SEd Maste   cbor_bytestring_set_handle(chunk, data, 256);
1915d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(item, cbor_move(chunk)));
1925d3e7166SEd Maste 
1935d3e7166SEd Maste   // Not enough space for the leading byte
1945d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 0), 0);
1955d3e7166SEd Maste 
1965d3e7166SEd Maste   // Not enough space for the chunk
1975d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 30), 0);
1985d3e7166SEd Maste 
1995d3e7166SEd Maste   // Not enough space for the indef break
2005d3e7166SEd Maste   assert_size_equal(
2015d3e7166SEd Maste       cbor_serialize(item, buffer, 1 + cbor_serialized_size(chunk)), 0);
2025d3e7166SEd Maste 
2035d3e7166SEd Maste   cbor_decref(&item);
2045d3e7166SEd Maste }
2055d3e7166SEd Maste 
2065d3e7166SEd Maste static void test_serialize_definite_string(void **_CBOR_UNUSED(_state)) {
20710ff414cSEd Maste   cbor_item_t *item = cbor_new_definite_string();
20810ff414cSEd Maste   unsigned char *data = malloc(12);
20910ff414cSEd Maste   strncpy((char *)data, "Hello world!", 12);
21010ff414cSEd Maste   cbor_string_set_handle(item, data, 12);
2115d3e7166SEd Maste   assert_size_equal(1 + 12, cbor_serialize(item, buffer, 512));
21210ff414cSEd Maste   assert_memory_equal(
21310ff414cSEd Maste       buffer,
21410ff414cSEd Maste       ((unsigned char[]){0x6C, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F,
21510ff414cSEd Maste                          0x72, 0x6C, 0x64, 0x21}),
21610ff414cSEd Maste       13);
2175d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 13);
21810ff414cSEd Maste   cbor_decref(&item);
21910ff414cSEd Maste }
22010ff414cSEd Maste 
221*abd87254SEd Maste static void test_serialize_definite_string_4b_header(
222*abd87254SEd Maste     void **_CBOR_UNUSED(_state)) {
223*abd87254SEd Maste #if SIZE_MAX > UINT16_MAX
224*abd87254SEd Maste   cbor_item_t *item = cbor_new_definite_string();
225*abd87254SEd Maste   const size_t size = (size_t)UINT16_MAX + 1;
226*abd87254SEd Maste   unsigned char *data = malloc(size);
227*abd87254SEd Maste   memset(data, 0, size);
228*abd87254SEd Maste   cbor_string_set_handle(item, data, size);
229*abd87254SEd Maste   assert_size_equal(cbor_serialized_size(item), 1 + 4 + size);
230*abd87254SEd Maste   cbor_decref(&item);
231*abd87254SEd Maste #endif
232*abd87254SEd Maste }
233*abd87254SEd Maste 
234*abd87254SEd Maste static void test_serialize_definite_string_8b_header(
235*abd87254SEd Maste     void **_CBOR_UNUSED(_state)) {
236*abd87254SEd Maste #if SIZE_MAX > UINT32_MAX
237*abd87254SEd Maste   cbor_item_t *item = cbor_new_definite_string();
238*abd87254SEd Maste   const size_t size = (size_t)UINT32_MAX + 1;
239*abd87254SEd Maste   unsigned char *data = malloc(1);
240*abd87254SEd Maste   data[0] = '\0';
241*abd87254SEd Maste   cbor_string_set_handle(item, data, 1);
242*abd87254SEd Maste   // Pretend that we have a big item to avoid the huge malloc
243*abd87254SEd Maste   item->metadata.string_metadata.length = size;
244*abd87254SEd Maste   assert_size_equal(cbor_serialized_size(item), 1 + 8 + size);
245*abd87254SEd Maste   cbor_decref(&item);
246*abd87254SEd Maste #endif
247*abd87254SEd Maste }
248*abd87254SEd Maste 
2495d3e7166SEd Maste static void test_serialize_indefinite_string(void **_CBOR_UNUSED(_state)) {
25010ff414cSEd Maste   cbor_item_t *item = cbor_new_indefinite_string();
25110ff414cSEd Maste   cbor_item_t *chunk = cbor_new_definite_string();
25210ff414cSEd Maste 
25310ff414cSEd Maste   unsigned char *data = malloc(12);
25410ff414cSEd Maste   strncpy((char *)data, "Hello world!", 12);
25510ff414cSEd Maste   cbor_string_set_handle(chunk, data, 12);
25610ff414cSEd Maste 
25710ff414cSEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(chunk)));
2585d3e7166SEd Maste   assert_size_equal(cbor_string_chunk_count(item), 1);
25910ff414cSEd Maste 
2605d3e7166SEd Maste   assert_size_equal(15, cbor_serialize(item, buffer, 512));
26110ff414cSEd Maste   assert_memory_equal(
26210ff414cSEd Maste       buffer,
26310ff414cSEd Maste       ((unsigned char[]){0x7F, 0x6C, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77,
26410ff414cSEd Maste                          0x6F, 0x72, 0x6C, 0x64, 0x21, 0xFF}),
26510ff414cSEd Maste       15);
2665d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 15);
26710ff414cSEd Maste   cbor_decref(&item);
26810ff414cSEd Maste }
26910ff414cSEd Maste 
2705d3e7166SEd Maste static void test_serialize_string_no_space(void **_CBOR_UNUSED(_state)) {
2715d3e7166SEd Maste   cbor_item_t *item = cbor_new_definite_string();
2725d3e7166SEd Maste   unsigned char *data = malloc(12);
273*abd87254SEd Maste   memset(data, 0, 12);
2745d3e7166SEd Maste   cbor_string_set_handle(item, data, 12);
2755d3e7166SEd Maste 
2765d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 1), 0);
2775d3e7166SEd Maste 
2785d3e7166SEd Maste   cbor_decref(&item);
2795d3e7166SEd Maste }
2805d3e7166SEd Maste 
2815d3e7166SEd Maste static void test_serialize_indefinite_string_no_space(
2825d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
2835d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_string();
2845d3e7166SEd Maste   cbor_item_t *chunk = cbor_new_definite_string();
2855d3e7166SEd Maste   unsigned char *data = malloc(256);
286*abd87254SEd Maste   memset(data, 0, 256);
2875d3e7166SEd Maste   cbor_string_set_handle(chunk, data, 256);
2885d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(chunk)));
2895d3e7166SEd Maste 
2905d3e7166SEd Maste   // Not enough space for the leading byte
2915d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 0), 0);
2925d3e7166SEd Maste 
2935d3e7166SEd Maste   // Not enough space for the chunk
2945d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 30), 0);
2955d3e7166SEd Maste 
2965d3e7166SEd Maste   // Not enough space for the indef break
2975d3e7166SEd Maste   assert_size_equal(
2985d3e7166SEd Maste       cbor_serialize(item, buffer, 1 + cbor_serialized_size(chunk)), 0);
2995d3e7166SEd Maste 
3005d3e7166SEd Maste   cbor_decref(&item);
3015d3e7166SEd Maste }
3025d3e7166SEd Maste 
3035d3e7166SEd Maste static void test_serialize_definite_array(void **_CBOR_UNUSED(_state)) {
30410ff414cSEd Maste   cbor_item_t *item = cbor_new_definite_array(2);
30510ff414cSEd Maste   cbor_item_t *one = cbor_build_uint8(1);
30610ff414cSEd Maste   cbor_item_t *two = cbor_build_uint8(2);
30710ff414cSEd Maste 
3085d3e7166SEd Maste   assert_true(cbor_array_push(item, one));
3095d3e7166SEd Maste   assert_true(cbor_array_set(item, 1, two));
3105d3e7166SEd Maste   assert_true(cbor_array_replace(item, 0, one));
31110ff414cSEd Maste 
3125d3e7166SEd Maste   assert_size_equal(3, cbor_serialize(item, buffer, 512));
31310ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x82, 0x01, 0x02}), 3);
3145d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
31510ff414cSEd Maste   cbor_decref(&item);
31610ff414cSEd Maste   cbor_decref(&one);
31710ff414cSEd Maste   cbor_decref(&two);
31810ff414cSEd Maste }
31910ff414cSEd Maste 
3205d3e7166SEd Maste static void test_serialize_array_no_space(void **_CBOR_UNUSED(_state)) {
3215d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_array();
3225d3e7166SEd Maste   cbor_item_t *one = cbor_build_uint8(1);
3235d3e7166SEd Maste   assert_true(cbor_array_push(item, one));
3245d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
3255d3e7166SEd Maste 
3265d3e7166SEd Maste   // Not enough space for the leading byte
3275d3e7166SEd Maste   assert_size_equal(0, cbor_serialize(item, buffer, 0));
3285d3e7166SEd Maste 
3295d3e7166SEd Maste   // Not enough space for the item
3305d3e7166SEd Maste   assert_size_equal(0, cbor_serialize(item, buffer, 1));
3315d3e7166SEd Maste 
3325d3e7166SEd Maste   // Not enough space for the indef break
3335d3e7166SEd Maste   assert_size_equal(0, cbor_serialize(item, buffer, 2));
3345d3e7166SEd Maste 
3355d3e7166SEd Maste   cbor_decref(&item);
3365d3e7166SEd Maste   cbor_decref(&one);
3375d3e7166SEd Maste }
3385d3e7166SEd Maste 
3395d3e7166SEd Maste static void test_serialize_indefinite_array(void **_CBOR_UNUSED(_state)) {
34010ff414cSEd Maste   cbor_item_t *item = cbor_new_indefinite_array();
34110ff414cSEd Maste   cbor_item_t *one = cbor_build_uint8(1);
34210ff414cSEd Maste   cbor_item_t *two = cbor_build_uint8(2);
34310ff414cSEd Maste 
3445d3e7166SEd Maste   assert_true(cbor_array_push(item, one));
3455d3e7166SEd Maste   assert_true(cbor_array_push(item, two));
34610ff414cSEd Maste 
3475d3e7166SEd Maste   assert_size_equal(4, cbor_serialize(item, buffer, 512));
34810ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0x9F, 0x01, 0x02, 0xFF}), 4);
3495d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 4);
35010ff414cSEd Maste   cbor_decref(&item);
35110ff414cSEd Maste   cbor_decref(&one);
35210ff414cSEd Maste   cbor_decref(&two);
35310ff414cSEd Maste }
35410ff414cSEd Maste 
3555d3e7166SEd Maste static void test_serialize_definite_map(void **_CBOR_UNUSED(_state)) {
35610ff414cSEd Maste   cbor_item_t *item = cbor_new_definite_map(2);
35710ff414cSEd Maste   cbor_item_t *one = cbor_build_uint8(1);
35810ff414cSEd Maste   cbor_item_t *two = cbor_build_uint8(2);
35910ff414cSEd Maste 
36010ff414cSEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){.key = one, .value = two}));
36110ff414cSEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){.key = two, .value = one}));
36210ff414cSEd Maste 
3635d3e7166SEd Maste   assert_size_equal(5, cbor_serialize(item, buffer, 512));
3645d3e7166SEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0xA2, 0x01, 0x02, 0x02, 0x01}),
3655d3e7166SEd Maste                       5);
3665d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 5);
36710ff414cSEd Maste   cbor_decref(&item);
36810ff414cSEd Maste   cbor_decref(&one);
36910ff414cSEd Maste   cbor_decref(&two);
37010ff414cSEd Maste }
37110ff414cSEd Maste 
3725d3e7166SEd Maste static void test_serialize_indefinite_map(void **_CBOR_UNUSED(_state)) {
3735d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_map();
3745d3e7166SEd Maste   cbor_item_t *one = cbor_build_uint8(1);
3755d3e7166SEd Maste   cbor_item_t *two = cbor_build_uint8(2);
3765d3e7166SEd Maste 
3775d3e7166SEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){.key = one, .value = two}));
3785d3e7166SEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){.key = two, .value = one}));
3795d3e7166SEd Maste 
3805d3e7166SEd Maste   assert_size_equal(6, cbor_serialize(item, buffer, 512));
3815d3e7166SEd Maste   assert_memory_equal(
3825d3e7166SEd Maste       buffer, ((unsigned char[]){0xBF, 0x01, 0x02, 0x02, 0x01, 0xFF}), 6);
3835d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 6);
3845d3e7166SEd Maste   cbor_decref(&item);
3855d3e7166SEd Maste   cbor_decref(&one);
3865d3e7166SEd Maste   cbor_decref(&two);
3875d3e7166SEd Maste }
3885d3e7166SEd Maste 
3895d3e7166SEd Maste static void test_serialize_map_no_space(void **_CBOR_UNUSED(_state)) {
3905d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_map();
3915d3e7166SEd Maste   cbor_item_t *one = cbor_build_uint8(1);
3925d3e7166SEd Maste   cbor_item_t *two = cbor_build_uint8(2);
3935d3e7166SEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){.key = one, .value = two}));
3945d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 4);
3955d3e7166SEd Maste 
3965d3e7166SEd Maste   // Not enough space for the leading byte
3975d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 0), 0);
3985d3e7166SEd Maste 
3995d3e7166SEd Maste   // Not enough space for the key
4005d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 1), 0);
4015d3e7166SEd Maste 
4025d3e7166SEd Maste   // Not enough space for the value
4035d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 2), 0);
4045d3e7166SEd Maste 
4055d3e7166SEd Maste   // Not enough space for the indef break
4065d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 3), 0);
4075d3e7166SEd Maste 
4085d3e7166SEd Maste   cbor_decref(&item);
4095d3e7166SEd Maste   cbor_decref(&one);
4105d3e7166SEd Maste   cbor_decref(&two);
4115d3e7166SEd Maste }
4125d3e7166SEd Maste 
4135d3e7166SEd Maste static void test_serialize_tags(void **_CBOR_UNUSED(_state)) {
41410ff414cSEd Maste   cbor_item_t *item = cbor_new_tag(21);
41510ff414cSEd Maste   cbor_item_t *one = cbor_build_uint8(1);
41610ff414cSEd Maste   cbor_tag_set_item(item, one);
41710ff414cSEd Maste 
4185d3e7166SEd Maste   assert_size_equal(2, cbor_serialize(item, buffer, 512));
41910ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0xD5, 0x01}), 2);
4205d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
42110ff414cSEd Maste   cbor_decref(&item);
42210ff414cSEd Maste   cbor_decref(&one);
42310ff414cSEd Maste }
42410ff414cSEd Maste 
4255d3e7166SEd Maste static void test_serialize_tags_no_space(void **_CBOR_UNUSED(_state)) {
4265d3e7166SEd Maste   cbor_item_t *item = cbor_new_tag(21);
4275d3e7166SEd Maste   cbor_item_t *one = cbor_build_uint8(1);
4285d3e7166SEd Maste   cbor_tag_set_item(item, one);
4295d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
4305d3e7166SEd Maste 
4315d3e7166SEd Maste   // Not enough space for the leading byte
4325d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 0), 0);
4335d3e7166SEd Maste 
4345d3e7166SEd Maste   // Not enough space for the item
4355d3e7166SEd Maste   assert_size_equal(cbor_serialize(item, buffer, 1), 0);
4365d3e7166SEd Maste 
4375d3e7166SEd Maste   cbor_decref(&item);
4385d3e7166SEd Maste   cbor_decref(&one);
4395d3e7166SEd Maste }
4405d3e7166SEd Maste 
4415d3e7166SEd Maste static void test_serialize_half(void **_CBOR_UNUSED(_state)) {
44210ff414cSEd Maste   cbor_item_t *item = cbor_new_float2();
44310ff414cSEd Maste   cbor_set_float2(item, NAN);
44410ff414cSEd Maste 
4455d3e7166SEd Maste   assert_size_equal(3, cbor_serialize(item, buffer, 512));
44610ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7E, 0x00}), 3);
4475d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
44810ff414cSEd Maste   cbor_decref(&item);
44910ff414cSEd Maste }
45010ff414cSEd Maste 
4515d3e7166SEd Maste static void test_serialize_single(void **_CBOR_UNUSED(_state)) {
45210ff414cSEd Maste   cbor_item_t *item = cbor_new_float4();
45310ff414cSEd Maste   cbor_set_float4(item, 100000.0f);
45410ff414cSEd Maste 
4555d3e7166SEd Maste   assert_size_equal(5, cbor_serialize(item, buffer, 512));
45610ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0x47, 0xC3, 0x50, 0x00}),
45710ff414cSEd Maste                       5);
4585d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 5);
45910ff414cSEd Maste   cbor_decref(&item);
46010ff414cSEd Maste }
46110ff414cSEd Maste 
4625d3e7166SEd Maste static void test_serialize_double(void **_CBOR_UNUSED(_state)) {
46310ff414cSEd Maste   cbor_item_t *item = cbor_new_float8();
46410ff414cSEd Maste   cbor_set_float8(item, -4.1);
46510ff414cSEd Maste 
4665d3e7166SEd Maste   assert_size_equal(9, cbor_serialize(item, buffer, 512));
46710ff414cSEd Maste   assert_memory_equal(
46810ff414cSEd Maste       buffer,
46910ff414cSEd Maste       ((unsigned char[]){0xFB, 0xC0, 0x10, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}),
47010ff414cSEd Maste       9);
4715d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 9);
47210ff414cSEd Maste   cbor_decref(&item);
47310ff414cSEd Maste }
47410ff414cSEd Maste 
4755d3e7166SEd Maste static void test_serialize_ctrl(void **_CBOR_UNUSED(_state)) {
47610ff414cSEd Maste   cbor_item_t *item = cbor_new_undef();
47710ff414cSEd Maste 
4785d3e7166SEd Maste   assert_size_equal(1, cbor_serialize(item, buffer, 512));
47910ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0xF7}), 1);
4805d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
48110ff414cSEd Maste   cbor_decref(&item);
48210ff414cSEd Maste }
48310ff414cSEd Maste 
4845d3e7166SEd Maste static void test_serialize_long_ctrl(void **_CBOR_UNUSED(_state)) {
48510ff414cSEd Maste   cbor_item_t *item = cbor_new_ctrl();
48610ff414cSEd Maste   cbor_set_ctrl(item, 254);
48710ff414cSEd Maste 
4885d3e7166SEd Maste   assert_size_equal(2, cbor_serialize(item, buffer, 512));
48910ff414cSEd Maste   assert_memory_equal(buffer, ((unsigned char[]){0xF8, 0xFE}), 2);
4905d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
49110ff414cSEd Maste   cbor_decref(&item);
49210ff414cSEd Maste }
49310ff414cSEd Maste 
4945d3e7166SEd Maste static void test_auto_serialize(void **_CBOR_UNUSED(_state)) {
49510ff414cSEd Maste   cbor_item_t *item = cbor_new_definite_array(4);
4965d3e7166SEd Maste   for (size_t i = 0; i < 4; i++) {
4975d3e7166SEd Maste     assert_true(cbor_array_push(item, cbor_move(cbor_build_uint64(0))));
4985d3e7166SEd Maste   }
49910ff414cSEd Maste 
5005d3e7166SEd Maste   unsigned char *output;
5015d3e7166SEd Maste   size_t output_size;
5025d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, &output_size), 37);
5035d3e7166SEd Maste   assert_size_equal(output_size, 37);
5045d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 37);
5055d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x84, 0x1B}), 2);
50610ff414cSEd Maste   cbor_decref(&item);
5075d3e7166SEd Maste   _cbor_free(output);
5085d3e7166SEd Maste }
5095d3e7166SEd Maste 
5105d3e7166SEd Maste static void test_auto_serialize_no_size(void **_CBOR_UNUSED(_state)) {
5115d3e7166SEd Maste   cbor_item_t *item = cbor_build_uint8(1);
5125d3e7166SEd Maste 
5135d3e7166SEd Maste   unsigned char *output;
5145d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);
5155d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x01}), 1);
5165d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
5175d3e7166SEd Maste   cbor_decref(&item);
5185d3e7166SEd Maste   _cbor_free(output);
5195d3e7166SEd Maste }
5205d3e7166SEd Maste 
5215d3e7166SEd Maste static void test_auto_serialize_too_large(void **_CBOR_UNUSED(_state)) {
5225d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_string();
5235d3e7166SEd Maste   cbor_item_t *chunk = cbor_new_definite_string();
5245d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, chunk));
5255d3e7166SEd Maste 
5265d3e7166SEd Maste   // Pretend the chunk is huge
5275d3e7166SEd Maste   chunk->metadata.string_metadata.length = SIZE_MAX;
5285d3e7166SEd Maste   assert_true(SIZE_MAX + 2 == 1);
5295d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 0);
5305d3e7166SEd Maste   unsigned char *output;
5315d3e7166SEd Maste   size_t output_size;
5325d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, &output_size), 0);
5335d3e7166SEd Maste   assert_size_equal(output_size, 0);
5345d3e7166SEd Maste   assert_null(output);
5355d3e7166SEd Maste 
5365d3e7166SEd Maste   chunk->metadata.string_metadata.length = 0;
5375d3e7166SEd Maste   cbor_decref(&chunk);
5385d3e7166SEd Maste   cbor_decref(&item);
5395d3e7166SEd Maste }
5405d3e7166SEd Maste 
5415d3e7166SEd Maste static void test_auto_serialize_alloc_fail(void **_CBOR_UNUSED(_state)) {
5425d3e7166SEd Maste   cbor_item_t *item = cbor_build_uint8(42);
5435d3e7166SEd Maste 
5445d3e7166SEd Maste   WITH_FAILING_MALLOC({
5455d3e7166SEd Maste     unsigned char *output;
5465d3e7166SEd Maste     size_t output_size;
5475d3e7166SEd Maste     assert_size_equal(cbor_serialize_alloc(item, &output, &output_size), 0);
5485d3e7166SEd Maste     assert_size_equal(output_size, 0);
5495d3e7166SEd Maste     assert_null(output);
5505d3e7166SEd Maste   });
5515d3e7166SEd Maste 
5525d3e7166SEd Maste   cbor_decref(&item);
5535d3e7166SEd Maste }
5545d3e7166SEd Maste 
5555d3e7166SEd Maste static void test_auto_serialize_zero_len_bytestring(
5565d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
5575d3e7166SEd Maste   cbor_item_t *item = cbor_build_bytestring((cbor_data) "", 0);
5585d3e7166SEd Maste 
5595d3e7166SEd Maste   unsigned char *output;
5605d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);
5615d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x40}), 1);
5625d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
5635d3e7166SEd Maste   cbor_decref(&item);
5645d3e7166SEd Maste   _cbor_free(output);
5655d3e7166SEd Maste }
5665d3e7166SEd Maste 
5675d3e7166SEd Maste static void test_auto_serialize_zero_len_string(void **_CBOR_UNUSED(_state)) {
5685d3e7166SEd Maste   cbor_item_t *item = cbor_build_string("");
5695d3e7166SEd Maste 
5705d3e7166SEd Maste   unsigned char *output;
5715d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);
5725d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x60}), 1);
5735d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
5745d3e7166SEd Maste   cbor_decref(&item);
5755d3e7166SEd Maste   _cbor_free(output);
5765d3e7166SEd Maste }
5775d3e7166SEd Maste 
5785d3e7166SEd Maste static void test_auto_serialize_zero_len_bytestring_chunk(
5795d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
5805d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_bytestring();
5815d3e7166SEd Maste 
5825d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
5835d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "", 0))));
5845d3e7166SEd Maste 
5855d3e7166SEd Maste   unsigned char *output;
5865d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 3);
5875d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x5f, 0x40, 0xff}), 3);
5885d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
5895d3e7166SEd Maste   cbor_decref(&item);
5905d3e7166SEd Maste   _cbor_free(output);
5915d3e7166SEd Maste }
5925d3e7166SEd Maste 
5935d3e7166SEd Maste static void test_auto_serialize_zero_len_string_chunk(
5945d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
5955d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_string();
5965d3e7166SEd Maste 
5975d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string(""))));
5985d3e7166SEd Maste 
5995d3e7166SEd Maste   unsigned char *output;
6005d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 3);
6015d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x7f, 0x60, 0xff}), 3);
6025d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 3);
6035d3e7166SEd Maste   cbor_decref(&item);
6045d3e7166SEd Maste   _cbor_free(output);
6055d3e7166SEd Maste }
6065d3e7166SEd Maste 
6075d3e7166SEd Maste static void test_auto_serialize_zero_len_array(void **_CBOR_UNUSED(_state)) {
6085d3e7166SEd Maste   cbor_item_t *item = cbor_new_definite_array(0);
6095d3e7166SEd Maste 
6105d3e7166SEd Maste   unsigned char *output;
6115d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);
6125d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x80}), 1);
6135d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
6145d3e7166SEd Maste   cbor_decref(&item);
6155d3e7166SEd Maste   _cbor_free(output);
6165d3e7166SEd Maste }
6175d3e7166SEd Maste 
6185d3e7166SEd Maste static void test_auto_serialize_zero_len_indef_array(
6195d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
6205d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_array();
6215d3e7166SEd Maste 
6225d3e7166SEd Maste   unsigned char *output;
6235d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 2);
6245d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0x9f, 0xff}), 2);
6255d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
6265d3e7166SEd Maste   cbor_decref(&item);
6275d3e7166SEd Maste   _cbor_free(output);
6285d3e7166SEd Maste }
6295d3e7166SEd Maste 
6305d3e7166SEd Maste static void test_auto_serialize_zero_len_map(void **_CBOR_UNUSED(_state)) {
6315d3e7166SEd Maste   cbor_item_t *item = cbor_new_definite_map(0);
6325d3e7166SEd Maste 
6335d3e7166SEd Maste   unsigned char *output;
6345d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);
6355d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0xa0}), 1);
6365d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 1);
6375d3e7166SEd Maste   cbor_decref(&item);
6385d3e7166SEd Maste   _cbor_free(output);
6395d3e7166SEd Maste }
6405d3e7166SEd Maste 
6415d3e7166SEd Maste static void test_auto_serialize_zero_len_indef_map(
6425d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
6435d3e7166SEd Maste   cbor_item_t *item = cbor_new_indefinite_map();
6445d3e7166SEd Maste 
6455d3e7166SEd Maste   unsigned char *output;
6465d3e7166SEd Maste   assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 2);
6475d3e7166SEd Maste   assert_memory_equal(output, ((unsigned char[]){0xbf, 0xff}), 2);
6485d3e7166SEd Maste   assert_size_equal(cbor_serialized_size(item), 2);
6495d3e7166SEd Maste   cbor_decref(&item);
6505d3e7166SEd Maste   _cbor_free(output);
65110ff414cSEd Maste }
65210ff414cSEd Maste 
65310ff414cSEd Maste int main(void) {
65410ff414cSEd Maste   const struct CMUnitTest tests[] = {
6555d3e7166SEd Maste       cmocka_unit_test(test_serialize_uint8_embed),
65610ff414cSEd Maste       cmocka_unit_test(test_serialize_uint8),
65710ff414cSEd Maste       cmocka_unit_test(test_serialize_uint16),
65810ff414cSEd Maste       cmocka_unit_test(test_serialize_uint32),
65910ff414cSEd Maste       cmocka_unit_test(test_serialize_uint64),
6605d3e7166SEd Maste       cmocka_unit_test(test_serialize_negint8_embed),
66110ff414cSEd Maste       cmocka_unit_test(test_serialize_negint8),
66210ff414cSEd Maste       cmocka_unit_test(test_serialize_negint16),
66310ff414cSEd Maste       cmocka_unit_test(test_serialize_negint32),
66410ff414cSEd Maste       cmocka_unit_test(test_serialize_negint64),
66510ff414cSEd Maste       cmocka_unit_test(test_serialize_definite_bytestring),
66610ff414cSEd Maste       cmocka_unit_test(test_serialize_indefinite_bytestring),
6675d3e7166SEd Maste       cmocka_unit_test(test_serialize_bytestring_size_overflow),
6685d3e7166SEd Maste       cmocka_unit_test(test_serialize_bytestring_no_space),
6695d3e7166SEd Maste       cmocka_unit_test(test_serialize_indefinite_bytestring_no_space),
67010ff414cSEd Maste       cmocka_unit_test(test_serialize_definite_string),
671*abd87254SEd Maste       cmocka_unit_test(test_serialize_definite_string_4b_header),
672*abd87254SEd Maste       cmocka_unit_test(test_serialize_definite_string_8b_header),
67310ff414cSEd Maste       cmocka_unit_test(test_serialize_indefinite_string),
6745d3e7166SEd Maste       cmocka_unit_test(test_serialize_string_no_space),
6755d3e7166SEd Maste       cmocka_unit_test(test_serialize_indefinite_string_no_space),
67610ff414cSEd Maste       cmocka_unit_test(test_serialize_definite_array),
67710ff414cSEd Maste       cmocka_unit_test(test_serialize_indefinite_array),
6785d3e7166SEd Maste       cmocka_unit_test(test_serialize_array_no_space),
67910ff414cSEd Maste       cmocka_unit_test(test_serialize_definite_map),
68010ff414cSEd Maste       cmocka_unit_test(test_serialize_indefinite_map),
6815d3e7166SEd Maste       cmocka_unit_test(test_serialize_map_no_space),
68210ff414cSEd Maste       cmocka_unit_test(test_serialize_tags),
6835d3e7166SEd Maste       cmocka_unit_test(test_serialize_tags_no_space),
68410ff414cSEd Maste       cmocka_unit_test(test_serialize_half),
68510ff414cSEd Maste       cmocka_unit_test(test_serialize_single),
68610ff414cSEd Maste       cmocka_unit_test(test_serialize_double),
68710ff414cSEd Maste       cmocka_unit_test(test_serialize_ctrl),
68810ff414cSEd Maste       cmocka_unit_test(test_serialize_long_ctrl),
6895d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize),
6905d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_no_size),
6915d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_too_large),
6925d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_alloc_fail),
6935d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_bytestring),
6945d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_string),
6955d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_bytestring_chunk),
6965d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_string_chunk),
6975d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_array),
6985d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_indef_array),
6995d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_map),
7005d3e7166SEd Maste       cmocka_unit_test(test_auto_serialize_zero_len_indef_map),
7015d3e7166SEd Maste   };
70210ff414cSEd Maste   return cmocka_run_group_tests(tests, NULL, NULL);
70310ff414cSEd Maste }
704