/*
 * 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"

static int test_config_save_one_byte_value(const char *name, uint8_t val)
{
	return settings_save_one(name, &val, 1);
}


void test_config_save_one_file(void)
{
	int rc;
	struct settings_file cf;

	config_wipe_srcs();
	rc = fs_mkdir(TEST_CONFIG_DIR);
	zassert_true(rc == 0 || rc == -EEXIST, "can't create directory");

	cf.cf_name = TEST_CONFIG_DIR "/blah";
	cf.cf_maxlines = 1000;
	cf.cf_lines = 0; /* normally fetched while loading, but this is test */
	rc = settings_file_src(&cf);
	zassert_true(rc == 0, "can't register FS as configuration source");

	rc = settings_file_dst(&cf);
	zassert_true(rc == 0,
		     "can't register FS as configuration destination");

	val8 = 33U;
	rc = settings_save();
	zassert_true(rc == 0, "fs write error");

	rc = test_config_save_one_byte_value("myfoo/mybar", 42);
	zassert_equal(rc, 0, "fs one item write error");

	rc = settings_load();
	zassert_true(rc == 0, "fs redout error");
	zassert_true(val8 == 42U, "bad value read");

	rc = test_config_save_one_byte_value("myfoo/mybar", 44);
	zassert_true(rc == 0, "fs one item write error");

	rc = settings_load();
	zassert_true(rc == 0, "fs redout error");
	zassert_true(val8 == 44U, "bad value read");
}
