Skip to content

Commit d9bc77e

Browse files
committed
fix(nvs): fixed erasing of old values if new data type is not the same
Closes #15559
1 parent 13953d5 commit d9bc77e

File tree

2 files changed

+327
-187
lines changed

2 files changed

+327
-187
lines changed

components/nvs_flash/host_test/nvs_host_test/main/test_nvs.cpp

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -3806,6 +3806,82 @@ TEST_CASE("nvs multiple write with same key but different types", "[nvs]")
38063806
TEST_ESP_OK(nvs_flash_deinit_partition(NVS_DEFAULT_PART_NAME));
38073807
}
38083808

3809+
TEST_CASE("nvs multiple write with same key blob and string involved", "[nvs]")
3810+
{
3811+
PartitionEmulationFixture f(0, 10);
3812+
3813+
nvs_handle_t handle_1;
3814+
const uint32_t NVS_FLASH_SECTOR = 6;
3815+
const uint32_t NVS_FLASH_SECTOR_COUNT_MIN = 3;
3816+
TEMPORARILY_DISABLED(f.emu.setBounds(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR + NVS_FLASH_SECTOR_COUNT_MIN);)
3817+
3818+
for (uint16_t j = NVS_FLASH_SECTOR; j < NVS_FLASH_SECTOR + NVS_FLASH_SECTOR_COUNT_MIN; ++j) {
3819+
f.erase(j);
3820+
}
3821+
TEST_ESP_OK(nvs::NVSPartitionManager::get_instance()->init_custom(f.part(),
3822+
NVS_FLASH_SECTOR,
3823+
NVS_FLASH_SECTOR_COUNT_MIN));
3824+
3825+
TEST_ESP_OK(nvs_open("namespace1", NVS_READWRITE, &handle_1));
3826+
3827+
nvs_erase_all(handle_1);
3828+
3829+
const char key_name[] = "foo";
3830+
3831+
// integer variables
3832+
int32_t v32;
3833+
int8_t v8;
3834+
3835+
// string
3836+
#define str_data_len 64
3837+
const char str_data[] = "string data";
3838+
char str_buf[str_data_len] = {0};
3839+
size_t str_len = str_data_len;
3840+
3841+
// blob
3842+
#define blob_data_len 64
3843+
uint8_t blob_data[blob_data_len] = {0};
3844+
uint8_t blob_buf[blob_data_len] = {0};
3845+
size_t blob_read_size;
3846+
3847+
// first write is i32
3848+
TEST_ESP_OK(nvs_set_i32(handle_1, key_name, (int32_t)12345678));
3849+
3850+
TEST_ESP_ERR(nvs_get_i8(handle_1, key_name, &v8), ESP_ERR_NVS_NOT_FOUND);
3851+
TEST_ESP_OK(nvs_get_i32(handle_1, key_name, &v32));
3852+
TEST_ESP_ERR(nvs_get_str(handle_1, key_name, str_buf, &str_len), ESP_ERR_NVS_NOT_FOUND);
3853+
TEST_ESP_ERR(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size), ESP_ERR_NVS_NOT_FOUND);
3854+
3855+
3856+
// second write is string
3857+
TEST_ESP_OK(nvs_set_str(handle_1, key_name, str_data));
3858+
3859+
TEST_ESP_ERR(nvs_get_i8(handle_1, key_name, &v8), ESP_ERR_NVS_NOT_FOUND);
3860+
TEST_ESP_ERR(nvs_get_i32(handle_1, key_name, &v32), ESP_ERR_NVS_NOT_FOUND);
3861+
TEST_ESP_OK(nvs_get_str(handle_1, key_name, str_buf, &str_len));
3862+
TEST_ESP_ERR(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size), ESP_ERR_NVS_NOT_FOUND);
3863+
3864+
// third write is blob
3865+
TEST_ESP_OK(nvs_set_blob(handle_1, key_name, blob_data, blob_data_len));
3866+
3867+
TEST_ESP_ERR(nvs_get_i8(handle_1, key_name, &v8), ESP_ERR_NVS_NOT_FOUND);
3868+
TEST_ESP_ERR(nvs_get_i32(handle_1, key_name, &v32), ESP_ERR_NVS_NOT_FOUND);
3869+
TEST_ESP_ERR(nvs_get_str(handle_1, key_name, str_buf, &str_len), ESP_ERR_NVS_NOT_FOUND);
3870+
TEST_ESP_OK(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size));
3871+
3872+
// fourth write is i8
3873+
TEST_ESP_OK(nvs_set_i8(handle_1, key_name, (int8_t)12));
3874+
3875+
TEST_ESP_OK(nvs_get_i8(handle_1, key_name, &v8));
3876+
TEST_ESP_ERR(nvs_get_i32(handle_1, key_name, &v32), ESP_ERR_NVS_NOT_FOUND);
3877+
TEST_ESP_ERR(nvs_get_str(handle_1, key_name, str_buf, &str_len), ESP_ERR_NVS_NOT_FOUND);
3878+
TEST_ESP_ERR(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size), ESP_ERR_NVS_NOT_FOUND);
3879+
3880+
nvs_close(handle_1);
3881+
3882+
TEST_ESP_OK(nvs_flash_deinit_partition(NVS_DEFAULT_PART_NAME));
3883+
}
3884+
38093885
TEST_CASE("nvs find key tests", "[nvs]")
38103886
{
38113887
const size_t buff_len = 4096;

0 commit comments

Comments
 (0)