| /* |
| * Copyright (c) 2018 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include "settings_test.h" |
| #include "settings/settings_fcb.h" |
| |
| #define NAME_DELETABLE "4/deletable" |
| |
| struct flash_sector fcb_small_sectors[2] = { |
| [0] = { |
| .fs_off = 0x00000000, |
| .fs_size = 4 * 1024 |
| }, |
| [1] = { |
| .fs_off = 0x00001000, |
| .fs_size = 4 * 1024 |
| } |
| }; |
| |
| struct deletable_s { |
| bool valid; |
| uint32_t val32; |
| } deletable_val; |
| |
| uint32_t val4v2; |
| |
| int c4_handle_export(int (*cb)(const char *name, const void *value, size_t val_len)); |
| int c4_handle_set(const char *name, size_t len, settings_read_cb read_cb, |
| void *cb_arg); |
| |
| struct settings_handler c4_test_handler = { |
| .name = "4", |
| .h_get = NULL, |
| .h_set = c4_handle_set, |
| .h_commit = NULL, |
| .h_export = c4_handle_export |
| }; |
| |
| int c4_handle_set(const char *name, size_t len, settings_read_cb read_cb, |
| void *cb_arg) |
| { |
| return 0; |
| } |
| |
| int c4_handle_export(int (*cb)(const char *name, const void *value, size_t val_len)) |
| { |
| if (deletable_val.valid) { |
| (void)cb(NAME_DELETABLE, &deletable_val.val32, |
| sizeof(deletable_val.val32)); |
| } else { |
| (void)cb(NAME_DELETABLE, NULL, 0); |
| } |
| |
| (void)cb("4/dummy", &val4v2, sizeof(val4v2)); |
| |
| return 0; |
| } |
| |
| static int check_compressed_cb(struct fcb_entry_ctx *entry_ctx, void *arg) |
| { |
| char buf[SETTINGS_MAX_NAME_LEN + SETTINGS_MAX_VAL_LEN + |
| SETTINGS_EXTRA_LEN]; |
| int rc; |
| int len; |
| |
| len = entry_ctx->loc.fe_data_len; |
| if (len >= sizeof(buf)) { |
| len = sizeof(buf) - 1; |
| } |
| |
| rc = flash_area_read(entry_ctx->fap, |
| FCB_ENTRY_FA_DATA_OFF(entry_ctx->loc), buf, len); |
| |
| if (rc) { |
| return 0; |
| } |
| buf[len] = '\0'; |
| |
| rc = strncmp(buf, NAME_DELETABLE, sizeof(NAME_DELETABLE)-1); |
| zassert_true(rc != 0, "The deleted settings shouldn be compressed."); |
| |
| return 0; |
| } |
| |
| ZTEST(settings_config_fcb, test_config_compress_deleted) |
| { |
| int rc; |
| struct settings_fcb cf; |
| int i; |
| |
| config_wipe_srcs(); |
| config_wipe_fcb(fcb_small_sectors, ARRAY_SIZE(fcb_small_sectors)); |
| |
| cf.cf_fcb.f_magic = CONFIG_SETTINGS_FCB_MAGIC; |
| cf.cf_fcb.f_sectors = fcb_small_sectors; |
| cf.cf_fcb.f_sector_cnt = ARRAY_SIZE(fcb_small_sectors); |
| |
| rc = settings_fcb_src(&cf); |
| zassert_true(rc == 0, "can't register FCB as configuration source"); |
| settings_mount_fcb_backend(&cf); |
| |
| rc = settings_fcb_dst(&cf); |
| zassert_true(rc == 0, |
| "can't register FCB as configuration destination"); |
| |
| rc = settings_register(&c4_test_handler); |
| zassert_true(rc == 0, "settings_register fail"); |
| |
| deletable_val.valid = true; |
| deletable_val.val32 = 2018U; |
| val4v2 = 0U; |
| |
| rc = settings_save(); |
| zassert_true(rc == 0, "fcb write error"); |
| |
| deletable_val.valid = false; |
| |
| for (i = 0; ; i++) { |
| val4v2++; |
| |
| rc = settings_save(); |
| zassert_true(rc == 0, "fcb write error"); |
| |
| if (cf.cf_fcb.f_active.fe_sector == &fcb_small_sectors[1]) { |
| /* |
| * The compression should happened while the active |
| * sector was changing. |
| */ |
| break; |
| } |
| } |
| |
| rc = fcb_walk(&cf.cf_fcb, &fcb_small_sectors[1], check_compressed_cb, |
| NULL); |
| settings_unregister(&c4_test_handler); |
| } |