blob: c724c72c2cc4a600707846562c073b7338432450 [file] [log] [blame]
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include <zephyr/net/buf.h>
#include <string.h>
#include <zephyr/mgmt/mcumgr/smp/smp_client.h>
#include <zephyr/mgmt/mcumgr/mgmt/mgmt.h>
#include <zephyr/mgmt/mcumgr/grp/img_mgmt/img_mgmt_client.h>
#include <zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h>
#include <zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt_client.h>
/* Include stubbed test helpers */
#include "smp_stub.h"
#include "img_gr_stub.h"
#include "os_gr_stub.h"
/* IMG group data */
static uint8_t image_hash[32];
static struct mcumgr_image_data image_info[2];
static uint8_t image_dummy[1024];
static const char os_echo_test[] = "TestString";
static struct smp_client_object smp_client;
static struct img_mgmt_client img_client;
static struct os_mgmt_client os_client;
ZTEST(mcumgr_client, test_img_upload)
{
int rc;
struct mcumgr_image_upload response;
smp_stub_set_rx_data_verify(NULL);
img_upload_stub_init();
img_mgmt_client_init(&img_client, &smp_client, 2, image_info);
rc = img_mgmt_client_upload_init(&img_client, TEST_IMAGE_SIZE, TEST_IMAGE_NUM, image_hash);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
/* Start upload and test Timeout */
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
zassert_equal(MGMT_ERR_ETIMEOUT, response.status, "Expected to receive %d response %d\n",
MGMT_ERR_ETIMEOUT, response.status);
rc = img_mgmt_client_upload_init(&img_client, TEST_IMAGE_SIZE, TEST_IMAGE_NUM, image_hash);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
rc = img_mgmt_client_upload_init(&img_client, TEST_IMAGE_SIZE, TEST_IMAGE_NUM, image_hash);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
/* Start upload and test Timeout */
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
zassert_equal(MGMT_ERR_ETIMEOUT, response.status, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, response.status);
smp_client_send_status_stub(MGMT_ERR_EOK);
/* Allocate response buf */
img_upload_response(0, MGMT_ERR_EINVAL);
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_EINVAL, rc, "Expected to receive %d response %d", MGMT_ERR_EINVAL,
rc);
zassert_equal(MGMT_ERR_EINVAL, response.status, "Expected to receive %d response %d",
MGMT_ERR_EINVAL, response.status);
rc = img_mgmt_client_upload_init(&img_client, TEST_IMAGE_SIZE, TEST_IMAGE_NUM, image_hash);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d\n", MGMT_ERR_EOK, rc);
img_upload_response(1024, MGMT_ERR_EOK);
smp_stub_set_rx_data_verify(img_upload_init_verify);
img_upload_stub_init();
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(MGMT_ERR_EOK, response.status, "Expected to receive %d response %d",
MGMT_ERR_EOK, response.status);
zassert_equal(1024, response.image_upload_offset,
"Expected to receive offset %d response %d", 1024,
response.image_upload_offset);
/* Send last frame from image */
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(MGMT_ERR_EOK, response.status, "Expected to receive %d response %d",
MGMT_ERR_EOK, response.status);
zassert_equal(TEST_IMAGE_SIZE, response.image_upload_offset,
"Expected to receive offset %d response %d", TEST_IMAGE_SIZE,
response.image_upload_offset);
/* Test without hash */
rc = img_mgmt_client_upload_init(&img_client, TEST_IMAGE_SIZE, TEST_IMAGE_NUM, NULL);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
img_upload_stub_init();
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(MGMT_ERR_EOK, response.status, "Expected to receive %d response %d",
MGMT_ERR_EOK, response.status);
zassert_equal(1024, response.image_upload_offset,
"Expected to receive offset %d response %d", 1024,
response.image_upload_offset);
/* Send last frame from image */
rc = img_mgmt_client_upload(&img_client, image_dummy, 1024, &response);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(MGMT_ERR_EOK, response.status, "Expected to receive %d response %d",
MGMT_ERR_EOK, response.status);
zassert_equal(TEST_IMAGE_SIZE, response.image_upload_offset,
"Expected to receive offset %d response %d", TEST_IMAGE_SIZE,
response.image_upload_offset);
}
ZTEST(mcumgr_client, test_img_erase)
{
int rc;
smp_client_send_status_stub(MGMT_ERR_EOK);
/* Test timeout */
rc = img_mgmt_client_erase(&img_client, TEST_SLOT_NUMBER);
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
/* Test erase fail */
img_erase_response(MGMT_ERR_EINVAL);
rc = img_mgmt_client_erase(&img_client, TEST_SLOT_NUMBER);
zassert_equal(MGMT_ERR_EINVAL, rc, "Expected to receive %d response %d", MGMT_ERR_EINVAL,
rc);
/* Tesk ok */
img_erase_response(MGMT_ERR_EOK);
rc = img_mgmt_client_erase(&img_client, TEST_SLOT_NUMBER);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
}
ZTEST(mcumgr_client, test_image_state_read)
{
int rc;
struct mcumgr_image_state res_buf;
smp_client_send_status_stub(MGMT_ERR_EOK);
/* Test timeout */
rc = img_mgmt_client_state_read(&img_client, &res_buf);
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
/* Testing read successfully 1 image info and print that */
img_read_response(1);
rc = img_mgmt_client_state_read(&img_client, &res_buf);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(1, res_buf.image_list_length, "Expected to receive %d response %d", 1,
res_buf.image_list_length);
img_read_response(2);
rc = img_mgmt_client_state_read(&img_client, &res_buf);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(2, res_buf.image_list_length, "Expected to receive %d response %d", 2,
res_buf.image_list_length);
}
ZTEST(mcumgr_client, test_image_state_set)
{
int rc;
char hash[32];
struct mcumgr_image_state res_buf;
smp_client_response_buf_clean();
smp_stub_set_rx_data_verify(NULL);
smp_client_send_status_stub(MGMT_ERR_EOK);
/* Test timeout */
rc = img_mgmt_client_state_write(&img_client, NULL, false, &res_buf);
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
printf("Timeout OK\r\n");
/* Read secondary image hash for testing */
img_read_response(2);
rc = img_mgmt_client_state_read(&img_client, &res_buf);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(2, res_buf.image_list_length, "Expected to receive %d response %d", 2,
res_buf.image_list_length);
zassert_equal(false, image_info[1].flags.pending, "Expected to receive %d response %d",
false, image_info[1].flags.pending);
/* Copy hash for set pending flag */
memcpy(hash, image_info[1].hash, 32);
printf("Read OK\r\n");
/* Read secondary image hash for testing */
smp_stub_set_rx_data_verify(img_state_write_verify);
rc = img_mgmt_client_state_write(&img_client, hash, false, &res_buf);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(2, res_buf.image_list_length, "Expected to receive %d response %d", 2,
res_buf.image_list_length);
zassert_equal(true, image_info[1].flags.pending, "Expected to receive %d response %d",
true, image_info[1].flags.pending);
/* Test to set confirmed bit */
image_info[0].flags.confirmed = false;
smp_stub_set_rx_data_verify(img_state_write_verify);
rc = img_mgmt_client_state_write(&img_client, NULL, true, &res_buf);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
zassert_equal(2, res_buf.image_list_length, "Expected to receive %d response %d", 2,
res_buf.image_list_length);
zassert_equal(true, image_info[0].flags.confirmed, "Expected to receive %d response %d",
true, image_info[0].flags.confirmed);
}
ZTEST(mcumgr_client, test_os_reset)
{
int rc;
smp_client_response_buf_clean();
smp_stub_set_rx_data_verify(NULL);
smp_client_send_status_stub(MGMT_ERR_EOK);
/* Test timeout */
rc = os_mgmt_client_reset(&os_client);
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
/* Testing reset successfully handling */
os_reset_response();
rc = os_mgmt_client_reset(&os_client);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
}
ZTEST(mcumgr_client, test_os_echo)
{
int rc;
smp_client_response_buf_clean();
smp_stub_set_rx_data_verify(NULL);
smp_client_send_status_stub(MGMT_ERR_EOK);
/* Test timeout */
rc = os_mgmt_client_echo(&os_client, os_echo_test, sizeof(os_echo_test));
zassert_equal(MGMT_ERR_ETIMEOUT, rc, "Expected to receive %d response %d",
MGMT_ERR_ETIMEOUT, rc);
/* Test successfully operation */
smp_stub_set_rx_data_verify(os_echo_verify);
rc = os_mgmt_client_echo(&os_client, os_echo_test, sizeof(os_echo_test));
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
}
static void *setup_custom_os(void)
{
stub_smp_client_transport_register();
smp_client_object_init(&smp_client, SMP_SERIAL_TRANSPORT);
os_mgmt_client_init(&os_client, &smp_client);
img_mgmt_client_init(&img_client, &smp_client, 2, image_info);
img_gr_stub_data_init(image_hash);
os_stub_init(os_echo_test);
return NULL;
}
static void cleanup_test(void *p)
{
smp_client_response_buf_clean();
smp_stub_set_rx_data_verify(NULL);
}
/* Main test set */
ZTEST_SUITE(mcumgr_client, NULL, setup_custom_os, NULL, cleanup_test, NULL);