]> granicus.if.org Git - esp-idf/commitdiff
nvs_flash: introduce write failures after each word written
authorIvan Grokhotkov <ivan@espressif.com>
Mon, 31 Oct 2016 11:17:25 +0000 (19:17 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Mon, 31 Oct 2016 11:17:25 +0000 (19:17 +0800)
Previously the test bench would check failure recovery by introducing error after each write operation.
This makes checks a bit more extensive (and much longer) by failing after every word written. Surprisingly, this change didn't expose any bugs.

components/nvs_flash/test/spi_flash_emulation.h
components/nvs_flash/test/test_nvs.cpp

index ba50c4f9e4d657f11e372d825ce1c062e9eb67c7..4e544a39e2e779e6a7cca3257a1754bbcbbe49dc 100644 (file)
@@ -74,11 +74,11 @@ public:
             return false;
         }
         
-        if (mFailCountdown != SIZE_MAX && mFailCountdown-- == 0) {
-            return false;
-        }
-
         for (size_t i = 0; i < size / 4; ++i) {
+            if (mFailCountdown != SIZE_MAX && mFailCountdown-- == 0) {
+                return false;
+            }
+
             uint32_t sv = src[i];
             size_t pos = dstAddr / 4 + i;
             uint32_t& dv = mData[pos];
index ce552578db64fd426bac52c4ac9ca8f89bcf0740..223e5dea9a2501bc46c0018f59ea439dd7c36732 100644 (file)
@@ -894,7 +894,7 @@ TEST_CASE("test recovery from sudden poweroff", "[.][long][nvs][recovery][monkey
     
     size_t totalOps = 0;
     int lastPercent = -1;
-    for (uint32_t errDelay = 4; ; ++errDelay) {
+    for (uint32_t errDelay = 0; ; ++errDelay) {
         INFO(errDelay);
         emu.randomize(seed);
         emu.clearStats();
@@ -903,23 +903,25 @@ TEST_CASE("test recovery from sudden poweroff", "[.][long][nvs][recovery][monkey
         
         if (totalOps != 0) {
             int percent = errDelay * 100 / totalOps;
-            if (percent != lastPercent) {
+            if (percent > lastPercent) {
                 printf("%d/%d (%d%%)\r\n", errDelay, static_cast<int>(totalOps), percent);
                 lastPercent = percent;
             }
         }
         
-        TEST_ESP_OK(nvs_flash_init_custom(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR_COUNT_MIN));
 
         nvs_handle handle;
-        TEST_ESP_OK(nvs_open("namespace1", NVS_READWRITE, &handle));
-        
         size_t count = iter_count;
-        if(test.doRandomThings(handle, gen, count) != ESP_ERR_FLASH_OP_FAIL) {
-            nvs_close(handle);
-            break;
+
+        if (nvs_flash_init_custom(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR_COUNT_MIN) == ESP_OK) {
+            if (nvs_open("namespace1", NVS_READWRITE, &handle) == ESP_OK) {
+                if(test.doRandomThings(handle, gen, count) != ESP_ERR_FLASH_OP_FAIL) {
+                    nvs_close(handle);
+                    break;
+                }
+                nvs_close(handle);
+            }
         }
-        nvs_close(handle);
         
         TEST_ESP_OK(nvs_flash_init_custom(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR_COUNT_MIN));
         TEST_ESP_OK(nvs_open("namespace1", NVS_READWRITE, &handle));
@@ -929,7 +931,7 @@ TEST_CASE("test recovery from sudden poweroff", "[.][long][nvs][recovery][monkey
             CHECK(0);
         }
         nvs_close(handle);
-        totalOps = emu.getEraseOps() + emu.getWriteOps();
+        totalOps = emu.getEraseOps() + emu.getWriteBytes() / 4;
     }
 }