blob: 7ffd17d196c6a9df151d0d55a331ff5d22cbe2e0 [file] [log] [blame]
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include "lwm2m_engine.h"
#include "lwm2m_util.h"
static uint32_t callback_checker;
static char pre_write_cb_buf[10];
static void *pre_write_cb(uint16_t obj_inst_id,
uint16_t res_id,
uint16_t res_inst_id,
size_t *data_len)
{
callback_checker |= 0x01;
return pre_write_cb_buf;
}
static int post_write_cb(uint16_t obj_inst_id,
uint16_t res_id, uint16_t res_inst_id,
uint8_t *data, uint16_t data_len,
bool last_block, size_t total_size)
{
callback_checker |= 0x02;
return 0;
}
static void *read_cb(uint16_t obj_inst_id,
uint16_t res_id,
uint16_t res_inst_id,
size_t *data_len)
{
callback_checker |= 0x04;
return 0;
}
static int validate_cb(uint16_t obj_inst_id,
uint16_t res_id, uint16_t res_inst_id,
uint8_t *data, uint16_t data_len,
bool last_block, size_t total_size)
{
callback_checker |= 0x08;
return 0;
}
static int obj_create_cb(uint16_t obj_inst_id)
{
callback_checker |= 0x10;
return 0;
}
static int obj_delete_cb(uint16_t obj_inst_id)
{
callback_checker |= 0x20;
return 0;
}
static int exec_cb(uint16_t obj_inst_id, uint8_t *args, uint16_t args_len)
{
callback_checker |= 0x40;
return 0;
}
ZTEST_SUITE(lwm2m_registry, NULL, NULL, NULL, NULL, NULL);
ZTEST(lwm2m_registry, test_object_creation_and_deletion)
{
int ret;
ret = lwm2m_create_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
ret = lwm2m_delete_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
}
ZTEST(lwm2m_registry, test_create_unknown_object)
{
int ret;
ret = lwm2m_create_object_inst(&LWM2M_OBJ(49999, 0));
zassert_equal(ret, -ENOENT);
}
ZTEST(lwm2m_registry, test_resource_buf)
{
int ret;
uint8_t resource_buf = 0;
ret = lwm2m_create_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(3303, 0, 6042), &resource_buf, sizeof(resource_buf),
sizeof(resource_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_u8(&LWM2M_OBJ(3303, 0, 6042), 0x5A);
zassert_equal(ret, 0);
zassert_equal(resource_buf, 0x5A);
ret = lwm2m_delete_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
}
ZTEST(lwm2m_registry, test_unknown_res)
{
int ret;
uint8_t resource_buf = 0;
ret = lwm2m_create_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(3303, 0, 49999), &resource_buf, sizeof(resource_buf),
sizeof(resource_buf), 0);
zassert_equal(ret, -ENOENT);
ret = lwm2m_delete_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
}
/* Different objects employ different resources, test some of those*/
ZTEST(lwm2m_registry, test_connmon)
{
int ret;
uint16_t u16_buf = 0;
uint32_t u32_buf = 0;
int8_t s8_buf = 0;
int32_t s32_buf = 0;
uint16_t u16_getbuf = 0;
uint32_t u32_getbuf = 0;
int8_t s8_getbuf = 0;
int32_t s32_getbuf = 0;
ret = lwm2m_set_res_buf(&LWM2M_OBJ(4, 0, 9), &u16_buf, sizeof(u16_buf),
sizeof(u16_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(4, 0, 8), &u32_buf, sizeof(u32_buf),
sizeof(u32_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(4, 0, 2), &s8_buf, sizeof(s8_buf),
sizeof(s8_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(4, 0, 11), &s32_buf, sizeof(s32_buf),
sizeof(s32_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_u16(&LWM2M_OBJ(4, 0, 9), 0x5A5A);
zassert_equal(ret, 0);
ret = lwm2m_set_u32(&LWM2M_OBJ(4, 0, 8), 0xDEADBEEF);
zassert_equal(ret, 0);
ret = lwm2m_set_s8(&LWM2M_OBJ(4, 0, 2), -5);
zassert_equal(ret, 0);
ret = lwm2m_set_s32(&LWM2M_OBJ(4, 0, 11), 0xCC00CC00);
zassert_equal(ret, 0);
zassert_equal(u16_buf, 0x5A5A);
zassert_equal(u32_buf, 0xDEADBEEF);
zassert_equal(s8_buf, -5);
zassert_equal(s32_buf, 0xCC00CC00);
ret = lwm2m_get_u16(&LWM2M_OBJ(4, 0, 9), &u16_getbuf);
zassert_equal(ret, 0);
ret = lwm2m_get_u32(&LWM2M_OBJ(4, 0, 8), &u32_getbuf);
zassert_equal(ret, 0);
ret = lwm2m_get_s8(&LWM2M_OBJ(4, 0, 2), &s8_getbuf);
zassert_equal(ret, 0);
ret = lwm2m_get_s32(&LWM2M_OBJ(4, 0, 11), &s32_getbuf);
zassert_equal(ret, 0);
zassert_equal(u16_buf, u16_getbuf);
zassert_equal(u32_buf, u32_getbuf);
zassert_equal(s8_buf, s8_getbuf);
zassert_equal(s32_buf, s32_getbuf);
}
ZTEST(lwm2m_registry, test_temp_sensor)
{
int ret;
uint8_t u8_buf = 0;
time_t time_buf = 0;
double dbl_buf = 0;
char char_buf[10];
uint8_t u8_getbuf = 0;
time_t time_getbuf = 0;
double dbl_getbuf = 0;
char char_getbuf[10];
ret = lwm2m_create_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(3303, 0, 6042), &u8_buf, sizeof(u8_buf),
sizeof(u8_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(3303, 0, 5518), &time_buf, sizeof(time_buf),
sizeof(time_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(3303, 0, 5601), &dbl_buf, sizeof(dbl_buf),
sizeof(dbl_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_res_buf(&LWM2M_OBJ(3303, 0, 5701), &char_buf, sizeof(char_buf),
sizeof(char_buf), 0);
zassert_equal(ret, 0);
ret = lwm2m_set_u8(&LWM2M_OBJ(3303, 0, 6042), 0x5A);
zassert_equal(ret, 0);
ret = lwm2m_set_time(&LWM2M_OBJ(3303, 0, 5518), 1674118825);
zassert_equal(ret, 0);
ret = lwm2m_set_f64(&LWM2M_OBJ(3303, 0, 5601), 5.89);
zassert_equal(ret, 0);
ret = lwm2m_set_string(&LWM2M_OBJ(3303, 0, 5701), "test");
zassert_equal(ret, 0);
zassert_equal(u8_buf, 0x5A);
zassert_equal(time_buf, 1674118825);
zassert_within(dbl_buf, 5.89, 0.01);
zassert_equal(strncmp(char_buf, "test", 10), 0);
ret = lwm2m_get_u8(&LWM2M_OBJ(3303, 0, 6042), &u8_getbuf);
zassert_equal(ret, 0);
ret = lwm2m_get_time(&LWM2M_OBJ(3303, 0, 5518), &time_getbuf);
zassert_equal(ret, 0);
ret = lwm2m_get_f64(&LWM2M_OBJ(3303, 0, 5601), &dbl_getbuf);
zassert_equal(ret, 0);
ret = lwm2m_get_string(&LWM2M_OBJ(3303, 0, 5701), &char_getbuf, 10);
zassert_equal(ret, 0);
zassert_equal(u8_buf, u8_getbuf);
zassert_equal(time_buf, time_getbuf);
zassert_within(dbl_buf, dbl_getbuf, 0.01);
zassert_equal(strncmp(char_buf, char_getbuf, 10), 0);
ret = lwm2m_delete_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
}
ZTEST(lwm2m_registry, test_resource_instance_creation_and_deletion)
{
int ret;
ret = lwm2m_create_res_inst(&LWM2M_OBJ(4, 0, 1, 0));
zassert_equal(ret, 0);
ret = lwm2m_delete_res_inst(&LWM2M_OBJ(4, 0, 1, 0));
zassert_equal(ret, 0);
}
ZTEST(lwm2m_registry, test_callbacks)
{
int ret;
double sensor_val;
struct lwm2m_engine_res *exec_res;
callback_checker = 0;
ret = lwm2m_register_create_callback(3303, obj_create_cb);
zassert_equal(ret, 0);
lwm2m_register_delete_callback(3303, obj_delete_cb);
zassert_equal(ret, 0);
ret = lwm2m_create_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
zassert_equal(callback_checker, 0x10);
ret = lwm2m_register_exec_callback(&LWM2M_OBJ(3303, 0, 5605), exec_cb);
zassert_equal(ret, 0);
ret = lwm2m_register_read_callback(&LWM2M_OBJ(3303, 0, 5700), read_cb);
zassert_equal(ret, 0);
ret = lwm2m_register_validate_callback(&LWM2M_OBJ(3303, 0, 5701), validate_cb);
zassert_equal(ret, 0);
ret = lwm2m_register_pre_write_callback(&LWM2M_OBJ(3303, 0, 5701), pre_write_cb);
zassert_equal(ret, 0);
ret = lwm2m_register_post_write_callback(&LWM2M_OBJ(3303, 0, 5701), post_write_cb);
zassert_equal(ret, 0);
exec_res = lwm2m_engine_get_res(&LWM2M_OBJ(3303, 0, 5605));
exec_res->execute_cb(0, 0, 0);
ret = lwm2m_set_string(&LWM2M_OBJ(3303, 0, 5701), "test");
zassert_equal(ret, 0);
zassert_equal(callback_checker, 0x5B);
ret = lwm2m_get_f64(&LWM2M_OBJ(3303, 0, 5700), &sensor_val);
zassert_equal(ret, 0);
zassert_equal(callback_checker, 0x5F);
ret = lwm2m_delete_object_inst(&LWM2M_OBJ(3303, 0));
zassert_equal(ret, 0);
zassert_equal(callback_checker, 0x7F);
}