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

#include <stdint.h>
#include <stdio.h>
#include <zephyr/ztest.h>
#include <zephyr/kernel.h>
#include <zephyr/settings/settings.h>
#include <bootutil/boot_status.h>
#include <bootutil/image.h>
#include <mcuboot_version.h>

#define FLASH_SECTOR_SIZE 1024
#define FLASH_SECTOR_SIZE_KB 4
#define FLASH_MAX_APP_SECTORS 34
#define FLASH_RESERVED_SECTORS 1
#define FLASH_MAX_APP_SIZE ((FLASH_MAX_APP_SECTORS - FLASH_RESERVED_SECTORS) \
			    * FLASH_SECTOR_SIZE_KB)
#define RUNNING_SLOT 0

ZTEST(mcuboot_shared_data, test_mode)
{
	uint8_t var[1];
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/mode", var, sizeof(var));
	zassert_equal(rc, sizeof(var), "Expected data length mismatch");
	zassert_equal(var[0], MCUBOOT_MODE_SWAP_USING_MOVE, "Expected data mismatch");
}

ZTEST(mcuboot_shared_data, test_signature_type)
{
	uint8_t var[1];
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/signature_type", var, sizeof(var));
	zassert_equal(rc, sizeof(var), "Expected data length mismatch");
	zassert_equal(var[0], MCUBOOT_SIGNATURE_TYPE_RSA, "Expected data mismatch");
}

ZTEST(mcuboot_shared_data, test_recovery)
{
	uint8_t var[1];
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/recovery", var, sizeof(var));
	zassert_equal(rc, sizeof(var), "Expected data length mismatch");
	zassert_equal(var[0], MCUBOOT_RECOVERY_MODE_NONE, "Expected data mismatch");
}

ZTEST(mcuboot_shared_data, test_running_slot)
{
	uint8_t var[1];
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/running_slot", var, sizeof(var));
	zassert_equal(rc, sizeof(var), "Expected data length mismatch");
	zassert_equal(var[0], RUNNING_SLOT, "Expected data mismatch");
}

ZTEST(mcuboot_shared_data, test_bootloader_version)
{
	uint8_t var[8];
	int rc;
	struct image_version *version = (void *)var;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/bootloader_version", var, sizeof(var));
	zassert_equal(rc, sizeof(var), "Expected data length mismatch");

	zassert_equal(version->iv_major, MCUBOOT_VERSION_MAJOR,
		      "Expected version (major) mismatch");
	zassert_equal(version->iv_minor, MCUBOOT_VERSION_MINOR,
		      "Expected version (minor) mismatch");
	zassert_equal(version->iv_revision, MCUBOOT_PATCHLEVEL,
		      "Expected version (patch level) mismatch");
	zassert_equal(version->iv_build_num, 0, "Expected version (build number) mismatch");
}

ZTEST(mcuboot_shared_data, test_max_application_size)
{
	uint8_t var[4];
	uint32_t value;
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/max_application_size", var, sizeof(var));
	zassert_equal(rc, sizeof(var), "Expected data length mismatch");
	memcpy(&value, var, sizeof(value));
	value /= FLASH_SECTOR_SIZE;
	zassert_equal(value, FLASH_MAX_APP_SIZE, "Expected data mismatch");
}

ZTEST(mcuboot_shared_data, test_invalid)
{
	uint8_t var[4];
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/does_not_exist", var, sizeof(var));
	zassert_not_equal(rc, sizeof(var), "Expected data length (error) mismatch");
	zassert_not_equal(rc, 0, "Expected data length (error) mismatch");
}

ZTEST(mcuboot_shared_data, test_bootloader_version_limited)
{
	uint8_t var[2];
	int rc;

	memset(var, 0xff, sizeof(var));
	rc = settings_runtime_get("blinfo/bootloader_version", var, sizeof(var));
	zassert_not_equal(rc, sizeof(var), "Expected data length mismatch");
}

ZTEST_SUITE(mcuboot_shared_data, NULL, NULL, NULL, NULL, NULL);
