/*
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/kernel.h>
#include <zephyr/ztest.h>

#include "lwm2m_util.h"
#include "lwm2m_rw_senml_cbor.h"
#include "lwm2m_engine.h"

#define TEST_OBJ_ID 0xFFFF
#define TEST_OBJ_INST_ID 0

#define TEST_RES_S8 0
#define TEST_RES_S16 1
#define TEST_RES_S32 2
#define TEST_RES_S64 3
#define TEST_RES_STRING 4
#define TEST_RES_FLOAT 5
#define TEST_RES_BOOL 6
#define TEST_RES_OBJLNK 7
#define TEST_RES_OPAQUE 8
#define TEST_RES_TIME 9

#define TEST_OBJ_RES_MAX_ID 10

#define TEST_MAX_PAYLOAD_BUFFER_LENGTH 40

static struct lwm2m_engine_obj test_obj;

struct test_payload_buffer {
	uint8_t data[TEST_MAX_PAYLOAD_BUFFER_LENGTH];
	size_t len;
};

static struct lwm2m_engine_obj_field test_fields[] = {
	OBJ_FIELD_DATA(TEST_RES_S8, RW, S8),
	OBJ_FIELD_DATA(TEST_RES_S16, RW, S16),
	OBJ_FIELD_DATA(TEST_RES_S32, RW, S32),
	OBJ_FIELD_DATA(TEST_RES_S64, RW, S64),
	OBJ_FIELD_DATA(TEST_RES_STRING, RW, STRING),
	OBJ_FIELD_DATA(TEST_RES_FLOAT, RW, FLOAT),
	OBJ_FIELD_DATA(TEST_RES_BOOL, RW, BOOL),
	OBJ_FIELD_DATA(TEST_RES_OBJLNK, RW, OBJLNK),
	OBJ_FIELD_DATA(TEST_RES_OPAQUE, RW, OPAQUE),
	OBJ_FIELD_DATA(TEST_RES_TIME, RW, TIME)
};

static struct lwm2m_engine_obj_inst test_inst;
static struct lwm2m_engine_res test_res[TEST_OBJ_RES_MAX_ID];
static struct lwm2m_engine_res_inst test_res_inst[TEST_OBJ_RES_MAX_ID];

#define TEST_STRING_MAX_SIZE 16
#define TEST_OPAQUE_MAX_SIZE 11

static int8_t test_s8;
static int16_t test_s16;
static int32_t test_s32;
static int64_t test_s64;
static char test_string[TEST_STRING_MAX_SIZE];
static double test_float;
static bool test_bool;
static struct lwm2m_objlnk test_objlnk;
static uint8_t test_opaque[TEST_OPAQUE_MAX_SIZE];
static time_t test_time;

static struct lwm2m_engine_obj_inst *test_obj_create(uint16_t obj_inst_id)
{
	int i = 0, j = 0;

	init_res_instance(test_res_inst, ARRAY_SIZE(test_res_inst));

	INIT_OBJ_RES_DATA(TEST_RES_S8, test_res, i, test_res_inst, j,
			  &test_s8, sizeof(test_s8));
	INIT_OBJ_RES_DATA(TEST_RES_S16, test_res, i, test_res_inst, j,
			  &test_s16, sizeof(test_s16));
	INIT_OBJ_RES_DATA(TEST_RES_S32, test_res, i, test_res_inst, j,
			  &test_s32, sizeof(test_s32));
	INIT_OBJ_RES_DATA(TEST_RES_S64, test_res, i, test_res_inst, j,
			  &test_s64, sizeof(test_s64));
	INIT_OBJ_RES_DATA(TEST_RES_STRING, test_res, i, test_res_inst, j,
			  &test_string, sizeof(test_string));
	INIT_OBJ_RES_DATA(TEST_RES_FLOAT, test_res, i, test_res_inst, j,
			  &test_float, sizeof(test_float));
	INIT_OBJ_RES_DATA(TEST_RES_BOOL, test_res, i, test_res_inst, j,
			  &test_bool, sizeof(test_bool));
	INIT_OBJ_RES_DATA(TEST_RES_OBJLNK, test_res, i, test_res_inst, j,
			  &test_objlnk, sizeof(test_objlnk));
	INIT_OBJ_RES_DATA(TEST_RES_OPAQUE, test_res, i, test_res_inst, j,
			  &test_opaque, sizeof(test_opaque));
	INIT_OBJ_RES_DATA(TEST_RES_TIME, test_res, i, test_res_inst, j,
			  &test_time, sizeof(test_time));

	test_inst.resources = test_res;
	test_inst.resource_count = i;

	return &test_inst;
}

static void *test_obj_init(void)
{
	struct lwm2m_engine_obj_inst *obj_inst = NULL;

	test_obj.obj_id = TEST_OBJ_ID;
	test_obj.version_major = 1;
	test_obj.version_minor = 0;
	test_obj.is_core = false;
	test_obj.fields = test_fields;
	test_obj.field_count = ARRAY_SIZE(test_fields);
	test_obj.max_instance_count = 1U;
	test_obj.create_cb = test_obj_create;

	(void)lwm2m_register_obj(&test_obj);
	(void)lwm2m_create_obj_inst(TEST_OBJ_ID, TEST_OBJ_INST_ID, &obj_inst);

	return NULL;
}

/* 2 bytes for Content Format option + payload marker */
#define TEST_PAYLOAD_OFFSET 3

static struct lwm2m_message test_msg;

static void context_reset(void)
{
	memset(&test_msg, 0, sizeof(test_msg));

	test_msg.out.writer = &senml_cbor_writer;
	test_msg.out.out_cpkt = &test_msg.cpkt;

	test_msg.in.reader = &senml_cbor_reader;
	test_msg.in.in_cpkt = &test_msg.cpkt;

	test_msg.path.level = LWM2M_PATH_LEVEL_RESOURCE;
	test_msg.path.obj_id = TEST_OBJ_ID;
	test_msg.path.obj_inst_id = TEST_OBJ_INST_ID;

	test_msg.cpkt.data = test_msg.msg_data;
	test_msg.cpkt.max_len = sizeof(test_msg.msg_data);
}

static void test_payload_set(struct test_payload_buffer payload)
{
	memcpy(test_msg.msg_data + 1, payload.data, payload.len);
	test_msg.cpkt.offset = payload.len + 1;
	test_msg.in.offset = 1;
}

static void test_prepare(void *dummy)
{
	ARG_UNUSED(dummy);
	context_reset();
}

static void test_prepare_nomem(void *dummy)
{
	ARG_UNUSED(dummy);
	context_reset();

	/* Leave some space for Content-format option */

	test_msg.cpkt.offset = sizeof(test_msg.msg_data) - TEST_PAYLOAD_OFFSET;
}

static void test_prepare_nodata(void *dummy)
{
	ARG_UNUSED(dummy);
	context_reset();
}

ZTEST(net_content_senml_cbor, test_put_s8)
{
	int ret;
	int i;
	uint16_t offset = 0;
	int8_t value[] = { 0, INT8_MAX, INT8_MIN };

	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'0',
				(0x00 << 5) | 2,
				(0x00 << 5) | 0
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'0',
				(0x00 << 5) | 2,
				(0x00 << 5) | 24,
				127
			},
			.len = 19
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'0',
				(0x00 << 5) | 2,
				(0x01 << 5) | 24,
				127
			},
			.len = 19
		},
	};

	test_msg.path.res_id = TEST_RES_S8;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_s8 = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;

		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_s8_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_S8;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_s16)
{
	int ret;
	int i;
	uint16_t offset = 0;
	int16_t value[] = { 0, INT16_MAX, INT16_MIN };

	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'1',
				(0x00 << 5) | 2,
				(0x00 << 5) | 0
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'1',
				(0x00 << 5) | 2,
				(0x00 << 5) | 25,
				127, 255
			},
			.len = 20
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'1',
				(0x00 << 5) | 2,
				(0x01 << 5) | 25,
				127, 255
			},
			.len = 20
		},
	};

	test_msg.path.res_id = TEST_RES_S16;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_s16 = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;

		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_s16_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_S16;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_s32)
{
	int ret;
	int i;
	uint16_t offset = 0;
	int32_t value[] = { 0, INT32_MAX, INT32_MIN };

	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'2',
				(0x00 << 5) | 2,
				(0x00 << 5) | 0
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'2',
				(0x00 << 5) | 2,
				(0x00 << 5) | 26,
				127, 255, 255, 255
			},
			.len = 22
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'2',
				(0x00 << 5) | 2,
				(0x01 << 5) | 26,
				127, 255, 255, 255
			},
			.len = 22
		},
	};

	test_msg.path.res_id = TEST_RES_S32;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_s32 = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;

		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_s32_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_S32;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_s64)
{
	int ret;
	int i;
	uint16_t offset = 0;
	int64_t value[] = { 1, INT64_MIN, INT64_MAX };

	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'3',
				(0x00 << 5) | 2,
				(0x00 << 5) | 1
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'3',
				(0x00 << 5) | 2,
				(0x01 << 5) | 27,
				127, 255, 255, 255, 255, 255, 255, 255
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'3',
				(0x00 << 5) | 2,
				(0x00 << 5) | 27,
				127, 255, 255, 255, 255, 255, 255, 255
			},
			.len = 26
		},
	};

	test_msg.path.res_id = TEST_RES_S64;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_s64 = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;

		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_s64_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_S64;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_string)
{
	int ret;
	struct test_payload_buffer expected_payload = {
		.data = {
			(0x04 << 5) | 1,
			(0x05 << 5) | 3,
			(0x01 << 5) | 1,
			(0x03 << 5) | 9,
			'/', '6', '5', '5', '3', '5', '/', '0', '/',
			(0x00 << 5) | 0,
			(0x03 << 5) | 1,
			'4',
			(0x00 << 5) | 3,
			(0x03 << 5) | 11,
			't', 'e', 's', 't', '_', 's', 't', 'r', 'i', 'n', 'g'
		},
		.len = 29
	};

	strcpy(test_string, "test_string");
	test_msg.path.res_id = TEST_RES_STRING;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_true(ret >= 0, "Error reported");

	zassert_mem_equal(test_msg.msg_data + TEST_PAYLOAD_OFFSET,
			 expected_payload.data, expected_payload.len,
			  "Invalid payload format");
	zassert_equal(test_msg.cpkt.offset,
		      expected_payload.len + TEST_PAYLOAD_OFFSET,
		      "Invalid packet offset");
}

ZTEST(net_content_senml_cbor_nomem, test_put_string_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_STRING;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_float)
{
	int ret;
	int i;
	uint16_t offset = 0;
	double value[] = { 0.123, -0.987, 3., -10., 2.333, -123.125 };
	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0x3F, 0xBF, 0x7C, 0xED, 0x91, 0x68, 0x72, 0xB0
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0xBF, 0xEF, 0x95, 0x81, 0x06, 0x24, 0xDD, 0x2F
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0xC0, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0x40, 0x02, 0xA9, 0xFB, 0xE7, 0x6C, 0x8B, 0x44
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0xC0, 0x5E, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00
			},
			.len = 26
		}
	};

	test_msg.path.res_id = TEST_RES_FLOAT;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_float = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;
		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_float_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_FLOAT;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_bool)
{
	int ret;
	int i;
	uint16_t offset = 0;
	bool value[] = { true, false };
	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'6',
				(0x00 << 5) | 4,
				(0x07 << 5) | 21
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'6',
				(0x00 << 5) | 4,
				(0x07 << 5) | 20
			},
			.len = 18
		}
	};

	test_msg.path.res_id = TEST_RES_BOOL;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_bool = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;

		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_bool_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_BOOL;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_objlnk)
{
	int ret;
	int i;
	uint16_t offset = 0;
	struct lwm2m_objlnk value[] = {
		{ 0, 0 }, { 1, 2 }, { LWM2M_OBJLNK_MAX_ID, LWM2M_OBJLNK_MAX_ID }
	};
	struct test_payload_buffer expected_payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'7',
				(0x03 << 5) | 3,
				'v', 'l', 'o',
				(0x03 << 5) | 3,
				'0', ':', '0',
			},
			.len = 24
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'7',
				(0x03 << 5) | 3,
				'v', 'l', 'o',
				(0x03 << 5) | 3,
				'1', ':', '2',
			},
			.len = 24
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'7',
				(0x03 << 5) | 3,
				'v', 'l', 'o',
				(0x03 << 5) | 11,
				'6', '5', '5', '3', '5', ':', '6', '5', '5', '3', '5',
			},
			.len = 32
		},
	};

	test_msg.path.res_id = TEST_RES_OBJLNK;

	for (i = 0; i < ARRAY_SIZE(expected_payload); i++) {
		test_objlnk = value[i];

		ret = do_read_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");

		offset += TEST_PAYLOAD_OFFSET;

		zassert_mem_equal(test_msg.msg_data + offset,
				  expected_payload[i].data,
				  expected_payload[i].len,
				  "Invalid payload format");

		offset += expected_payload[i].len;
		zassert_equal(test_msg.cpkt.offset, offset,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nomem, test_put_objlnk_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_OBJLNK;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

static void test_put_opaque(void)
{
	int ret;
	struct test_payload_buffer expected_payload = {
		.data = {
			(0x04 << 5) | 1,
			(0x05 << 5) | 3,
			(0x01 << 5) | 1,
			(0x03 << 5) | 9,
			'/', '6', '5', '5', '3', '5', '/', '0', '/',
			(0x00 << 5) | 0,
			(0x03 << 5) | 1,
			'8',
			(0x00 << 5) | 8,
			(0x02 << 5) | 11,
			't', 'e', 's', 't', '_', 'o', 'p', 'a', 'q', 'u', 'e',
		},
		.len = 29
	};

	memcpy(test_opaque, "test_opaque", 11 * sizeof(uint8_t));
	test_msg.path.res_id = TEST_RES_OPAQUE;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_true(ret >= 0, "Error reported");

	zassert_mem_equal(test_msg.msg_data + TEST_PAYLOAD_OFFSET,
			 expected_payload.data, expected_payload.len,
			  "Invalid payload format");
	zassert_equal(test_msg.cpkt.offset,
		      expected_payload.len + TEST_PAYLOAD_OFFSET,
		      "Invalid packet offset");
}

ZTEST(net_content_senml_cbor_nomem, test_put_opaque_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_OPAQUE;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_put_time)
{
	int ret;
	time_t value = 1170111600;
	struct test_payload_buffer expected_payload = {
		.data = {
			(0x04 << 5) | 1,
			(0x05 << 5) | 3,
			(0x01 << 5) | 1,
			(0x03 << 5) | 9,
			'/', '6', '5', '5', '3', '5', '/', '0', '/',
			(0x00 << 5) | 0,
			(0x03 << 5) | 1,
			'9',
			(0x00 << 5) | 2,
			(0x00 << 5) | 26,
			0x45, 0xbe, 0x7c, 0x70
		},
		.len = 22
	};

	test_msg.path.res_id = TEST_RES_TIME;
	test_time = value;

	ret = do_read_op_senml_cbor(&test_msg);

	zassert_true(ret >= 0, "Error reported");
	zassert_mem_equal(test_msg.msg_data + TEST_PAYLOAD_OFFSET,
				expected_payload.data,
				expected_payload.len,
				"Invalid payload format");
	zassert_equal(test_msg.cpkt.offset, expected_payload.len + TEST_PAYLOAD_OFFSET,
				"Invalid packet offset");

}

ZTEST(net_content_senml_cbor_nomem, test_put_time_nomem)
{
	int ret;

	test_msg.path.res_id = TEST_RES_TIME;

	ret = do_read_op_senml_cbor(&test_msg);
	zassert_equal(ret, -ENOMEM, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_get_s32)
{
	int ret;
	int i;
	struct test_payload_buffer payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'2',
				(0x00 << 5) | 2,
				(0x00 << 5) | 0
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'2',
				(0x00 << 5) | 2,
				(0x00 << 5) | 26,
				127, 255, 255, 255
			},
			.len = 22
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'2',
				(0x00 << 5) | 2,
				(0x01 << 5) | 26,
				127, 255, 255, 255
			},
			.len = 22
		},
	};
	int32_t expected_value[] = { 0, INT32_MAX, INT32_MIN };

	test_msg.path.res_id = TEST_RES_S32;

	for (i = 0; i < ARRAY_SIZE(expected_value); i++) {
		test_payload_set(payload[i]);

		ret = do_write_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");
		zassert_equal(test_s32, expected_value[i], "Invalid value parsed");
		zassert_equal(test_msg.in.offset, payload[i].len + 1,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nodata, test_get_s32_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_S32;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_get_s64)
{
	int ret;
	int i;
	struct test_payload_buffer payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'3',
				(0x00 << 5) | 2,
				(0x00 << 5) | 0
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'3',
				(0x00 << 5) | 2,
				(0x01 << 5) | 27,
				127, 255, 255, 255, 255, 255, 255, 255
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'3',
				(0x00 << 5) | 2,
				(0x00 << 5) | 27,
				127, 255, 255, 255, 255, 255, 255, 255
			},
			.len = 26
		},
	};
	int64_t expected_value[] = { 0, INT64_MIN, INT64_MAX };

	test_msg.path.res_id = TEST_RES_S64;

	for (i = 0; i < ARRAY_SIZE(expected_value); i++) {
		test_payload_set(payload[i]);

		ret = do_write_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");
		zassert_equal(test_s64, expected_value[i], "Invalid value parsed");
		zassert_equal(test_msg.in.offset, payload[i].len + 1,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nodata, test_get_s64_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_S64;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_get_string)
{
	int ret;
	struct test_payload_buffer payload = {
		.data = {
			(0x04 << 5) | 1,
			(0x05 << 5) | 3,
			(0x01 << 5) | 1,
			(0x03 << 5) | 9,
			'/', '6', '5', '5', '3', '5', '/', '0', '/',
			(0x00 << 5) | 0,
			(0x03 << 5) | 1,
			'4',
			(0x00 << 5) | 3,
			(0x03 << 5) | 11,
			't', 'e', 's', 't', '_', 's', 't', 'r', 'i', 'n', 'g'
		},
		.len = 29
	};
	const char *expected_value = "test_string";

	test_msg.path.res_id = TEST_RES_STRING;

	test_payload_set(payload);

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_true(ret >= 0, "Error reported");
	zassert_mem_equal(test_string, expected_value, strlen(expected_value),
			  "Invalid value parsed");
	zassert_equal(test_msg.in.offset, payload.len + 1,
		      "Invalid packet offset");
}

ZTEST(net_content_senml_cbor_nodata, test_get_string_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_STRING;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

#define DOUBLE_CMP_EPSILON 0.000000001

ZTEST(net_content_senml_cbor, test_get_float)
{
	int ret;
	int i;
	struct test_payload_buffer payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0x3F, 0xBF, 0x7C, 0xED, 0x91, 0x68, 0x72, 0xB0
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0xBF, 0xEF, 0x95, 0x81, 0x06, 0x24, 0xDD, 0x2F
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0xC0, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0x40, 0x02, 0xA9, 0xFB, 0xE7, 0x6C, 0x8B, 0x44
			},
			.len = 26
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'5',
				(0x00 << 5) | 2,
				(0x07 << 5) | 0x1b,
				0xC0, 0x5E, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00
			},
			.len = 26
		}
	};
	double expected_value[] = {
		0.123, -0.987, 3., -10., 2.333, -123.125
	};

	test_msg.path.res_id = TEST_RES_FLOAT;

	for (i = 0; i < ARRAY_SIZE(expected_value); i++) {
		test_payload_set(payload[i]);

		ret = do_write_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");
		zassert_true((test_float > expected_value[i] - DOUBLE_CMP_EPSILON) &&
			     (test_float < expected_value[i] + DOUBLE_CMP_EPSILON),
			     "Invalid value parsed");
		zassert_equal(test_msg.in.offset, payload[i].len + 1,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nodata, test_get_float_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_FLOAT;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_get_bool)
{
	int ret;
	int i;
	struct test_payload_buffer const payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'6',
				(0x00 << 5) | 4,
				(0x07 << 5) | 21
			},
			.len = 18
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'6',
				(0x00 << 5) | 4,
				(0x07 << 5) | 20
			},
			.len = 18
		}
	};
	bool expected_value[] = { true, false };

	test_msg.path.res_id = TEST_RES_BOOL;

	for (i = 0; i < ARRAY_SIZE(expected_value); i++) {
		test_payload_set(payload[i]);

		ret = do_write_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");
		zassert_equal(test_bool, expected_value[i], "Invalid value parsed");
		zassert_equal(test_msg.in.offset, payload[i].len + 1,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nodata, test_get_bool_noda)
{
	int ret;

	test_msg.path.res_id = TEST_RES_BOOL;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_get_objlnk)
{
	int ret;
	int i;
	struct test_payload_buffer payload[] = {
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'7',
				(0x00 << 5) | 2,
				(0x03 << 5) | (sizeof("0:0")),
				'0', ':', '0', '\0'
			},
			.len = 22
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'7',
				(0x00 << 5) | 3,
				(0x03 << 5) | (sizeof("1:2")),
				'1', ':', '2', '\0'
			},
			.len = 22
		},
		{
			.data = {
				(0x04 << 5) | 1,
				(0x05 << 5) | 3,
				(0x01 << 5) | 1,
				(0x03 << 5) | 9,
				'/', '6', '5', '5', '3', '5', '/', '0', '/',
				(0x00 << 5) | 0,
				(0x03 << 5) | 1,
				'7',
				(0x00 << 5) | 3,
				(0x03 << 5) | (sizeof("65535:65535")),
				'6', '5', '5', '3', '5', ':',
				'6', '5', '5', '3', '5', '\0'
			},
			.len = 30
		},
	};
	struct lwm2m_objlnk expected_value[] = {
		{ 0, 0 }, { 1, 2 }, { LWM2M_OBJLNK_MAX_ID, LWM2M_OBJLNK_MAX_ID }
	};

	test_msg.path.res_id = TEST_RES_OBJLNK;

	for (i = 0; i < ARRAY_SIZE(expected_value); i++) {
		test_payload_set(payload[i]);

		ret = do_write_op_senml_cbor(&test_msg);
		zassert_true(ret >= 0, "Error reported");
		zassert_mem_equal(&test_objlnk, &expected_value[i],
				  sizeof(test_objlnk), "Invalid value parsed");
		zassert_equal(test_msg.in.offset, payload[i].len + 1,
			      "Invalid packet offset");
	}
}

ZTEST(net_content_senml_cbor_nodata, test_get_objlnk_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_OBJLNK;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

static void test_get_opaque(void)
{
	int ret;
	struct test_payload_buffer payload = {
		.data = {
			(0x04 << 5) | 1,
			(0x05 << 5) | 3,
			(0x01 << 5) | 1,
			(0x03 << 5) | 9,
			'/', '6', '5', '5', '3', '5', '/', '0', '/',
			(0x00 << 5) | 0,
			(0x03 << 5) | 1,
			'4',
			(0x00 << 5) | 3,
			(0x03 << 5) | 11,
			't', 'e', 's', 't', '_', 'o', 'p', 'a', 'q', 'u', 'e'
		},
		.len = 29
	};
	uint8_t expected_value[11];

	memcpy(expected_value, "test_opaque", 11 * sizeof(uint8_t));

	test_msg.path.res_id = TEST_RES_OPAQUE;

	test_payload_set(payload);

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_true(ret >= 0, "Error reported");
	zassert_mem_equal(test_opaque, expected_value, sizeof(expected_value),
			  "Invalid value parsed");
	zassert_equal(test_msg.in.offset, payload.len + 1,
		      "Invalid packet offset");
}

ZTEST(net_content_senml_cbor, test_opaque)
{
	test_put_opaque();
	test_get_opaque();
}

ZTEST(net_content_senml_cbor_nodata, test_get_opaque_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_OPAQUE;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

ZTEST(net_content_senml_cbor, test_get_time)
{
	int ret;
	time_t expected_value = 1170111600;
	struct test_payload_buffer payload = {
		.data = {
			(0x04 << 5) | 1,
			(0x05 << 5) | 3,
			(0x01 << 5) | 1,
			(0x03 << 5) | 9,
			'/', '6', '5', '5', '3', '5', '/', '0', '/',
			(0x00 << 5) | 0,
			(0x03 << 5) | 1,
			'9',
			(0x00 << 5) | 2,
			(0x00 << 5) | 26,
			0x45, 0xbe, 0x7c, 0x70
		},
		.len = 22
	};

	test_msg.path.res_id = TEST_RES_TIME;

	test_payload_set(payload);

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_true(ret >= 0, "Error reported");
	zassert_equal(test_time, expected_value, "Invalid value parsed");
	zassert_equal(test_msg.in.offset, payload.len + 1,
				"Invalid packet offset");
}

ZTEST(net_content_senml_cbor_nodata, test_get_time_nodata)
{
	int ret;

	test_msg.path.res_id = TEST_RES_TIME;

	ret = do_write_op_senml_cbor(&test_msg);
	zassert_equal(ret, -EBADMSG, "Invalid error code returned");
}

ZTEST_SUITE(net_content_senml_cbor, NULL, test_obj_init, test_prepare, NULL, NULL);
ZTEST_SUITE(net_content_senml_cbor_nomem, NULL, test_obj_init, test_prepare_nomem, NULL, NULL);
ZTEST_SUITE(net_content_senml_cbor_nodata, NULL, test_obj_init, test_prepare_nodata, NULL, NULL);
