}
}
+TEST_CASE("crc errors in item header are handled", "[nvs]")
+{
+ SpiFlashEmulator emu(3);
+ Storage storage;
+ // prepare some data
+ TEST_ESP_OK(storage.init(0, 3));
+ TEST_ESP_OK(storage.writeItem(0, "ns1", static_cast<uint8_t>(1)));
+ TEST_ESP_OK(storage.writeItem(1, "value1", static_cast<uint32_t>(1)));
+ TEST_ESP_OK(storage.writeItem(1, "value2", static_cast<uint32_t>(2)));
+
+ // corrupt item header
+ uint32_t val = 0;
+ emu.write(32 * 3, &val, 4);
+
+ // check that storage can recover
+ TEST_ESP_OK(storage.init(0, 3));
+ TEST_ESP_OK(storage.readItem(1, "value2", val));
+ CHECK(val == 2);
+ // check that the corrupted item is no longer present
+ TEST_ESP_ERR(ESP_ERR_NVS_NOT_FOUND, storage.readItem(1, "value1", val));
+
+ // add more items to make the page full
+ for (size_t i = 0; i < Page::ENTRY_COUNT; ++i) {
+ char item_name[Item::MAX_KEY_LENGTH + 1];
+ snprintf(item_name, sizeof(item_name), "item_%ld", i);
+ TEST_ESP_OK(storage.writeItem(1, item_name, static_cast<uint32_t>(i)));
+ }
+
+ // corrupt another item on the full page
+ val = 0;
+ emu.write(32 * 4, &val, 4);
+
+ // check that storage can recover
+ TEST_ESP_OK(storage.init(0, 3));
+ // check that the corrupted item is no longer present
+ TEST_ESP_ERR(ESP_ERR_NVS_NOT_FOUND, storage.readItem(1, "value2", val));
+}
+
TEST_CASE("crc error in variable length item is handled", "[nvs]")
{
SpiFlashEmulator emu(3);