/*
 * Copyright (c) 2022, Arm Ltd. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <assert.h>
#include <stdio.h>

#include <mbedtls_common.h>
#include <plat/common/platform.h>
#include <psa/crypto.h>
#include <rss_comms.h>

#include "rss_ap_testsuites.h"

static struct test_suite_t test_suites[] = {
	{.freg = register_testsuite_delegated_attest},
	{.freg = register_testsuite_measured_boot},
};

/*
 * Return 0 if we could run all tests.
 * Note that this does not mean that all tests passed - only that they all run.
 * One should then look at each individual test result inside the
 * test_suites[].val field.
 */
static int run_tests(void)
{
	enum test_suite_err_t ret;
	psa_status_t status;
	size_t i;

	/* Initialize test environment. */
	rss_comms_init(PLAT_RSS_AP_SND_MHU_BASE, PLAT_RSS_AP_RCV_MHU_BASE);
	mbedtls_init();
	status = psa_crypto_init();
	if (status != PSA_SUCCESS) {
		printf("\n\npsa_crypto_init failed (status = %d)\n", status);
		return -1;
	}

	/* Run all tests. */
	for (i = 0; i < ARRAY_SIZE(test_suites); ++i) {
		struct test_suite_t *suite = &(test_suites[i]);

		suite->freg(suite);
		ret = run_testsuite(suite);
		if (ret != TEST_SUITE_ERR_NO_ERROR) {
			printf("\n\nError during executing testsuite '%s'.\n", suite->name);
			return -1;
		}
	}
	printf("\nAll tests are run.\n");

	return 0;
}

void run_platform_tests(void)
{
	size_t i;
	int ret;
	int failures = 0;

	ret = run_tests();
	if (ret != 0) {
		/* For some reason, we could not run all tests. */
		return ret;
	}

	printf("\n\n");

	/*
	 * Print a summary of all the tests that had been run.
	 * Also count the number of tests failure and report that back to the
	 * caller.
	 */
	printf("SUMMARY:\n");
	for (i = 0; i < ARRAY_SIZE(test_suites); ++i) {

		struct test_suite_t *suite = &(test_suites[i]);

		switch (suite->val) {
		case TEST_PASSED:
			printf("    %s PASSED.\n", suite->name);
			break;
		case TEST_FAILED:
			failures++;
			printf("    %s FAILED.\n", suite->name);
			break;
		case TEST_SKIPPED:
			printf("    %s SKIPPED.\n", suite->name);
			break;
		default:
			assert(false);
			break;
		}
	}

	printf("\n\n");

	return failures;
}
