Path: blob/main/contrib/libcbor/test/pretty_printer_test.c
39481 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#include <stdio.h>8#include <string.h>910#include "assertions.h"11#include "cbor.h"1213void assert_describe_result(cbor_item_t *item, char *expected_result) {14#if CBOR_PRETTY_PRINTER15// We know the expected size based on `expected_result`, but read everything16// in order to get the full actual output in a useful error message.17const size_t buffer_size = 512;18FILE *outfile = tmpfile();19cbor_describe(item, outfile);20rewind(outfile);21// Treat string as null-terminated since cmocka doesn't have asserts22// for explicit length strings.23char *output = malloc(buffer_size);24assert_non_null(output);25size_t output_size = fread(output, sizeof(char), buffer_size, outfile);26output[output_size] = '\0';27assert_string_equal(output, expected_result);28assert_true(feof(outfile));29free(output);30fclose(outfile);31#endif32}3334static void test_uint(void **_CBOR_UNUSED(_state)) {35cbor_item_t *item = cbor_build_uint8(42);36assert_describe_result(item, "[CBOR_TYPE_UINT] Width: 1B, Value: 42\n");37cbor_decref(&item);38}3940static void test_negint(void **_CBOR_UNUSED(_state)) {41cbor_item_t *item = cbor_build_negint16(40);42assert_describe_result(item,43"[CBOR_TYPE_NEGINT] Width: 2B, Value: -40 - 1\n");44cbor_decref(&item);45}4647static void test_definite_bytestring(void **_CBOR_UNUSED(_state)) {48unsigned char data[] = {0x01, 0x02, 0x03};49cbor_item_t *item = cbor_build_bytestring(data, 3);50assert_describe_result(item,51"[CBOR_TYPE_BYTESTRING] Definite, Length: 3B, Data:\n"52" 010203\n");53cbor_decref(&item);54}5556static void test_indefinite_bytestring(void **_CBOR_UNUSED(_state)) {57unsigned char data[] = {0x01, 0x02, 0x03};58cbor_item_t *item = cbor_new_indefinite_bytestring();59assert_true(cbor_bytestring_add_chunk(60item, cbor_move(cbor_build_bytestring(data, 3))));61assert_true(cbor_bytestring_add_chunk(62item, cbor_move(cbor_build_bytestring(data, 2))));63assert_describe_result(64item,65"[CBOR_TYPE_BYTESTRING] Indefinite, Chunks: 2, Chunk data:\n"66" [CBOR_TYPE_BYTESTRING] Definite, Length: 3B, Data:\n"67" 010203\n"68" [CBOR_TYPE_BYTESTRING] Definite, Length: 2B, Data:\n"69" 0102\n");70cbor_decref(&item);71}7273static void test_definite_string(void **_CBOR_UNUSED(_state)) {74char *string = "Hello!";75cbor_item_t *item = cbor_build_string(string);76assert_describe_result(77item,78"[CBOR_TYPE_STRING] Definite, Length: 6B, Codepoints: 6, Data:\n"79" Hello!\n");80cbor_decref(&item);81}8283static void test_indefinite_string(void **_CBOR_UNUSED(_state)) {84char *string = "Hello!";85cbor_item_t *item = cbor_new_indefinite_string();86assert_true(87cbor_string_add_chunk(item, cbor_move(cbor_build_string(string))));88assert_true(89cbor_string_add_chunk(item, cbor_move(cbor_build_string(string))));90assert_describe_result(91item,92"[CBOR_TYPE_STRING] Indefinite, Chunks: 2, Chunk data:\n"93" [CBOR_TYPE_STRING] Definite, Length: 6B, Codepoints: 6, Data:\n"94" Hello!\n"95" [CBOR_TYPE_STRING] Definite, Length: 6B, Codepoints: 6, Data:\n"96" Hello!\n");97cbor_decref(&item);98}99100static void test_multibyte_string(void **_CBOR_UNUSED(_state)) {101// "Štěstíčko" in UTF-8102char *string = "\xc5\xa0t\xc4\x9bst\xc3\xad\xc4\x8dko";103cbor_item_t *item = cbor_build_string(string);104assert_describe_result(105item,106"[CBOR_TYPE_STRING] Definite, Length: 13B, Codepoints: 9, Data:\n"107" \xc5\xa0t\xc4\x9bst\xc3\xad\xc4\x8dko\n");108cbor_decref(&item);109}110111static void test_definite_array(void **_CBOR_UNUSED(_state)) {112cbor_item_t *item = cbor_new_definite_array(2);113assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(1))));114assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(2))));115assert_describe_result(item,116"[CBOR_TYPE_ARRAY] Definite, Size: 2, Contents:\n"117" [CBOR_TYPE_UINT] Width: 1B, Value: 1\n"118" [CBOR_TYPE_UINT] Width: 1B, Value: 2\n");119cbor_decref(&item);120}121122static void test_indefinite_array(void **_CBOR_UNUSED(_state)) {123cbor_item_t *item = cbor_new_indefinite_array();124assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(1))));125assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(2))));126assert_describe_result(item,127"[CBOR_TYPE_ARRAY] Indefinite, Size: 2, Contents:\n"128" [CBOR_TYPE_UINT] Width: 1B, Value: 1\n"129" [CBOR_TYPE_UINT] Width: 1B, Value: 2\n");130cbor_decref(&item);131}132133static void test_definite_map(void **_CBOR_UNUSED(_state)) {134cbor_item_t *item = cbor_new_definite_map(1);135assert_true(cbor_map_add(136item, (struct cbor_pair){.key = cbor_move(cbor_build_uint8(1)),137.value = cbor_move(cbor_build_uint8(2))}));138assert_describe_result(item,139"[CBOR_TYPE_MAP] Definite, Size: 1, Contents:\n"140" Map entry 0\n"141" [CBOR_TYPE_UINT] Width: 1B, Value: 1\n"142" [CBOR_TYPE_UINT] Width: 1B, Value: 2\n");143cbor_decref(&item);144}145146static void test_indefinite_map(void **_CBOR_UNUSED(_state)) {147cbor_item_t *item = cbor_new_indefinite_map();148assert_true(cbor_map_add(149item, (struct cbor_pair){.key = cbor_move(cbor_build_uint8(1)),150.value = cbor_move(cbor_build_uint8(2))}));151assert_describe_result(item,152"[CBOR_TYPE_MAP] Indefinite, Size: 1, Contents:\n"153" Map entry 0\n"154" [CBOR_TYPE_UINT] Width: 1B, Value: 1\n"155" [CBOR_TYPE_UINT] Width: 1B, Value: 2\n");156cbor_decref(&item);157}158159static void test_tag(void **_CBOR_UNUSED(_state)) {160cbor_item_t *item = cbor_build_tag(42, cbor_move(cbor_build_uint8(1)));161assert_describe_result(item,162"[CBOR_TYPE_TAG] Value: 42\n"163" [CBOR_TYPE_UINT] Width: 1B, Value: 1\n");164cbor_decref(&item);165}166167static void test_floats(void **_CBOR_UNUSED(_state)) {168cbor_item_t *item = cbor_new_indefinite_array();169assert_true(cbor_array_push(item, cbor_move(cbor_build_bool(true))));170assert_true(171cbor_array_push(item, cbor_move(cbor_build_ctrl(CBOR_CTRL_UNDEF))));172assert_true(173cbor_array_push(item, cbor_move(cbor_build_ctrl(CBOR_CTRL_NULL))));174assert_true(cbor_array_push(item, cbor_move(cbor_build_ctrl(24))));175assert_true(cbor_array_push(item, cbor_move(cbor_build_float4(3.14f))));176assert_describe_result(177item,178"[CBOR_TYPE_ARRAY] Indefinite, Size: 5, Contents:\n"179" [CBOR_TYPE_FLOAT_CTRL] Bool: true\n"180" [CBOR_TYPE_FLOAT_CTRL] Undefined\n"181" [CBOR_TYPE_FLOAT_CTRL] Null\n"182" [CBOR_TYPE_FLOAT_CTRL] Simple value: 24\n"183" [CBOR_TYPE_FLOAT_CTRL] Width: 4B, Value: 3.140000\n");184cbor_decref(&item);185}186187int main(void) {188const struct CMUnitTest tests[] = {189cmocka_unit_test(test_uint),190cmocka_unit_test(test_negint),191cmocka_unit_test(test_definite_bytestring),192cmocka_unit_test(test_indefinite_bytestring),193cmocka_unit_test(test_definite_string),194cmocka_unit_test(test_indefinite_string),195cmocka_unit_test(test_multibyte_string),196cmocka_unit_test(test_definite_array),197cmocka_unit_test(test_indefinite_array),198cmocka_unit_test(test_definite_map),199cmocka_unit_test(test_indefinite_map),200cmocka_unit_test(test_tag),201cmocka_unit_test(test_floats),202};203return cmocka_run_group_tests(tests, NULL, NULL);204}205206207