Path: blob/main/contrib/libcbor/test/array_test.c
101914 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 "assertions.h"8#include "cbor.h"9#include "test_allocator.h"1011cbor_item_t *arr;12struct cbor_load_result res;1314unsigned char data1[] = {0x80, 0xFF};1516static void test_empty_array(void **_CBOR_UNUSED(_state)) {17arr = cbor_load(data1, 2, &res);18assert_non_null(arr);19assert_true(cbor_typeof(arr) == CBOR_TYPE_ARRAY);20assert_true(cbor_isa_array(arr));21assert_true(cbor_array_size(arr) == 0);22assert_true(res.read == 1);23cbor_decref(&arr);24assert_null(arr);25}2627unsigned char data2[] = {0x81, 0x01, 0xFF};2829static void test_simple_array(void **_CBOR_UNUSED(_state)) {30arr = cbor_load(data2, 3, &res);31assert_non_null(arr);32assert_true(cbor_typeof(arr) == CBOR_TYPE_ARRAY);33assert_true(cbor_isa_array(arr));34assert_size_equal(cbor_array_size(arr), 1);35assert_true(res.read == 2);36assert_size_equal(cbor_array_allocated(arr), 1);37/* Check the values */38assert_uint8(cbor_array_handle(arr)[0], 1);39cbor_item_t *intermediate = cbor_array_get(arr, 0);40assert_uint8(intermediate, 1);4142cbor_item_t *new_val = cbor_build_uint8(10);43assert_false(cbor_array_set(arr, 1, new_val));44assert_false(cbor_array_set(arr, 3, new_val));45cbor_decref(&new_val);4647cbor_decref(&arr);48cbor_decref(&intermediate);49assert_null(arr);50assert_null(intermediate);51}5253unsigned char data3[] = {0x82, 0x01, 0x81, 0x01, 0xFF};5455static void test_nested_arrays(void **_CBOR_UNUSED(_state)) {56arr = cbor_load(data3, 5, &res);57assert_non_null(arr);58assert_true(cbor_typeof(arr) == CBOR_TYPE_ARRAY);59assert_true(cbor_isa_array(arr));60assert_true(cbor_array_size(arr) == 2);61assert_true(res.read == 4);62/* Check the values */63assert_uint8(cbor_array_handle(arr)[0], 1);6465cbor_item_t *nested = cbor_array_handle(arr)[1];66assert_true(cbor_isa_array(nested));67assert_true(cbor_array_size(nested) == 1);68assert_uint8(cbor_array_handle(nested)[0], 1);6970cbor_decref(&arr);71assert_null(arr);72}7374unsigned char test_indef_arrays_data[] = {0x9f, 0x01, 0x02, 0xFF};7576static void test_indef_arrays(void **_CBOR_UNUSED(_state)) {77arr = cbor_load(test_indef_arrays_data, 4, &res);78assert_non_null(arr);79assert_true(cbor_typeof(arr) == CBOR_TYPE_ARRAY);80assert_true(cbor_isa_array(arr));81assert_true(cbor_array_size(arr) == 2);82assert_true(res.read == 4);83/* Check the values */84assert_uint8(cbor_array_handle(arr)[0], 1);85assert_uint8(cbor_array_handle(arr)[1], 2);8687assert_true(cbor_array_set(arr, 1, cbor_move(cbor_build_uint8(10))));8889cbor_decref(&arr);90assert_null(arr);91}9293unsigned char test_nested_indef_arrays_data[] = {0x9f, 0x01, 0x9f, 0x02,940xFF, 0x03, 0xFF};9596static void test_nested_indef_arrays(void **_CBOR_UNUSED(_state)) {97arr = cbor_load(test_nested_indef_arrays_data, 7, &res);98assert_non_null(arr);99assert_true(cbor_typeof(arr) == CBOR_TYPE_ARRAY);100assert_true(cbor_isa_array(arr));101assert_size_equal(cbor_array_size(arr), 3);102assert_true(res.read == 7);103/* Check the values */104assert_uint8(cbor_array_handle(arr)[0], 1);105106cbor_item_t *nested = cbor_array_handle(arr)[1];107assert_true(cbor_isa_array(nested));108assert_true(cbor_array_size(nested) == 1);109assert_uint8(cbor_array_handle(nested)[0], 2);110111cbor_decref(&arr);112assert_null(arr);113}114115static void test_array_replace(void **_CBOR_UNUSED(_state)) {116cbor_item_t *array = cbor_new_definite_array(2);117assert_size_equal(cbor_array_size(array), 0);118cbor_item_t *one = cbor_build_uint8(1);119cbor_item_t *three = cbor_build_uint8(3);120assert_size_equal(cbor_refcount(one), 1);121assert_size_equal(cbor_refcount(three), 1);122123// No item to replace124assert_false(cbor_array_replace(array, 0, three));125assert_size_equal(cbor_refcount(three), 1);126127// Add items [1, 2]128assert_true(cbor_array_push(array, one));129assert_true(cbor_array_push(array, cbor_move(cbor_build_uint8(2))));130assert_size_equal(cbor_refcount(one), 2);131assert_size_equal(cbor_array_size(array), 2);132133// Array has only two items134assert_false(cbor_array_replace(array, 2, three));135assert_size_equal(cbor_refcount(three), 1);136137// Change [1, 2] to [3, 2]138assert_true(cbor_array_replace(array, 0, three));139assert_size_equal(cbor_refcount(one), 1);140assert_size_equal(cbor_refcount(three), 2);141assert_uint8(cbor_move(cbor_array_get(array, 0)), 3);142assert_uint8(cbor_move(cbor_array_get(array, 1)), 2);143144cbor_decref(&one);145cbor_decref(&three);146cbor_decref(&array);147}148149static void test_array_push_overflow(void **_CBOR_UNUSED(_state)) {150cbor_item_t *array = cbor_new_indefinite_array();151cbor_item_t *one = cbor_build_uint8(1);152struct _cbor_array_metadata *metadata =153(struct _cbor_array_metadata *)&array->metadata;154// Pretend we already have a huge block allocated155metadata->allocated = SIZE_MAX;156metadata->end_ptr = SIZE_MAX;157158assert_false(cbor_array_push(array, one));159assert_size_equal(cbor_refcount(one), 1);160161cbor_decref(&one);162metadata->allocated = 0;163metadata->end_ptr = 0;164cbor_decref(&array);165}166167static void test_array_creation(void **_CBOR_UNUSED(_state)) {168WITH_FAILING_MALLOC({ assert_null(cbor_new_definite_array(42)); });169WITH_MOCK_MALLOC({ assert_null(cbor_new_definite_array(42)); }, 2, MALLOC,170MALLOC_FAIL);171172WITH_FAILING_MALLOC({ assert_null(cbor_new_indefinite_array()); });173}174175static void test_array_push(void **_CBOR_UNUSED(_state)) {176WITH_MOCK_MALLOC(177{178cbor_item_t *array = cbor_new_indefinite_array();179cbor_item_t *string = cbor_build_string("Hello!");180181assert_false(cbor_array_push(array, string));182assert_size_equal(cbor_array_allocated(array), 0);183assert_null(array->data);184assert_size_equal(array->metadata.array_metadata.end_ptr, 0);185186cbor_decref(&string);187cbor_decref(&array);188},1894, MALLOC, MALLOC, MALLOC, REALLOC_FAIL);190}191192static unsigned char simple_indef_array[] = {0x9F, 0x01, 0x02, 0xFF};193static void test_indef_array_decode(void **_CBOR_UNUSED(_state)) {194WITH_MOCK_MALLOC(195{196cbor_item_t *array;197struct cbor_load_result res;198array = cbor_load(simple_indef_array, 4, &res);199200assert_null(array);201assert_size_equal(res.error.code, CBOR_ERR_MEMERROR);202},2034, MALLOC, MALLOC, MALLOC, REALLOC_FAIL);204}205206int main(void) {207const struct CMUnitTest tests[] = {208cmocka_unit_test(test_empty_array),209cmocka_unit_test(test_simple_array),210cmocka_unit_test(test_nested_arrays),211cmocka_unit_test(test_indef_arrays),212cmocka_unit_test(test_nested_indef_arrays),213cmocka_unit_test(test_array_replace),214cmocka_unit_test(test_array_push_overflow),215cmocka_unit_test(test_array_creation),216cmocka_unit_test(test_array_push),217cmocka_unit_test(test_indef_array_decode),218};219220return cmocka_run_group_tests(tests, NULL, NULL);221}222223224