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

#include <zephyr/ztest.h>
#include <zephyr/net/buf.h>
#include <mgmt/mgmt.h>
#include <zephyr/mgmt/mcumgr/smp_dummy.h>
#include <os_mgmt/os_mgmt.h>

#define SMP_RESPONSE_WAIT_TIME 3

/* Test os_mgmt echo command with 40 bytes of data: "short MCUMGR test application message..." */
static const uint8_t command[] = {
	0x02, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x00,
	0xbf, 0x61, 0x64, 0x78, 0x28, 0x73, 0x68, 0x6f,
	0x72, 0x74, 0x20, 0x4d, 0x43, 0x55, 0x4d, 0x47,
	0x52, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x61,
	0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61,
	0x67, 0x65, 0x2e, 0x2e, 0x2e, 0xff,
};

/* Expected response from mcumgr */
static const uint8_t expected_response[] = {
	0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x00,
	0xbf, 0x61, 0x72, 0x78, 0x28, 0x73, 0x68, 0x6f,
	0x72, 0x74, 0x20, 0x4d, 0x43, 0x55, 0x4d, 0x47,
	0x52, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x61,
	0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61,
	0x67, 0x65, 0x2e, 0x2e, 0x2e, 0xff
};

ZTEST(os_mgmt_echo, test_echo)
{
	struct net_buf *nb;

	/* Register os_mgmt mcumgr group */
	os_mgmt_register_group();

	/* Enable dummy SMP backend and ready for usage */
	smp_dummy_enable();
	smp_dummy_clear_state();

	/* Send test echo command to dummy SMP backend */
	(void)smp_dummy_tx_pkt(command, sizeof(command));
	smp_dummy_add_data();

	/* For a short duration to see if response has been received */
	bool received = smp_dummy_wait_for_data(SMP_RESPONSE_WAIT_TIME);

	zassert_true(received, "Expected to receive data but timed out\n");

	/* Retrieve response buffer and ensure validity */
	nb = smp_dummy_get_outgoing();
	smp_dummy_disable();

	zassert_equal(sizeof(expected_response), nb->len,
		      "Expected to receive %d bytes but got %d\n", sizeof(expected_response),
		      nb->len);

	zassert_mem_equal(expected_response, nb->data, nb->len,
			  "Expected received data mismatch");
}

ZTEST_SUITE(os_mgmt_echo, NULL, NULL, NULL, NULL, NULL);
