xref: /freebsd/contrib/libcbor/test/copy_test.c (revision 5d3e7166)
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 
810ff414cSEd Maste #include "assertions.h"
910ff414cSEd Maste #include "cbor.h"
10*5d3e7166SEd Maste #include "test_allocator.h"
1110ff414cSEd Maste 
1210ff414cSEd Maste cbor_item_t *item, *copy, *tmp;
1310ff414cSEd Maste 
test_uints(void ** _CBOR_UNUSED (_state))14*5d3e7166SEd Maste static void test_uints(void **_CBOR_UNUSED(_state)) {
1510ff414cSEd Maste   item = cbor_build_uint8(10);
1610ff414cSEd Maste   assert_uint8(copy = cbor_copy(item), 10);
1710ff414cSEd Maste   cbor_decref(&item);
1810ff414cSEd Maste   cbor_decref(&copy);
1910ff414cSEd Maste 
2010ff414cSEd Maste   item = cbor_build_uint16(10);
2110ff414cSEd Maste   assert_uint16(copy = cbor_copy(item), 10);
2210ff414cSEd Maste   cbor_decref(&item);
2310ff414cSEd Maste   cbor_decref(&copy);
2410ff414cSEd Maste 
2510ff414cSEd Maste   item = cbor_build_uint32(10);
2610ff414cSEd Maste   assert_uint32(copy = cbor_copy(item), 10);
2710ff414cSEd Maste   cbor_decref(&item);
2810ff414cSEd Maste   cbor_decref(&copy);
2910ff414cSEd Maste 
3010ff414cSEd Maste   item = cbor_build_uint64(10);
3110ff414cSEd Maste   assert_uint64(copy = cbor_copy(item), 10);
3210ff414cSEd Maste   cbor_decref(&item);
3310ff414cSEd Maste   cbor_decref(&copy);
3410ff414cSEd Maste }
3510ff414cSEd Maste 
test_negints(void ** _CBOR_UNUSED (_state))36*5d3e7166SEd Maste static void test_negints(void **_CBOR_UNUSED(_state)) {
3710ff414cSEd Maste   item = cbor_build_negint8(10);
3810ff414cSEd Maste   assert_true(cbor_get_uint8(copy = cbor_copy(item)) == 10);
3910ff414cSEd Maste   cbor_decref(&item);
4010ff414cSEd Maste   cbor_decref(&copy);
4110ff414cSEd Maste 
4210ff414cSEd Maste   item = cbor_build_negint16(10);
4310ff414cSEd Maste   assert_true(cbor_get_uint16(copy = cbor_copy(item)) == 10);
4410ff414cSEd Maste   cbor_decref(&item);
4510ff414cSEd Maste   cbor_decref(&copy);
4610ff414cSEd Maste 
4710ff414cSEd Maste   item = cbor_build_negint32(10);
4810ff414cSEd Maste   assert_true(cbor_get_uint32(copy = cbor_copy(item)) == 10);
4910ff414cSEd Maste   cbor_decref(&item);
5010ff414cSEd Maste   cbor_decref(&copy);
5110ff414cSEd Maste 
5210ff414cSEd Maste   item = cbor_build_negint64(10);
5310ff414cSEd Maste   assert_true(cbor_get_uint64(copy = cbor_copy(item)) == 10);
5410ff414cSEd Maste   cbor_decref(&item);
5510ff414cSEd Maste   cbor_decref(&copy);
5610ff414cSEd Maste }
5710ff414cSEd Maste 
test_def_bytestring(void ** _CBOR_UNUSED (_state))58*5d3e7166SEd Maste static void test_def_bytestring(void **_CBOR_UNUSED(_state)) {
5910ff414cSEd Maste   item = cbor_build_bytestring((cbor_data) "abc", 3);
6010ff414cSEd Maste   assert_memory_equal(cbor_bytestring_handle(copy = cbor_copy(item)),
6110ff414cSEd Maste                       cbor_bytestring_handle(item), 3);
6210ff414cSEd Maste   cbor_decref(&item);
6310ff414cSEd Maste   cbor_decref(&copy);
6410ff414cSEd Maste }
6510ff414cSEd Maste 
test_indef_bytestring(void ** _CBOR_UNUSED (_state))66*5d3e7166SEd Maste static void test_indef_bytestring(void **_CBOR_UNUSED(_state)) {
6710ff414cSEd Maste   item = cbor_new_indefinite_bytestring();
68*5d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
69*5d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "abc", 3))));
7010ff414cSEd Maste   copy = cbor_copy(item);
7110ff414cSEd Maste 
72*5d3e7166SEd Maste   assert_size_equal(cbor_bytestring_chunk_count(item),
7310ff414cSEd Maste                     cbor_bytestring_chunk_count(copy));
7410ff414cSEd Maste 
7510ff414cSEd Maste   assert_memory_equal(
7610ff414cSEd Maste       cbor_bytestring_handle(cbor_bytestring_chunks_handle(copy)[0]), "abc", 3);
7710ff414cSEd Maste   cbor_decref(&item);
7810ff414cSEd Maste   cbor_decref(&copy);
7910ff414cSEd Maste }
8010ff414cSEd Maste 
test_def_string(void ** _CBOR_UNUSED (_state))81*5d3e7166SEd Maste static void test_def_string(void **_CBOR_UNUSED(_state)) {
8210ff414cSEd Maste   item = cbor_build_string("abc");
8310ff414cSEd Maste   assert_memory_equal(cbor_string_handle(copy = cbor_copy(item)),
8410ff414cSEd Maste                       cbor_string_handle(item), 3);
8510ff414cSEd Maste   cbor_decref(&item);
8610ff414cSEd Maste   cbor_decref(&copy);
8710ff414cSEd Maste }
8810ff414cSEd Maste 
test_indef_string(void ** _CBOR_UNUSED (_state))89*5d3e7166SEd Maste static void test_indef_string(void **_CBOR_UNUSED(_state)) {
9010ff414cSEd Maste   item = cbor_new_indefinite_string();
91*5d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string("abc"))));
9210ff414cSEd Maste   copy = cbor_copy(item);
9310ff414cSEd Maste 
94*5d3e7166SEd Maste   assert_size_equal(cbor_string_chunk_count(item),
9510ff414cSEd Maste                     cbor_string_chunk_count(copy));
9610ff414cSEd Maste 
9710ff414cSEd Maste   assert_memory_equal(cbor_string_handle(cbor_string_chunks_handle(copy)[0]),
9810ff414cSEd Maste                       "abc", 3);
9910ff414cSEd Maste   cbor_decref(&item);
10010ff414cSEd Maste   cbor_decref(&copy);
10110ff414cSEd Maste }
10210ff414cSEd Maste 
test_def_array(void ** _CBOR_UNUSED (_state))103*5d3e7166SEd Maste static void test_def_array(void **_CBOR_UNUSED(_state)) {
10410ff414cSEd Maste   item = cbor_new_definite_array(1);
105*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(42))));
10610ff414cSEd Maste 
10710ff414cSEd Maste   assert_uint8(tmp = cbor_array_get(copy = cbor_copy(item), 0), 42);
10810ff414cSEd Maste   cbor_decref(&item);
10910ff414cSEd Maste   cbor_decref(&copy);
11010ff414cSEd Maste   cbor_decref(&tmp);
11110ff414cSEd Maste }
11210ff414cSEd Maste 
test_indef_array(void ** _CBOR_UNUSED (_state))113*5d3e7166SEd Maste static void test_indef_array(void **_CBOR_UNUSED(_state)) {
11410ff414cSEd Maste   item = cbor_new_indefinite_array();
115*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(42))));
11610ff414cSEd Maste 
11710ff414cSEd Maste   assert_uint8(tmp = cbor_array_get(copy = cbor_copy(item), 0), 42);
11810ff414cSEd Maste   cbor_decref(&item);
11910ff414cSEd Maste   cbor_decref(&copy);
12010ff414cSEd Maste   cbor_decref(&tmp);
12110ff414cSEd Maste }
12210ff414cSEd Maste 
test_def_map(void ** _CBOR_UNUSED (_state))123*5d3e7166SEd Maste static void test_def_map(void **_CBOR_UNUSED(_state)) {
12410ff414cSEd Maste   item = cbor_new_definite_map(1);
125*5d3e7166SEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){
12610ff414cSEd Maste                                      .key = cbor_move(cbor_build_uint8(42)),
12710ff414cSEd Maste                                      .value = cbor_move(cbor_build_uint8(43)),
128*5d3e7166SEd Maste                                  }));
12910ff414cSEd Maste 
13010ff414cSEd Maste   assert_uint8(cbor_map_handle(copy = cbor_copy(item))[0].key, 42);
13110ff414cSEd Maste 
13210ff414cSEd Maste   cbor_decref(&item);
13310ff414cSEd Maste   cbor_decref(&copy);
13410ff414cSEd Maste }
13510ff414cSEd Maste 
test_indef_map(void ** _CBOR_UNUSED (_state))136*5d3e7166SEd Maste static void test_indef_map(void **_CBOR_UNUSED(_state)) {
137*5d3e7166SEd Maste   item = cbor_new_indefinite_map();
138*5d3e7166SEd Maste   assert_true(cbor_map_add(item, (struct cbor_pair){
13910ff414cSEd Maste                                      .key = cbor_move(cbor_build_uint8(42)),
14010ff414cSEd Maste                                      .value = cbor_move(cbor_build_uint8(43)),
141*5d3e7166SEd Maste                                  }));
14210ff414cSEd Maste 
14310ff414cSEd Maste   assert_uint8(cbor_map_handle(copy = cbor_copy(item))[0].key, 42);
14410ff414cSEd Maste 
14510ff414cSEd Maste   cbor_decref(&item);
14610ff414cSEd Maste   cbor_decref(&copy);
14710ff414cSEd Maste }
14810ff414cSEd Maste 
test_tag(void ** _CBOR_UNUSED (_state))149*5d3e7166SEd Maste static void test_tag(void **_CBOR_UNUSED(_state)) {
15010ff414cSEd Maste   item = cbor_build_tag(10, cbor_move(cbor_build_uint8(42)));
15110ff414cSEd Maste 
15210ff414cSEd Maste   assert_uint8(cbor_move(cbor_tag_item(copy = cbor_copy(item))), 42);
15310ff414cSEd Maste 
15410ff414cSEd Maste   cbor_decref(&item);
15510ff414cSEd Maste   cbor_decref(&copy);
15610ff414cSEd Maste }
15710ff414cSEd Maste 
test_ctrls(void ** _CBOR_UNUSED (_state))158*5d3e7166SEd Maste static void test_ctrls(void **_CBOR_UNUSED(_state)) {
15910ff414cSEd Maste   item = cbor_new_null();
16010ff414cSEd Maste   assert_true(cbor_is_null(copy = cbor_copy(item)));
16110ff414cSEd Maste   cbor_decref(&item);
16210ff414cSEd Maste   cbor_decref(&copy);
16310ff414cSEd Maste }
16410ff414cSEd Maste 
test_floats(void ** _CBOR_UNUSED (_state))165*5d3e7166SEd Maste static void test_floats(void **_CBOR_UNUSED(_state)) {
16610ff414cSEd Maste   item = cbor_build_float2(3.14f);
16710ff414cSEd Maste   assert_true(cbor_float_get_float2(copy = cbor_copy(item)) ==
16810ff414cSEd Maste               cbor_float_get_float2(item));
16910ff414cSEd Maste   cbor_decref(&item);
17010ff414cSEd Maste   cbor_decref(&copy);
17110ff414cSEd Maste 
17210ff414cSEd Maste   item = cbor_build_float4(3.14f);
17310ff414cSEd Maste   assert_true(cbor_float_get_float4(copy = cbor_copy(item)) ==
17410ff414cSEd Maste               cbor_float_get_float4(item));
17510ff414cSEd Maste   cbor_decref(&item);
17610ff414cSEd Maste   cbor_decref(&copy);
17710ff414cSEd Maste 
17810ff414cSEd Maste   item = cbor_build_float8(3.14);
17910ff414cSEd Maste   assert_true(cbor_float_get_float8(copy = cbor_copy(item)) ==
18010ff414cSEd Maste               cbor_float_get_float8(item));
18110ff414cSEd Maste   cbor_decref(&item);
18210ff414cSEd Maste   cbor_decref(&copy);
18310ff414cSEd Maste }
18410ff414cSEd Maste 
test_alloc_failure_simple(void ** _CBOR_UNUSED (_state))185*5d3e7166SEd Maste static void test_alloc_failure_simple(void **_CBOR_UNUSED(_state)) {
186*5d3e7166SEd Maste   item = cbor_build_uint8(10);
187*5d3e7166SEd Maste 
188*5d3e7166SEd Maste   WITH_FAILING_MALLOC({ assert_null(cbor_copy(item)); });
189*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
190*5d3e7166SEd Maste 
191*5d3e7166SEd Maste   cbor_decref(&item);
192*5d3e7166SEd Maste }
193*5d3e7166SEd Maste 
test_bytestring_alloc_failure(void ** _CBOR_UNUSED (_state))194*5d3e7166SEd Maste static void test_bytestring_alloc_failure(void **_CBOR_UNUSED(_state)) {
195*5d3e7166SEd Maste   item = cbor_new_indefinite_bytestring();
196*5d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
197*5d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "abc", 3))));
198*5d3e7166SEd Maste 
199*5d3e7166SEd Maste   WITH_FAILING_MALLOC({ assert_null(cbor_copy(item)); });
200*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
201*5d3e7166SEd Maste 
202*5d3e7166SEd Maste   cbor_decref(&item);
203*5d3e7166SEd Maste }
204*5d3e7166SEd Maste 
test_bytestring_chunk_alloc_failure(void ** _CBOR_UNUSED (_state))205*5d3e7166SEd Maste static void test_bytestring_chunk_alloc_failure(void **_CBOR_UNUSED(_state)) {
206*5d3e7166SEd Maste   item = cbor_new_indefinite_bytestring();
207*5d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
208*5d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "abc", 3))));
209*5d3e7166SEd Maste 
210*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 2, MALLOC, MALLOC_FAIL);
211*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
212*5d3e7166SEd Maste 
213*5d3e7166SEd Maste   cbor_decref(&item);
214*5d3e7166SEd Maste }
215*5d3e7166SEd Maste 
test_bytestring_chunk_append_failure(void ** _CBOR_UNUSED (_state))216*5d3e7166SEd Maste static void test_bytestring_chunk_append_failure(void **_CBOR_UNUSED(_state)) {
217*5d3e7166SEd Maste   item = cbor_new_indefinite_bytestring();
218*5d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
219*5d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "abc", 3))));
220*5d3e7166SEd Maste 
221*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 5,
222*5d3e7166SEd Maste                    // New indef string, cbor_indefinite_string_data, chunk item,
223*5d3e7166SEd Maste                    // chunk data, extend cbor_indefinite_string_data.chunks
224*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC, MALLOC, REALLOC_FAIL);
225*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
226*5d3e7166SEd Maste 
227*5d3e7166SEd Maste   cbor_decref(&item);
228*5d3e7166SEd Maste }
229*5d3e7166SEd Maste 
test_bytestring_second_chunk_alloc_failure(void ** _CBOR_UNUSED (_state))230*5d3e7166SEd Maste static void test_bytestring_second_chunk_alloc_failure(
231*5d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
232*5d3e7166SEd Maste   item = cbor_new_indefinite_bytestring();
233*5d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
234*5d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "abc", 3))));
235*5d3e7166SEd Maste   assert_true(cbor_bytestring_add_chunk(
236*5d3e7166SEd Maste       item, cbor_move(cbor_build_bytestring((cbor_data) "def", 3))));
237*5d3e7166SEd Maste 
238*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 6,
239*5d3e7166SEd Maste                    // New indef string, cbor_indefinite_string_data, chunk item,
240*5d3e7166SEd Maste                    // chunk data, extend cbor_indefinite_string_data.chunks,
241*5d3e7166SEd Maste                    // second chunk item
242*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC, MALLOC, REALLOC, MALLOC_FAIL);
243*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
244*5d3e7166SEd Maste 
245*5d3e7166SEd Maste   cbor_decref(&item);
246*5d3e7166SEd Maste }
247*5d3e7166SEd Maste 
test_string_alloc_failure(void ** _CBOR_UNUSED (_state))248*5d3e7166SEd Maste static void test_string_alloc_failure(void **_CBOR_UNUSED(_state)) {
249*5d3e7166SEd Maste   item = cbor_new_indefinite_string();
250*5d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string("abc"))));
251*5d3e7166SEd Maste 
252*5d3e7166SEd Maste   WITH_FAILING_MALLOC({ assert_null(cbor_copy(item)); });
253*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
254*5d3e7166SEd Maste 
255*5d3e7166SEd Maste   cbor_decref(&item);
256*5d3e7166SEd Maste }
257*5d3e7166SEd Maste 
test_string_chunk_alloc_failure(void ** _CBOR_UNUSED (_state))258*5d3e7166SEd Maste static void test_string_chunk_alloc_failure(void **_CBOR_UNUSED(_state)) {
259*5d3e7166SEd Maste   item = cbor_new_indefinite_string();
260*5d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string("abc"))));
261*5d3e7166SEd Maste 
262*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 2, MALLOC, MALLOC_FAIL);
263*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
264*5d3e7166SEd Maste 
265*5d3e7166SEd Maste   cbor_decref(&item);
266*5d3e7166SEd Maste }
267*5d3e7166SEd Maste 
test_string_chunk_append_failure(void ** _CBOR_UNUSED (_state))268*5d3e7166SEd Maste static void test_string_chunk_append_failure(void **_CBOR_UNUSED(_state)) {
269*5d3e7166SEd Maste   item = cbor_new_indefinite_string();
270*5d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string("abc"))));
271*5d3e7166SEd Maste 
272*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 5,
273*5d3e7166SEd Maste                    // New indef string, cbor_indefinite_string_data, chunk item,
274*5d3e7166SEd Maste                    // chunk data, extend cbor_indefinite_string_data.chunks
275*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC, MALLOC, REALLOC_FAIL);
276*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
277*5d3e7166SEd Maste 
278*5d3e7166SEd Maste   cbor_decref(&item);
279*5d3e7166SEd Maste }
280*5d3e7166SEd Maste 
test_string_second_chunk_alloc_failure(void ** _CBOR_UNUSED (_state))281*5d3e7166SEd Maste static void test_string_second_chunk_alloc_failure(
282*5d3e7166SEd Maste     void **_CBOR_UNUSED(_state)) {
283*5d3e7166SEd Maste   item = cbor_new_indefinite_string();
284*5d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string("abc"))));
285*5d3e7166SEd Maste   assert_true(cbor_string_add_chunk(item, cbor_move(cbor_build_string("def"))));
286*5d3e7166SEd Maste 
287*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 6,
288*5d3e7166SEd Maste                    // New indef string, cbor_indefinite_string_data, chunk item,
289*5d3e7166SEd Maste                    // chunk data, extend cbor_indefinite_string_data.chunks,
290*5d3e7166SEd Maste                    // second chunk item
291*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC, MALLOC, REALLOC, MALLOC_FAIL);
292*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
293*5d3e7166SEd Maste 
294*5d3e7166SEd Maste   cbor_decref(&item);
295*5d3e7166SEd Maste }
296*5d3e7166SEd Maste 
test_array_alloc_failure(void ** _CBOR_UNUSED (_state))297*5d3e7166SEd Maste static void test_array_alloc_failure(void **_CBOR_UNUSED(_state)) {
298*5d3e7166SEd Maste   item = cbor_new_indefinite_array();
299*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(42))));
300*5d3e7166SEd Maste 
301*5d3e7166SEd Maste   WITH_FAILING_MALLOC({ assert_null(cbor_copy(item)); });
302*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
303*5d3e7166SEd Maste 
304*5d3e7166SEd Maste   cbor_decref(&item);
305*5d3e7166SEd Maste }
306*5d3e7166SEd Maste 
test_array_item_alloc_failure(void ** _CBOR_UNUSED (_state))307*5d3e7166SEd Maste static void test_array_item_alloc_failure(void **_CBOR_UNUSED(_state)) {
308*5d3e7166SEd Maste   item = cbor_new_indefinite_array();
309*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(42))));
310*5d3e7166SEd Maste 
311*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 2,
312*5d3e7166SEd Maste                    // New array, item copy
313*5d3e7166SEd Maste                    MALLOC, MALLOC_FAIL);
314*5d3e7166SEd Maste 
315*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
316*5d3e7166SEd Maste 
317*5d3e7166SEd Maste   cbor_decref(&item);
318*5d3e7166SEd Maste }
319*5d3e7166SEd Maste 
test_array_push_failure(void ** _CBOR_UNUSED (_state))320*5d3e7166SEd Maste static void test_array_push_failure(void **_CBOR_UNUSED(_state)) {
321*5d3e7166SEd Maste   item = cbor_new_indefinite_array();
322*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(42))));
323*5d3e7166SEd Maste 
324*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 3,
325*5d3e7166SEd Maste                    // New array, item copy, array reallocation
326*5d3e7166SEd Maste                    MALLOC, MALLOC, REALLOC_FAIL);
327*5d3e7166SEd Maste 
328*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
329*5d3e7166SEd Maste 
330*5d3e7166SEd Maste   cbor_decref(&item);
331*5d3e7166SEd Maste }
332*5d3e7166SEd Maste 
test_array_second_item_alloc_failure(void ** _CBOR_UNUSED (_state))333*5d3e7166SEd Maste static void test_array_second_item_alloc_failure(void **_CBOR_UNUSED(_state)) {
334*5d3e7166SEd Maste   item = cbor_new_indefinite_array();
335*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(42))));
336*5d3e7166SEd Maste   assert_true(cbor_array_push(item, cbor_move(cbor_build_uint8(43))));
337*5d3e7166SEd Maste 
338*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 4,
339*5d3e7166SEd Maste                    // New array, item copy, array reallocation, second item copy
340*5d3e7166SEd Maste                    MALLOC, MALLOC, REALLOC, MALLOC_FAIL);
341*5d3e7166SEd Maste 
342*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
343*5d3e7166SEd Maste 
344*5d3e7166SEd Maste   cbor_decref(&item);
345*5d3e7166SEd Maste }
346*5d3e7166SEd Maste 
test_map_alloc_failure(void ** _CBOR_UNUSED (_state))347*5d3e7166SEd Maste static void test_map_alloc_failure(void **_CBOR_UNUSED(_state)) {
348*5d3e7166SEd Maste   item = cbor_new_indefinite_map();
349*5d3e7166SEd Maste   assert_true(
350*5d3e7166SEd Maste       cbor_map_add(item, (struct cbor_pair){cbor_move(cbor_build_uint8(42)),
351*5d3e7166SEd Maste                                             cbor_move(cbor_build_bool(true))}));
352*5d3e7166SEd Maste 
353*5d3e7166SEd Maste   WITH_FAILING_MALLOC({ assert_null(cbor_copy(item)); });
354*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
355*5d3e7166SEd Maste 
356*5d3e7166SEd Maste   cbor_decref(&item);
357*5d3e7166SEd Maste }
358*5d3e7166SEd Maste 
test_map_key_alloc_failure(void ** _CBOR_UNUSED (_state))359*5d3e7166SEd Maste static void test_map_key_alloc_failure(void **_CBOR_UNUSED(_state)) {
360*5d3e7166SEd Maste   item = cbor_new_indefinite_map();
361*5d3e7166SEd Maste   assert_true(
362*5d3e7166SEd Maste       cbor_map_add(item, (struct cbor_pair){cbor_move(cbor_build_uint8(42)),
363*5d3e7166SEd Maste                                             cbor_move(cbor_build_bool(true))}));
364*5d3e7166SEd Maste 
365*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 2,
366*5d3e7166SEd Maste                    // New map, key copy
367*5d3e7166SEd Maste                    MALLOC, MALLOC_FAIL);
368*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
369*5d3e7166SEd Maste 
370*5d3e7166SEd Maste   cbor_decref(&item);
371*5d3e7166SEd Maste }
372*5d3e7166SEd Maste 
test_map_value_alloc_failure(void ** _CBOR_UNUSED (_state))373*5d3e7166SEd Maste static void test_map_value_alloc_failure(void **_CBOR_UNUSED(_state)) {
374*5d3e7166SEd Maste   item = cbor_new_indefinite_map();
375*5d3e7166SEd Maste   assert_true(
376*5d3e7166SEd Maste       cbor_map_add(item, (struct cbor_pair){cbor_move(cbor_build_uint8(42)),
377*5d3e7166SEd Maste                                             cbor_move(cbor_build_bool(true))}));
378*5d3e7166SEd Maste 
379*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 3,
380*5d3e7166SEd Maste                    // New map, key copy, value copy
381*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC_FAIL);
382*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
383*5d3e7166SEd Maste 
384*5d3e7166SEd Maste   cbor_decref(&item);
385*5d3e7166SEd Maste }
386*5d3e7166SEd Maste 
test_map_add_failure(void ** _CBOR_UNUSED (_state))387*5d3e7166SEd Maste static void test_map_add_failure(void **_CBOR_UNUSED(_state)) {
388*5d3e7166SEd Maste   item = cbor_new_indefinite_map();
389*5d3e7166SEd Maste   assert_true(
390*5d3e7166SEd Maste       cbor_map_add(item, (struct cbor_pair){cbor_move(cbor_build_uint8(42)),
391*5d3e7166SEd Maste                                             cbor_move(cbor_build_bool(true))}));
392*5d3e7166SEd Maste 
393*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 4,
394*5d3e7166SEd Maste                    // New map, key copy, value copy, add
395*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC, REALLOC_FAIL);
396*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
397*5d3e7166SEd Maste 
398*5d3e7166SEd Maste   cbor_decref(&item);
399*5d3e7166SEd Maste }
400*5d3e7166SEd Maste 
test_map_second_key_failure(void ** _CBOR_UNUSED (_state))401*5d3e7166SEd Maste static void test_map_second_key_failure(void **_CBOR_UNUSED(_state)) {
402*5d3e7166SEd Maste   item = cbor_new_indefinite_map();
403*5d3e7166SEd Maste   assert_true(
404*5d3e7166SEd Maste       cbor_map_add(item, (struct cbor_pair){cbor_move(cbor_build_uint8(42)),
405*5d3e7166SEd Maste                                             cbor_move(cbor_build_bool(true))}));
406*5d3e7166SEd Maste   assert_true(cbor_map_add(
407*5d3e7166SEd Maste       item, (struct cbor_pair){cbor_move(cbor_build_uint8(43)),
408*5d3e7166SEd Maste                                cbor_move(cbor_build_bool(false))}));
409*5d3e7166SEd Maste 
410*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 5,
411*5d3e7166SEd Maste                    // New map, key copy, value copy, add, second key copy
412*5d3e7166SEd Maste                    MALLOC, MALLOC, MALLOC, REALLOC, MALLOC_FAIL);
413*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
414*5d3e7166SEd Maste 
415*5d3e7166SEd Maste   cbor_decref(&item);
416*5d3e7166SEd Maste }
417*5d3e7166SEd Maste 
test_tag_item_alloc_failure(void ** _CBOR_UNUSED (_state))418*5d3e7166SEd Maste static void test_tag_item_alloc_failure(void **_CBOR_UNUSED(_state)) {
419*5d3e7166SEd Maste   item = cbor_build_tag(1, cbor_move(cbor_build_uint8(42)));
420*5d3e7166SEd Maste 
421*5d3e7166SEd Maste   WITH_FAILING_MALLOC({ assert_null(cbor_copy(item)); });
422*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
423*5d3e7166SEd Maste 
424*5d3e7166SEd Maste   cbor_decref(&item);
425*5d3e7166SEd Maste }
426*5d3e7166SEd Maste 
test_tag_alloc_failure(void ** _CBOR_UNUSED (_state))427*5d3e7166SEd Maste static void test_tag_alloc_failure(void **_CBOR_UNUSED(_state)) {
428*5d3e7166SEd Maste   item = cbor_build_tag(1, cbor_move(cbor_build_uint8(42)));
429*5d3e7166SEd Maste 
430*5d3e7166SEd Maste   WITH_MOCK_MALLOC({ assert_null(cbor_copy(item)); }, 2,
431*5d3e7166SEd Maste                    // Item copy, tag
432*5d3e7166SEd Maste                    MALLOC, MALLOC_FAIL);
433*5d3e7166SEd Maste   assert_size_equal(cbor_refcount(item), 1);
434*5d3e7166SEd Maste 
435*5d3e7166SEd Maste   cbor_decref(&item);
436*5d3e7166SEd Maste }
437*5d3e7166SEd Maste 
main(void)43810ff414cSEd Maste int main(void) {
43910ff414cSEd Maste   const struct CMUnitTest tests[] = {
44010ff414cSEd Maste       cmocka_unit_test(test_uints),
44110ff414cSEd Maste       cmocka_unit_test(test_negints),
44210ff414cSEd Maste       cmocka_unit_test(test_def_bytestring),
44310ff414cSEd Maste       cmocka_unit_test(test_indef_bytestring),
44410ff414cSEd Maste       cmocka_unit_test(test_def_string),
44510ff414cSEd Maste       cmocka_unit_test(test_indef_string),
44610ff414cSEd Maste       cmocka_unit_test(test_def_array),
44710ff414cSEd Maste       cmocka_unit_test(test_indef_array),
44810ff414cSEd Maste       cmocka_unit_test(test_def_map),
44910ff414cSEd Maste       cmocka_unit_test(test_indef_map),
45010ff414cSEd Maste       cmocka_unit_test(test_tag),
45110ff414cSEd Maste       cmocka_unit_test(test_ctrls),
452*5d3e7166SEd Maste       cmocka_unit_test(test_floats),
453*5d3e7166SEd Maste       cmocka_unit_test(test_alloc_failure_simple),
454*5d3e7166SEd Maste       cmocka_unit_test(test_bytestring_alloc_failure),
455*5d3e7166SEd Maste       cmocka_unit_test(test_bytestring_chunk_alloc_failure),
456*5d3e7166SEd Maste       cmocka_unit_test(test_bytestring_chunk_append_failure),
457*5d3e7166SEd Maste       cmocka_unit_test(test_bytestring_second_chunk_alloc_failure),
458*5d3e7166SEd Maste       cmocka_unit_test(test_string_alloc_failure),
459*5d3e7166SEd Maste       cmocka_unit_test(test_string_chunk_alloc_failure),
460*5d3e7166SEd Maste       cmocka_unit_test(test_string_chunk_append_failure),
461*5d3e7166SEd Maste       cmocka_unit_test(test_string_second_chunk_alloc_failure),
462*5d3e7166SEd Maste       cmocka_unit_test(test_array_alloc_failure),
463*5d3e7166SEd Maste       cmocka_unit_test(test_array_item_alloc_failure),
464*5d3e7166SEd Maste       cmocka_unit_test(test_array_push_failure),
465*5d3e7166SEd Maste       cmocka_unit_test(test_array_second_item_alloc_failure),
466*5d3e7166SEd Maste       cmocka_unit_test(test_map_alloc_failure),
467*5d3e7166SEd Maste       cmocka_unit_test(test_map_key_alloc_failure),
468*5d3e7166SEd Maste       cmocka_unit_test(test_map_value_alloc_failure),
469*5d3e7166SEd Maste       cmocka_unit_test(test_map_add_failure),
470*5d3e7166SEd Maste       cmocka_unit_test(test_map_second_key_failure),
471*5d3e7166SEd Maste       cmocka_unit_test(test_tag_item_alloc_failure),
472*5d3e7166SEd Maste       cmocka_unit_test(test_tag_alloc_failure),
473*5d3e7166SEd Maste   };
47410ff414cSEd Maste   return cmocka_run_group_tests(tests, NULL, NULL);
47510ff414cSEd Maste }
476