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

#include <ztest.h>
#include <aarch32/cortex_m/tz_ns.h>
#include <zephyr/arch/arm/aarch32/cortex_m/cmsis.h>

static bool expect_preface;
static bool expect_postface;
static bool expect_foo1;
static bool preface_called;
static bool postface_called;
static bool foo1_called;
static uint32_t foo1_retval;
static uint32_t foo1_arg1;
static uint32_t foo1_arg2;
static uint32_t foo1_arg3;
static uint32_t foo1_arg4;

void reset_mocks(void)
{
	expect_preface = true;
	foo1_called = false;
	preface_called = false;
	postface_called = false;
	foo1_retval = 0;
	foo1_arg1 = 0;
	foo1_arg2 = 0;
	foo1_arg3 = 0;
	foo1_arg4 = 0;
}


void preface(void)
{
	zassert_true(expect_preface, "%s unexpectedly called", __func__);
	expect_preface = false;
	preface_called = true;
	expect_foo1 = true;
}


uint32_t foo1(uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4)
{
	zassert_true(expect_foo1, "%s unexpectedly called", __func__);
	zassert_equal(arg1, foo1_arg1, "Was 0x%"PRIx32", expected 0x%"PRIx32,
		arg1, foo1_arg1);
	zassert_equal(arg2, foo1_arg2, NULL);
	zassert_equal(arg3, foo1_arg3, NULL);
	zassert_equal(arg4, foo1_arg4, NULL);
	expect_foo1 = false;
	foo1_called = true;
	expect_postface = true;
	return foo1_retval;
}


void postface(void)
{
	zassert_true(expect_postface, "%s unexpectedly called", __func__);
	expect_postface = false;
	postface_called = true;
}


uint32_t __attribute__((naked)) wrap_foo1(uint32_t arg1, uint32_t arg2,
				uint32_t arg3, uint32_t arg4)
{
	__TZ_WRAP_FUNC(preface, foo1, postface);
}


void test_tz_wrap_func(void)
{
	reset_mocks();
	foo1_retval = 0x01234567;
	foo1_arg1 = 0x12345678;
	foo1_arg2 = 0x23456789;
	foo1_arg3 = 0x3456789a;
	foo1_arg4 = 0x456789ab;

	uint32_t msp1, psp1;
	msp1 = __get_MSP();
	psp1 = __get_PSP();

	zassert_equal(foo1_retval,
		wrap_foo1(foo1_arg1, foo1_arg2, foo1_arg3, foo1_arg4), NULL);

	zassert_equal(msp1, __get_MSP(), NULL);
	zassert_equal(psp1, __get_PSP(), NULL);

	zassert_true(preface_called, NULL);
	zassert_true(foo1_called, NULL);
	zassert_true(postface_called, NULL);
	zassert_false(expect_preface, NULL);
	zassert_false(expect_foo1, NULL);
	zassert_false(expect_postface, NULL);
}

void test_main(void)
{
	ztest_test_suite(tz_wrap_func,
		ztest_unit_test(test_tz_wrap_func));
	ztest_run_test_suite(tz_wrap_func);
}
