blob: 25a32d29c408de05fc5cb5f5e1e21118455db655 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "test_cborattr.h"
/*
* Where we collect cbor data.
*/
static uint8_t test_cbor_buf[1024];
static int test_cbor_len;
/*
* CBOR encoder data structures.
*/
static int test_cbor_wr(struct cbor_encoder_writer *, const char *, int);
static CborEncoder test_encoder;
static struct cbor_encoder_writer test_writer = {
.write = test_cbor_wr
};
static int
test_cbor_wr(struct cbor_encoder_writer *cew, const char *data, int len)
{
memcpy(test_cbor_buf + test_cbor_len, data, len);
test_cbor_len += len;
assert(test_cbor_len < sizeof(test_cbor_buf));
return 0;
}
static void
test_encode_data(void)
{
CborEncoder test_data;
CborEncoder sub_obj;
test_cbor_len = 0;
cbor_encoder_init(&test_encoder, &test_writer, 0);
cbor_encoder_create_map(&test_encoder, &test_data, CborIndefiniteLength);
/*
* p: { bm : 7 }
*/
cbor_encode_text_stringz(&test_data, "p");
cbor_encoder_create_map(&test_data, &sub_obj, CborIndefiniteLength);
cbor_encode_text_stringz(&test_data, "bm");
cbor_encode_int(&test_data, 7);
cbor_encoder_close_container(&test_data, &sub_obj);
cbor_encoder_close_container(&test_encoder, &test_data);
}
static void
test_encode_data_complex(void)
{
CborEncoder test_data;
CborEncoder sub_obj;
CborEncoder sub_sub_obj;
test_cbor_len = 0;
cbor_encoder_init(&test_encoder, &test_writer, 0);
cbor_encoder_create_map(&test_encoder, &test_data, CborIndefiniteLength);
/*
* p: { bm : 7 }, c: { d : { i : 1 } }, a: 3
*/
cbor_encode_text_stringz(&test_data, "p");
cbor_encoder_create_map(&test_data, &sub_obj, CborIndefiniteLength);
cbor_encode_text_stringz(&test_data, "bm");
cbor_encode_int(&test_data, 7);
cbor_encoder_close_container(&test_data, &sub_obj);
cbor_encode_text_stringz(&test_data, "c");
cbor_encoder_create_map(&test_data, &sub_obj, CborIndefiniteLength);
cbor_encode_text_stringz(&sub_obj, "d");
cbor_encoder_create_map(&sub_obj, &sub_sub_obj, CborIndefiniteLength);
cbor_encode_text_stringz(&sub_sub_obj, "i");
cbor_encode_int(&sub_sub_obj, 1);
cbor_encoder_close_container(&sub_obj, &sub_sub_obj);
cbor_encoder_close_container(&test_data, &sub_obj);
cbor_encode_text_stringz(&test_data, "a");
cbor_encode_int(&test_data, 3);
cbor_encoder_close_container(&test_encoder, &test_data);
}
/*
* Simple decoding.
*/
TEST_CASE(test_cborattr_decode_object)
{
int rc;
int64_t bm_val = 0;
struct cbor_attr_t test_sub_attr_bm[] = {
[0] = {
.attribute = "bm",
.type = CborAttrIntegerType,
.addr.integer = &bm_val,
.nodefault = true
},
[1] = {
.attribute = NULL
}
};
struct cbor_attr_t test_attrs[] = {
[0] = {
.attribute = "p",
.type = CborAttrObjectType,
.addr.obj = test_sub_attr_bm,
.nodefault = true
},
[1] = {
.attribute = NULL
}
};
int64_t a_val = 0;
int64_t i_val = 0;
struct cbor_attr_t test_sub_sub_attr[] = {
[0] = {
.attribute = "i",
.type = CborAttrIntegerType,
.addr.integer = &i_val,
.nodefault = true
},
[1] = {
.attribute = NULL
}
};
struct cbor_attr_t test_sub_attr_d[] = {
[0] = {
.attribute = "d",
.type = CborAttrObjectType,
.addr.obj = test_sub_sub_attr,
.nodefault = true
},
[1] = {
.attribute = NULL
}
};
struct cbor_attr_t test_attr_complex[] = {
[0] = {
.attribute = "c",
.type = CborAttrObjectType,
.addr.obj = test_sub_attr_d,
.nodefault = true
},
[1] = {
.attribute = "a",
.type = CborAttrIntegerType,
.addr.integer = &a_val,
.nodefault = true
},
[2] = {
.attribute = "p",
.type = CborAttrObjectType,
.addr.obj = test_sub_attr_bm,
.nodefault = true
},
[3] = {
.attribute = NULL
}
};
test_encode_data();
rc = cbor_read_flat_attrs(test_cbor_buf, test_cbor_len, test_attrs);
TEST_ASSERT(rc == 0);
TEST_ASSERT(bm_val == 7);
test_encode_data_complex();
bm_val = 0;
i_val = 0;
rc = cbor_read_flat_attrs(test_cbor_buf, test_cbor_len, test_attr_complex);
TEST_ASSERT(rc == 0);
TEST_ASSERT(bm_val == 7);
TEST_ASSERT(i_val == 1);
}