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

#include <ztest.h>
#include <aarch32/cortex_m/tz_ns.h>
#include <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);
}
