/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 * Copyright (c) 2015 Runtime Inc
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "settings_test.h"
#include "settings/settings_file.h"

#ifdef CONFIG_SETTINGS_USE_BASE64
#define CF_MFG_TEST_STR "\x10\x00myfoo/mybar=AQ=="
#define CF_RUNNING_TEST_STR "\x10\x00myfoo/mybar=CA=="
#else
#define CF_MFG_TEST_STR "\x0D\x00myfoo/mybar=\x01"
#define CF_RUNNING_TEST_STR "\x0D\x00myfoo/mybar=\x08"
#endif

void test_config_small_file(void)
{
	int rc;
	struct settings_file cf_mfg;
	struct settings_file cf_running;
	const char cf_mfg_test[] = CF_MFG_TEST_STR;
	const char cf_running_test[] = CF_RUNNING_TEST_STR;

	config_wipe_srcs();

	cf_mfg.cf_name = TEST_CONFIG_DIR "/mfg";
	cf_running.cf_name = TEST_CONFIG_DIR "/running";

	rc = settings_file_src(&cf_mfg);
	zassert_true(rc == 0, "can't register FS as configuration source");
	rc = settings_file_src(&cf_running);
	zassert_true(rc == 0, "can't register FS as configuration source");

	rc = fsutil_write_file(TEST_CONFIG_DIR "/mfg", cf_mfg_test,
			       sizeof(cf_mfg_test));
	zassert_true(rc == 0, "can't write to file");

	settings_load();
	zassert_true(test_set_called, "the SET handler wasn't called");
	zassert_true(val8 == 1,
		     "SET handler: was called with wrong parameters");

	ctest_clear_call_state();

	rc = fsutil_write_file(TEST_CONFIG_DIR "/running", cf_running_test,
			       sizeof(cf_running_test));
	zassert_true(rc == 0, "can't write to file");

	settings_load();
	zassert_true(test_set_called, "the SET handler wasn't called");
	zassert_true(val8 == 8,
		     "SET handler: was called with wrong parameters");

	ctest_clear_call_state();
}
