tests/subsys/settings: fcb unaligned value test

Added test for check whether value lenght is properly
stored for unaligned settings record size.

Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
diff --git a/tests/subsys/settings/fcb/src/settings_test.h b/tests/subsys/settings/fcb/src/settings_test.h
index 728fca3..b190c25 100644
--- a/tests/subsys/settings/fcb/src/settings_test.h
+++ b/tests/subsys/settings/fcb/src/settings_test.h
@@ -23,6 +23,7 @@
 #define SETTINGS_TEST_FCB_FLASH_CNT   4
 
 extern u8_t val8;
+extern u8_t val8_un;
 extern u32_t val32;
 extern u64_t val64;
 
diff --git a/tests/subsys/settings/fcb/src/settings_test_fcb.c b/tests/subsys/settings/fcb/src/settings_test_fcb.c
index 1f6e965..e95c12a 100644
--- a/tests/subsys/settings/fcb/src/settings_test_fcb.c
+++ b/tests/subsys/settings/fcb/src/settings_test_fcb.c
@@ -12,6 +12,7 @@
 #include "flash_map.h"
 
 u8_t val8;
+u8_t val8_un;
 u32_t val32;
 u64_t val64;
 
@@ -83,6 +84,7 @@
 
 int c1_handle_set(int argc, char **argv, void *value_ctx)
 {
+	size_t val_len;
 	int rc;
 
 	test_set_called = 1;
@@ -98,6 +100,15 @@
 		return 0;
 	}
 
+	if (argc == 1 && !strcmp(argv[0], "unaligned")) {
+		val_len = settings_val_get_len_cb(value_ctx);
+		zassert_equal(val_len, sizeof(val8_un),
+			      "value length: %d, ought equal 1", val_len);
+		rc = settings_val_read_cb(value_ctx, &val8_un, sizeof(val8_un));
+		zassert_true(rc >= 0, "SETTINGS_VALUE_SET callback");
+		return 0;
+	}
+
 	return -ENOENT;
 }
 
@@ -117,6 +128,8 @@
 
 	(void)cb("myfoo/mybar64", &val64, sizeof(val64));
 
+	(void)cb("myfoo/unaligned", &val8_un, sizeof(val8_un));
+
 	return 0;
 }
 
@@ -319,6 +332,7 @@
 void test_config_compress_deleted(void);
 void test_setting_raw_read(void);
 void test_setting_val_read(void);
+void test_config_save_fcb_unaligned(void);
 
 void test_main(void)
 {
@@ -336,6 +350,7 @@
 			 ztest_unit_test(test_config_getset_int64),
 			 ztest_unit_test(test_config_commit),
 			 /* FCB as backing storage*/
+			 ztest_unit_test(test_config_save_fcb_unaligned),
 			 ztest_unit_test(test_config_empty_fcb),
 			 ztest_unit_test(test_config_save_1_fcb),
 			 ztest_unit_test(test_config_insert2),
diff --git a/tests/subsys/settings/fcb/src/settings_test_save_unaligned.c b/tests/subsys/settings/fcb/src/settings_test_save_unaligned.c
new file mode 100644
index 0000000..9a81185
--- /dev/null
+++ b/tests/subsys/settings/fcb/src/settings_test_save_unaligned.c
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2019 Nordic Semiconductor ASA
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "settings_test.h"
+#include "settings/settings_fcb.h"
+
+void test_config_save_fcb_unaligned(void)
+{
+	int rc;
+	struct settings_fcb cf;
+
+	config_wipe_srcs();
+
+	cf.cf_fcb.f_magic = CONFIG_SETTINGS_FCB_MAGIC;
+	cf.cf_fcb.f_sectors = fcb_sectors;
+	cf.cf_fcb.f_sector_cnt = ARRAY_SIZE(fcb_sectors);
+
+	rc = settings_fcb_src(&cf);
+	zassert_true(rc == 0, "can't register FCB as configuration source");
+
+	/* override flash driver alignment */
+	cf.cf_fcb.f_align = 4;
+	settings_mount_fcb_backend(&cf);
+
+	rc = settings_fcb_dst(&cf);
+	zassert_true(rc == 0,
+		     "can't register FCB as configuration destination");
+
+	val8_un = 33U;
+	rc = settings_save();
+	zassert_true(rc == 0, "fcb write error");
+
+	val8_un = 0U;
+
+	rc = settings_load();
+	zassert_true(rc == 0, "fcb redout error");
+	zassert_true(val8_un == 33, "bad value read");
+
+	val8_un = 15;
+	rc = settings_save();
+	zassert_true(rc == 0, "fcb write error");
+}