blob: 7b6ad8eafa89400f4d61e0bbf25740bfe3faedce [file] [log] [blame]
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/init.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/net/buf.h>
#include <zephyr/logging/log.h>
#include <zephyr/mgmt/mcumgr/mgmt/mgmt.h>
#include <zephyr/mgmt/mcumgr/smp/smp.h>
#include <zephyr/mgmt/mcumgr/smp/smp_client.h>
#include <zephyr/mgmt/mcumgr/transport/smp.h>
#include <mgmt/mcumgr/transport/smp_internal.h>
#include "smp_transport_stub.h"
static struct net_buf *buf[5];
static uint32_t testing_user_data;
static void *response_ptr;
static struct net_buf *res_buf;
static struct smp_client_object smp_client;
int smp_client_res_cb(struct net_buf *nb, void *user_data)
{
res_buf = nb;
response_ptr = user_data;
return 0;
}
ZTEST(smp_client, test_buf_alloc)
{
struct smp_client_object smp_client;
/* Allocate all 4 buffer's and verify that 5th fail */
for (int i = 0; i < 5; i++) {
buf[i] = smp_client_buf_allocation(&smp_client, MGMT_GROUP_ID_IMAGE, 1,
MGMT_OP_WRITE, SMP_MCUMGR_VERSION_1);
if (i == 4) {
zassert_is_null(buf[i], "Buffer was not Null");
} else {
zassert_not_null(buf[i], "Buffer was Null");
zassert_equal(sizeof(struct smp_hdr), buf[i]->len,
"Expected to receive %d response %d",
sizeof(struct smp_hdr), buf[i]->len);
}
}
for (int i = 0; i < 4; i++) {
smp_client_buf_free(buf[i]);
buf[i] = NULL;
}
}
ZTEST(smp_client, test_msg_send_timeout)
{
struct net_buf *nb;
int rc;
nb = smp_client_buf_allocation(&smp_client, MGMT_GROUP_ID_IMAGE, 1, MGMT_OP_WRITE,
SMP_MCUMGR_VERSION_1);
zassert_not_null(nb, "Buffer was Null");
rc = smp_client_send_cmd(&smp_client, nb, smp_client_res_cb, &testing_user_data, 2);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
k_sleep(K_SECONDS(3));
zassert_is_null(res_buf, "NULL pointer was not returned");
zassert_equal_ptr(response_ptr, &testing_user_data, "User data not returned correctly");
}
ZTEST(smp_client, test_msg_response_handler)
{
struct smp_hdr dst_hdr;
int rc;
response_ptr = NULL;
res_buf = NULL;
buf[0] = smp_client_buf_allocation(&smp_client, MGMT_GROUP_ID_IMAGE, 1, MGMT_OP_WRITE,
SMP_MCUMGR_VERSION_1);
zassert_not_null(buf[0], "Buffer was Null");
rc = smp_client_send_cmd(&smp_client, buf[0], smp_client_res_cb, &testing_user_data, 8);
zassert_equal(MGMT_ERR_EOK, rc, "Expected to receive %d response %d", MGMT_ERR_EOK, rc);
buf[1] = smp_client_buf_allocation(&smp_client, MGMT_GROUP_ID_IMAGE, 1, MGMT_OP_WRITE,
SMP_MCUMGR_VERSION_1);
zassert_not_null(buf[0], "Buffer was Null");
/* Read Pushed packet Header */
smp_transport_read_hdr(buf[0], &dst_hdr);
smp_client_single_response(buf[1], &dst_hdr);
zassert_is_null(res_buf, "NULL pointer was not returned");
zassert_is_null(response_ptr, "NULL pointer was not returned");
/* Set Correct OP */
dst_hdr.nh_op = MGMT_OP_WRITE_RSP;
smp_client_single_response(buf[1], &dst_hdr);
zassert_equal_ptr(res_buf, buf[1], "Response Buf not correct");
zassert_equal_ptr(response_ptr, &testing_user_data, "User data not returned correctly");
response_ptr = NULL;
res_buf = NULL;
smp_client_single_response(buf[1], &dst_hdr);
zassert_is_null(res_buf, "NULL pointer was not returned");
zassert_is_null(response_ptr, "NULL pointer was not returned");
}
static void *setup_custom_os(void)
{
/* Registre tarnsport and init client */
stub_smp_client_transport_register();
smp_client_object_init(&smp_client, SMP_SERIAL_TRANSPORT);
return NULL;
}
static void cleanup_test(void *p)
{
for (int i = 0; i < 5; i++) {
if (buf[i]) {
smp_client_buf_free(buf[i]);
buf[i] = NULL;
}
}
}
/* Main test set */
ZTEST_SUITE(smp_client, NULL, setup_custom_os, NULL, cleanup_test, NULL);