Path: blob/main/contrib/libcbor/test/cbor_serialize_test.c
39536 views
/*1* Copyright (c) 2014-2020 Pavel Kalvoda <[email protected]>2*3* libcbor is free software; you can redistribute it and/or modify4* it under the terms of the MIT license. See LICENSE for details.5*/67// cbor_serialize_alloc8#pragma clang diagnostic ignored "-Wdeprecated-declarations"9#pragma GCC diagnostic ignored "-Wdeprecated-declarations"1011#include <math.h>12#include <setjmp.h>13#include <stdarg.h>14#include <stddef.h>15#include <stdint.h>16#include <string.h>1718#include <cmocka.h>1920#include "assertions.h"21#include "cbor.h"22#include "test_allocator.h"2324unsigned char buffer[512];2526static void test_serialize_uint8_embed(void **_CBOR_UNUSED(_state)) {27cbor_item_t *item = cbor_new_int8();28cbor_set_uint8(item, 0);29assert_size_equal(1, cbor_serialize(item, buffer, 512));30assert_memory_equal(buffer, (unsigned char[]){0x00}, 1);31assert_size_equal(cbor_serialized_size(item), 1);32cbor_decref(&item);33}3435static void test_serialize_uint8(void **_CBOR_UNUSED(_state)) {36cbor_item_t *item = cbor_new_int8();37cbor_set_uint8(item, 42);38assert_size_equal(2, cbor_serialize(item, buffer, 512));39assert_memory_equal(buffer, ((unsigned char[]){0x18, 0x2a}), 2);40assert_size_equal(cbor_serialized_size(item), 2);41cbor_decref(&item);42}4344static void test_serialize_uint16(void **_CBOR_UNUSED(_state)) {45cbor_item_t *item = cbor_new_int16();46cbor_set_uint16(item, 1000);47assert_size_equal(3, cbor_serialize(item, buffer, 512));48assert_memory_equal(buffer, ((unsigned char[]){0x19, 0x03, 0xE8}), 3);49assert_size_equal(cbor_serialized_size(item), 3);50cbor_decref(&item);51}5253static void test_serialize_uint32(void **_CBOR_UNUSED(_state)) {54cbor_item_t *item = cbor_new_int32();55cbor_set_uint32(item, 1000000);56assert_size_equal(5, cbor_serialize(item, buffer, 512));57assert_memory_equal(buffer, ((unsigned char[]){0x1A, 0x00, 0x0F, 0x42, 0x40}),585);59assert_size_equal(cbor_serialized_size(item), 5);60cbor_decref(&item);61}6263static void test_serialize_uint64(void **_CBOR_UNUSED(_state)) {64cbor_item_t *item = cbor_new_int64();65cbor_set_uint64(item, 1000000000000);66assert_size_equal(9, cbor_serialize(item, buffer, 512));67assert_memory_equal(68buffer,69((unsigned char[]){0x1B, 0x00, 0x00, 0x00, 0xE8, 0xD4, 0xA5, 0x10, 0x00}),709);71assert_size_equal(cbor_serialized_size(item), 9);72cbor_decref(&item);73}7475static void test_serialize_negint8_embed(void **_CBOR_UNUSED(_state)) {76cbor_item_t *item = cbor_new_int8();77cbor_set_uint8(item, 0);78cbor_mark_negint(item);79assert_size_equal(1, cbor_serialize(item, buffer, 512));80assert_memory_equal(buffer, (unsigned char[]){0x20}, 1);81assert_size_equal(cbor_serialized_size(item), 1);82cbor_decref(&item);83}8485static void test_serialize_negint8(void **_CBOR_UNUSED(_state)) {86cbor_item_t *item = cbor_new_int8();87cbor_set_uint8(item, 42);88cbor_mark_negint(item);89assert_size_equal(2, cbor_serialize(item, buffer, 512));90assert_memory_equal(buffer, ((unsigned char[]){0x38, 0x2a}), 2);91assert_size_equal(cbor_serialized_size(item), 2);92cbor_decref(&item);93}9495static void test_serialize_negint16(void **_CBOR_UNUSED(_state)) {96cbor_item_t *item = cbor_new_int16();97cbor_set_uint16(item, 1000);98cbor_mark_negint(item);99assert_size_equal(3, cbor_serialize(item, buffer, 512));100assert_memory_equal(buffer, ((unsigned char[]){0x39, 0x03, 0xE8}), 3);101assert_size_equal(cbor_serialized_size(item), 3);102cbor_decref(&item);103}104105static void test_serialize_negint32(void **_CBOR_UNUSED(_state)) {106cbor_item_t *item = cbor_new_int32();107cbor_set_uint32(item, 1000000);108cbor_mark_negint(item);109assert_size_equal(5, cbor_serialize(item, buffer, 512));110assert_memory_equal(buffer, ((unsigned char[]){0x3A, 0x00, 0x0F, 0x42, 0x40}),1115);112assert_size_equal(cbor_serialized_size(item), 5);113cbor_decref(&item);114}115116static void test_serialize_negint64(void **_CBOR_UNUSED(_state)) {117cbor_item_t *item = cbor_new_int64();118cbor_set_uint64(item, 1000000000000);119cbor_mark_negint(item);120assert_size_equal(9, cbor_serialize(item, buffer, 512));121assert_memory_equal(122buffer,123((unsigned char[]){0x3B, 0x00, 0x00, 0x00, 0xE8, 0xD4, 0xA5, 0x10, 0x00}),1249);125assert_size_equal(cbor_serialized_size(item), 9);126cbor_decref(&item);127}128129static void test_serialize_definite_bytestring(void **_CBOR_UNUSED(_state)) {130cbor_item_t *item = cbor_new_definite_bytestring();131unsigned char *data = malloc(256);132cbor_bytestring_set_handle(item, data, 256);133memset(data, 0, 256); /* Prevent undefined behavior in comparison */134assert_size_equal(256 + 3, cbor_serialize(item, buffer, 512));135assert_memory_equal(buffer, ((unsigned char[]){0x59, 0x01, 0x00}), 3);136assert_memory_equal(buffer + 3, data, 256);137assert_size_equal(cbor_serialized_size(item), 259);138cbor_decref(&item);139}140141static void test_serialize_indefinite_bytestring(void **_CBOR_UNUSED(_state)) {142cbor_item_t *item = cbor_new_indefinite_bytestring();143144cbor_item_t *chunk = cbor_new_definite_bytestring();145unsigned char *data = malloc(256);146memset(data, 0, 256); /* Prevent undefined behavior in comparison */147cbor_bytestring_set_handle(chunk, data, 256);148149assert_true(cbor_bytestring_add_chunk(item, cbor_move(chunk)));150assert_size_equal(cbor_bytestring_chunk_count(item), 1);151152assert_size_equal(1 + 3 + 256 + 1, cbor_serialize(item, buffer, 512));153assert_memory_equal(buffer, ((unsigned char[]){0x5F, 0x59, 0x01, 0x00}), 4);154assert_memory_equal(buffer + 4, data, 256);155assert_memory_equal(buffer + 4 + 256, ((unsigned char[]){0xFF}), 1);156assert_size_equal(cbor_serialized_size(item), 261);157cbor_decref(&item);158}159160static void test_serialize_bytestring_size_overflow(161void **_CBOR_UNUSED(_state)) {162cbor_item_t *item = cbor_new_definite_bytestring();163164// Fake having a huge chunk of data165unsigned char *data = malloc(1);166cbor_bytestring_set_handle(item, data, SIZE_MAX);167168// Would require 1 + 8 + SIZE_MAX bytes, which overflows size_t169assert_size_equal(cbor_serialize(item, buffer, 512), 0);170assert_size_equal(cbor_serialized_size(item), 0);171cbor_decref(&item);172}173174static void test_serialize_bytestring_no_space(void **_CBOR_UNUSED(_state)) {175cbor_item_t *item = cbor_new_definite_bytestring();176unsigned char *data = malloc(12);177cbor_bytestring_set_handle(item, data, 12);178179assert_size_equal(cbor_serialize(item, buffer, 1), 0);180181cbor_decref(&item);182}183184static void test_serialize_indefinite_bytestring_no_space(185void **_CBOR_UNUSED(_state)) {186cbor_item_t *item = cbor_new_indefinite_bytestring();187cbor_item_t *chunk = cbor_new_definite_bytestring();188unsigned char *data = malloc(256);189cbor_bytestring_set_handle(chunk, data, 256);190assert_true(cbor_bytestring_add_chunk(item, cbor_move(chunk)));191192// Not enough space for the leading byte193assert_size_equal(cbor_serialize(item, buffer, 0), 0);194195// Not enough space for the chunk196assert_size_equal(cbor_serialize(item, buffer, 30), 0);197198// Not enough space for the indef break199assert_size_equal(200cbor_serialize(item, buffer, 1 + cbor_serialized_size(chunk)), 0);201202cbor_decref(&item);203}204205static void test_serialize_definite_string(void **_CBOR_UNUSED(_state)) {206cbor_item_t *item = cbor_new_definite_string();207unsigned char *data = malloc(12);208strncpy((char *)data, "Hello world!", 12);209cbor_string_set_handle(item, data, 12);210assert_size_equal(1 + 12, cbor_serialize(item, buffer, 512));211assert_memory_equal(212buffer,213((unsigned char[]){0x6C, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F,2140x72, 0x6C, 0x64, 0x21}),21513);216assert_size_equal(cbor_serialized_size(item), 13);217cbor_decref(&item);218}219220static void test_serialize_definite_string_4b_header(221void **_CBOR_UNUSED(_state)) {222#if SIZE_MAX > UINT16_MAX223cbor_item_t *item = cbor_new_definite_string();224const size_t size = (size_t)UINT16_MAX + 1;225unsigned char *data = malloc(size);226memset(data, 0, size);227cbor_string_set_handle(item, data, size);228assert_size_equal(cbor_serialized_size(item), 1 + 4 + size);229cbor_decref(&item);230#endif231}232233static void test_serialize_definite_string_8b_header(234void **_CBOR_UNUSED(_state)) {235#if SIZE_MAX > UINT32_MAX236cbor_item_t *item = cbor_new_definite_string();237const size_t size = (size_t)UINT32_MAX + 1;238unsigned char *data = malloc(1);239data[0] = '\0';240cbor_string_set_handle(item, data, 1);241// Pretend that we have a big item to avoid the huge malloc242item->metadata.string_metadata.length = size;243assert_size_equal(cbor_serialized_size(item), 1 + 8 + size);244cbor_decref(&item);245#endif246}247248static void test_serialize_indefinite_string(void **_CBOR_UNUSED(_state)) {249cbor_item_t *item = cbor_new_indefinite_string();250cbor_item_t *chunk = cbor_new_definite_string();251252unsigned char *data = malloc(12);253strncpy((char *)data, "Hello world!", 12);254cbor_string_set_handle(chunk, data, 12);255256assert_true(cbor_string_add_chunk(item, cbor_move(chunk)));257assert_size_equal(cbor_string_chunk_count(item), 1);258259assert_size_equal(15, cbor_serialize(item, buffer, 512));260assert_memory_equal(261buffer,262((unsigned char[]){0x7F, 0x6C, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77,2630x6F, 0x72, 0x6C, 0x64, 0x21, 0xFF}),26415);265assert_size_equal(cbor_serialized_size(item), 15);266cbor_decref(&item);267}268269static void test_serialize_string_no_space(void **_CBOR_UNUSED(_state)) {270cbor_item_t *item = cbor_new_definite_string();271unsigned char *data = malloc(12);272memset(data, 0, 12);273cbor_string_set_handle(item, data, 12);274275assert_size_equal(cbor_serialize(item, buffer, 1), 0);276277cbor_decref(&item);278}279280static void test_serialize_indefinite_string_no_space(281void **_CBOR_UNUSED(_state)) {282cbor_item_t *item = cbor_new_indefinite_string();283cbor_item_t *chunk = cbor_new_definite_string();284unsigned char *data = malloc(256);285memset(data, 0, 256);286cbor_string_set_handle(chunk, data, 256);287assert_true(cbor_string_add_chunk(item, cbor_move(chunk)));288289// Not enough space for the leading byte290assert_size_equal(cbor_serialize(item, buffer, 0), 0);291292// Not enough space for the chunk293assert_size_equal(cbor_serialize(item, buffer, 30), 0);294295// Not enough space for the indef break296assert_size_equal(297cbor_serialize(item, buffer, 1 + cbor_serialized_size(chunk)), 0);298299cbor_decref(&item);300}301302static void test_serialize_definite_array(void **_CBOR_UNUSED(_state)) {303cbor_item_t *item = cbor_new_definite_array(2);304cbor_item_t *one = cbor_build_uint8(1);305cbor_item_t *two = cbor_build_uint8(2);306307assert_true(cbor_array_push(item, one));308assert_true(cbor_array_set(item, 1, two));309assert_true(cbor_array_replace(item, 0, one));310311assert_size_equal(3, cbor_serialize(item, buffer, 512));312assert_memory_equal(buffer, ((unsigned char[]){0x82, 0x01, 0x02}), 3);313assert_size_equal(cbor_serialized_size(item), 3);314cbor_decref(&item);315cbor_decref(&one);316cbor_decref(&two);317}318319static void test_serialize_array_no_space(void **_CBOR_UNUSED(_state)) {320cbor_item_t *item = cbor_new_indefinite_array();321cbor_item_t *one = cbor_build_uint8(1);322assert_true(cbor_array_push(item, one));323assert_size_equal(cbor_serialized_size(item), 3);324325// Not enough space for the leading byte326assert_size_equal(0, cbor_serialize(item, buffer, 0));327328// Not enough space for the item329assert_size_equal(0, cbor_serialize(item, buffer, 1));330331// Not enough space for the indef break332assert_size_equal(0, cbor_serialize(item, buffer, 2));333334cbor_decref(&item);335cbor_decref(&one);336}337338static void test_serialize_indefinite_array(void **_CBOR_UNUSED(_state)) {339cbor_item_t *item = cbor_new_indefinite_array();340cbor_item_t *one = cbor_build_uint8(1);341cbor_item_t *two = cbor_build_uint8(2);342343assert_true(cbor_array_push(item, one));344assert_true(cbor_array_push(item, two));345346assert_size_equal(4, cbor_serialize(item, buffer, 512));347assert_memory_equal(buffer, ((unsigned char[]){0x9F, 0x01, 0x02, 0xFF}), 4);348assert_size_equal(cbor_serialized_size(item), 4);349cbor_decref(&item);350cbor_decref(&one);351cbor_decref(&two);352}353354static void test_serialize_definite_map(void **_CBOR_UNUSED(_state)) {355cbor_item_t *item = cbor_new_definite_map(2);356cbor_item_t *one = cbor_build_uint8(1);357cbor_item_t *two = cbor_build_uint8(2);358359assert_true(cbor_map_add(item, (struct cbor_pair){.key = one, .value = two}));360assert_true(cbor_map_add(item, (struct cbor_pair){.key = two, .value = one}));361362assert_size_equal(5, cbor_serialize(item, buffer, 512));363assert_memory_equal(buffer, ((unsigned char[]){0xA2, 0x01, 0x02, 0x02, 0x01}),3645);365assert_size_equal(cbor_serialized_size(item), 5);366cbor_decref(&item);367cbor_decref(&one);368cbor_decref(&two);369}370371static void test_serialize_indefinite_map(void **_CBOR_UNUSED(_state)) {372cbor_item_t *item = cbor_new_indefinite_map();373cbor_item_t *one = cbor_build_uint8(1);374cbor_item_t *two = cbor_build_uint8(2);375376assert_true(cbor_map_add(item, (struct cbor_pair){.key = one, .value = two}));377assert_true(cbor_map_add(item, (struct cbor_pair){.key = two, .value = one}));378379assert_size_equal(6, cbor_serialize(item, buffer, 512));380assert_memory_equal(381buffer, ((unsigned char[]){0xBF, 0x01, 0x02, 0x02, 0x01, 0xFF}), 6);382assert_size_equal(cbor_serialized_size(item), 6);383cbor_decref(&item);384cbor_decref(&one);385cbor_decref(&two);386}387388static void test_serialize_map_no_space(void **_CBOR_UNUSED(_state)) {389cbor_item_t *item = cbor_new_indefinite_map();390cbor_item_t *one = cbor_build_uint8(1);391cbor_item_t *two = cbor_build_uint8(2);392assert_true(cbor_map_add(item, (struct cbor_pair){.key = one, .value = two}));393assert_size_equal(cbor_serialized_size(item), 4);394395// Not enough space for the leading byte396assert_size_equal(cbor_serialize(item, buffer, 0), 0);397398// Not enough space for the key399assert_size_equal(cbor_serialize(item, buffer, 1), 0);400401// Not enough space for the value402assert_size_equal(cbor_serialize(item, buffer, 2), 0);403404// Not enough space for the indef break405assert_size_equal(cbor_serialize(item, buffer, 3), 0);406407cbor_decref(&item);408cbor_decref(&one);409cbor_decref(&two);410}411412static void test_serialize_tags(void **_CBOR_UNUSED(_state)) {413cbor_item_t *item = cbor_new_tag(21);414cbor_item_t *one = cbor_build_uint8(1);415cbor_tag_set_item(item, one);416417assert_size_equal(2, cbor_serialize(item, buffer, 512));418assert_memory_equal(buffer, ((unsigned char[]){0xD5, 0x01}), 2);419assert_size_equal(cbor_serialized_size(item), 2);420cbor_decref(&item);421cbor_decref(&one);422}423424static void test_serialize_tags_no_space(void **_CBOR_UNUSED(_state)) {425cbor_item_t *item = cbor_new_tag(21);426cbor_item_t *one = cbor_build_uint8(1);427cbor_tag_set_item(item, one);428assert_size_equal(cbor_serialized_size(item), 2);429430// Not enough space for the leading byte431assert_size_equal(cbor_serialize(item, buffer, 0), 0);432433// Not enough space for the item434assert_size_equal(cbor_serialize(item, buffer, 1), 0);435436cbor_decref(&item);437cbor_decref(&one);438}439440static void test_serialize_half(void **_CBOR_UNUSED(_state)) {441cbor_item_t *item = cbor_new_float2();442cbor_set_float2(item, NAN);443444assert_size_equal(3, cbor_serialize(item, buffer, 512));445assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7E, 0x00}), 3);446assert_size_equal(cbor_serialized_size(item), 3);447cbor_decref(&item);448}449450static void test_serialize_single(void **_CBOR_UNUSED(_state)) {451cbor_item_t *item = cbor_new_float4();452cbor_set_float4(item, 100000.0f);453454assert_size_equal(5, cbor_serialize(item, buffer, 512));455assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0x47, 0xC3, 0x50, 0x00}),4565);457assert_size_equal(cbor_serialized_size(item), 5);458cbor_decref(&item);459}460461static void test_serialize_double(void **_CBOR_UNUSED(_state)) {462cbor_item_t *item = cbor_new_float8();463cbor_set_float8(item, -4.1);464465assert_size_equal(9, cbor_serialize(item, buffer, 512));466assert_memory_equal(467buffer,468((unsigned char[]){0xFB, 0xC0, 0x10, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}),4699);470assert_size_equal(cbor_serialized_size(item), 9);471cbor_decref(&item);472}473474static void test_serialize_ctrl(void **_CBOR_UNUSED(_state)) {475cbor_item_t *item = cbor_new_undef();476477assert_size_equal(1, cbor_serialize(item, buffer, 512));478assert_memory_equal(buffer, ((unsigned char[]){0xF7}), 1);479assert_size_equal(cbor_serialized_size(item), 1);480cbor_decref(&item);481}482483static void test_serialize_long_ctrl(void **_CBOR_UNUSED(_state)) {484cbor_item_t *item = cbor_new_ctrl();485cbor_set_ctrl(item, 254);486487assert_size_equal(2, cbor_serialize(item, buffer, 512));488assert_memory_equal(buffer, ((unsigned char[]){0xF8, 0xFE}), 2);489assert_size_equal(cbor_serialized_size(item), 2);490cbor_decref(&item);491}492493static void test_auto_serialize(void **_CBOR_UNUSED(_state)) {494cbor_item_t *item = cbor_new_definite_array(4);495for (size_t i = 0; i < 4; i++) {496assert_true(cbor_array_push(item, cbor_move(cbor_build_uint64(0))));497}498499unsigned char *output;500size_t output_size;501assert_size_equal(cbor_serialize_alloc(item, &output, &output_size), 37);502assert_size_equal(output_size, 37);503assert_size_equal(cbor_serialized_size(item), 37);504assert_memory_equal(output, ((unsigned char[]){0x84, 0x1B}), 2);505cbor_decref(&item);506_cbor_free(output);507}508509static void test_auto_serialize_no_size(void **_CBOR_UNUSED(_state)) {510cbor_item_t *item = cbor_build_uint8(1);511512unsigned char *output;513assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);514assert_memory_equal(output, ((unsigned char[]){0x01}), 1);515assert_size_equal(cbor_serialized_size(item), 1);516cbor_decref(&item);517_cbor_free(output);518}519520static void test_auto_serialize_too_large(void **_CBOR_UNUSED(_state)) {521cbor_item_t *item = cbor_new_indefinite_string();522cbor_item_t *chunk = cbor_new_definite_string();523assert_true(cbor_string_add_chunk(item, chunk));524525// Pretend the chunk is huge526chunk->metadata.string_metadata.length = SIZE_MAX;527assert_true(SIZE_MAX + 2 == 1);528assert_size_equal(cbor_serialized_size(item), 0);529unsigned char *output;530size_t output_size;531assert_size_equal(cbor_serialize_alloc(item, &output, &output_size), 0);532assert_size_equal(output_size, 0);533assert_null(output);534535chunk->metadata.string_metadata.length = 0;536cbor_decref(&chunk);537cbor_decref(&item);538}539540static void test_auto_serialize_alloc_fail(void **_CBOR_UNUSED(_state)) {541cbor_item_t *item = cbor_build_uint8(42);542543WITH_FAILING_MALLOC({544unsigned char *output;545size_t output_size;546assert_size_equal(cbor_serialize_alloc(item, &output, &output_size), 0);547assert_size_equal(output_size, 0);548assert_null(output);549});550551cbor_decref(&item);552}553554static void test_auto_serialize_zero_len_bytestring(555void **_CBOR_UNUSED(_state)) {556cbor_item_t *item = cbor_build_bytestring((cbor_data) "", 0);557558unsigned char *output;559assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);560assert_memory_equal(output, ((unsigned char[]){0x40}), 1);561assert_size_equal(cbor_serialized_size(item), 1);562cbor_decref(&item);563_cbor_free(output);564}565566static void test_auto_serialize_zero_len_string(void **_CBOR_UNUSED(_state)) {567cbor_item_t *item = cbor_build_string("");568569unsigned char *output;570assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);571assert_memory_equal(output, ((unsigned char[]){0x60}), 1);572assert_size_equal(cbor_serialized_size(item), 1);573cbor_decref(&item);574_cbor_free(output);575}576577static void test_auto_serialize_zero_len_bytestring_chunk(578void **_CBOR_UNUSED(_state)) {579cbor_item_t *item = cbor_new_indefinite_bytestring();580581assert_true(cbor_bytestring_add_chunk(582item, cbor_move(cbor_build_bytestring((cbor_data) "", 0))));583584unsigned char *output;585assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 3);586assert_memory_equal(output, ((unsigned char[]){0x5f, 0x40, 0xff}), 3);587assert_size_equal(cbor_serialized_size(item), 3);588cbor_decref(&item);589_cbor_free(output);590}591592static void test_auto_serialize_zero_len_string_chunk(593void **_CBOR_UNUSED(_state)) {594cbor_item_t *item = cbor_new_indefinite_string();595596assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string(""))));597598unsigned char *output;599assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 3);600assert_memory_equal(output, ((unsigned char[]){0x7f, 0x60, 0xff}), 3);601assert_size_equal(cbor_serialized_size(item), 3);602cbor_decref(&item);603_cbor_free(output);604}605606static void test_auto_serialize_zero_len_array(void **_CBOR_UNUSED(_state)) {607cbor_item_t *item = cbor_new_definite_array(0);608609unsigned char *output;610assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);611assert_memory_equal(output, ((unsigned char[]){0x80}), 1);612assert_size_equal(cbor_serialized_size(item), 1);613cbor_decref(&item);614_cbor_free(output);615}616617static void test_auto_serialize_zero_len_indef_array(618void **_CBOR_UNUSED(_state)) {619cbor_item_t *item = cbor_new_indefinite_array();620621unsigned char *output;622assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 2);623assert_memory_equal(output, ((unsigned char[]){0x9f, 0xff}), 2);624assert_size_equal(cbor_serialized_size(item), 2);625cbor_decref(&item);626_cbor_free(output);627}628629static void test_auto_serialize_zero_len_map(void **_CBOR_UNUSED(_state)) {630cbor_item_t *item = cbor_new_definite_map(0);631632unsigned char *output;633assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 1);634assert_memory_equal(output, ((unsigned char[]){0xa0}), 1);635assert_size_equal(cbor_serialized_size(item), 1);636cbor_decref(&item);637_cbor_free(output);638}639640static void test_auto_serialize_zero_len_indef_map(641void **_CBOR_UNUSED(_state)) {642cbor_item_t *item = cbor_new_indefinite_map();643644unsigned char *output;645assert_size_equal(cbor_serialize_alloc(item, &output, NULL), 2);646assert_memory_equal(output, ((unsigned char[]){0xbf, 0xff}), 2);647assert_size_equal(cbor_serialized_size(item), 2);648cbor_decref(&item);649_cbor_free(output);650}651652int main(void) {653const struct CMUnitTest tests[] = {654cmocka_unit_test(test_serialize_uint8_embed),655cmocka_unit_test(test_serialize_uint8),656cmocka_unit_test(test_serialize_uint16),657cmocka_unit_test(test_serialize_uint32),658cmocka_unit_test(test_serialize_uint64),659cmocka_unit_test(test_serialize_negint8_embed),660cmocka_unit_test(test_serialize_negint8),661cmocka_unit_test(test_serialize_negint16),662cmocka_unit_test(test_serialize_negint32),663cmocka_unit_test(test_serialize_negint64),664cmocka_unit_test(test_serialize_definite_bytestring),665cmocka_unit_test(test_serialize_indefinite_bytestring),666cmocka_unit_test(test_serialize_bytestring_size_overflow),667cmocka_unit_test(test_serialize_bytestring_no_space),668cmocka_unit_test(test_serialize_indefinite_bytestring_no_space),669cmocka_unit_test(test_serialize_definite_string),670cmocka_unit_test(test_serialize_definite_string_4b_header),671cmocka_unit_test(test_serialize_definite_string_8b_header),672cmocka_unit_test(test_serialize_indefinite_string),673cmocka_unit_test(test_serialize_string_no_space),674cmocka_unit_test(test_serialize_indefinite_string_no_space),675cmocka_unit_test(test_serialize_definite_array),676cmocka_unit_test(test_serialize_indefinite_array),677cmocka_unit_test(test_serialize_array_no_space),678cmocka_unit_test(test_serialize_definite_map),679cmocka_unit_test(test_serialize_indefinite_map),680cmocka_unit_test(test_serialize_map_no_space),681cmocka_unit_test(test_serialize_tags),682cmocka_unit_test(test_serialize_tags_no_space),683cmocka_unit_test(test_serialize_half),684cmocka_unit_test(test_serialize_single),685cmocka_unit_test(test_serialize_double),686cmocka_unit_test(test_serialize_ctrl),687cmocka_unit_test(test_serialize_long_ctrl),688cmocka_unit_test(test_auto_serialize),689cmocka_unit_test(test_auto_serialize_no_size),690cmocka_unit_test(test_auto_serialize_too_large),691cmocka_unit_test(test_auto_serialize_alloc_fail),692cmocka_unit_test(test_auto_serialize_zero_len_bytestring),693cmocka_unit_test(test_auto_serialize_zero_len_string),694cmocka_unit_test(test_auto_serialize_zero_len_bytestring_chunk),695cmocka_unit_test(test_auto_serialize_zero_len_string_chunk),696cmocka_unit_test(test_auto_serialize_zero_len_array),697cmocka_unit_test(test_auto_serialize_zero_len_indef_array),698cmocka_unit_test(test_auto_serialize_zero_len_map),699cmocka_unit_test(test_auto_serialize_zero_len_indef_map),700};701return cmocka_run_group_tests(tests, NULL, NULL);702}703704705