fix: Zustands-Log bei fehlgeschlagenem Löschen neu einlesen
This commit is contained in:
@@ -144,9 +144,14 @@ int nl_state_log_erase(void)
|
||||
{
|
||||
int r0 = nl_flash_erase_sector(s_sector[0]);
|
||||
int r1 = nl_flash_erase_sector(s_sector[1]);
|
||||
s_have = false;
|
||||
s_seq = 0;
|
||||
s_active = 0;
|
||||
s_next = 0;
|
||||
return (r0 == 0 && r1 == 0) ? 0 : -1;
|
||||
if (r0 == 0 && r1 == 0) {
|
||||
s_have = false;
|
||||
s_seq = 0;
|
||||
s_active = 0;
|
||||
s_next = 0;
|
||||
return 0;
|
||||
}
|
||||
/* If erase failed, re-scan the flash to restore consistency */
|
||||
nl_state_log_init(s_sector[0], s_sector[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -126,6 +126,21 @@ static void test_erase(void)
|
||||
TEST_ASSERT_FALSE(nl_state_log_load(&out));
|
||||
}
|
||||
|
||||
static void test_erase_failure_rescans_flash(void)
|
||||
{
|
||||
nl_light_state_t old = st(10), new = st(20), out;
|
||||
TEST_ASSERT_EQUAL_INT(0, nl_state_log_append(&old));
|
||||
fake_flash_fail_after(0);
|
||||
TEST_ASSERT_NOT_EQUAL(0, nl_state_log_erase());
|
||||
fake_flash_fail_after(-1);
|
||||
TEST_ASSERT_TRUE(nl_state_log_load(&out));
|
||||
TEST_ASSERT_EQUAL_UINT8(10, out.brightness);
|
||||
TEST_ASSERT_EQUAL_INT(0, nl_state_log_append(&new));
|
||||
reboot();
|
||||
TEST_ASSERT_TRUE(nl_state_log_load(&out));
|
||||
TEST_ASSERT_EQUAL_UINT8(20, out.brightness);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
UNITY_BEGIN();
|
||||
@@ -137,5 +152,6 @@ int main(void)
|
||||
RUN_TEST(test_power_loss_during_append);
|
||||
RUN_TEST(test_garbage_in_empty_log_is_erased_first);
|
||||
RUN_TEST(test_erase);
|
||||
RUN_TEST(test_erase_failure_rescans_flash);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user