test: Settings-Format längentolerant machen, ota_pending ergänzen

read_rec() akzeptiert jetzt Records mit hdr.length <= sizeof(nl_settings_t):
CRC wird nur über die tatsächlich geschriebenen Bytes geprüft, fehlende Felder
bleiben auf 0 (Default). Ein zu langer (unbekannter) Record wird weiter
abgelehnt. Ein durch massive Kürzung "leer" gelesener Record (fade_in_ms,
fade_out_ms und token allesamt 0) fällt komplett auf die Defaults zurück.
Neues Feld ota_pending (nach fade_out_ms) für den kommenden OTA-Ablauf.
This commit is contained in:
Michael Sauer
2026-09-12 00:55:20 +02:00
parent ed374fc490
commit 6e9fb09455
3 changed files with 81 additions and 4 deletions
+49
View File
@@ -4,6 +4,7 @@
#include "config/nl_flash_layout.h"
#include "config/nl_settings.h"
#include "light/nl_light_types.h"
#include "util/nl_crc.h"
void setUp(void)
{
@@ -84,6 +85,51 @@ static void test_corrupt_newest_falls_back(void)
TEST_ASSERT_EQUAL_STRING("first", out.name);
}
static void test_load_accepts_shorter_record(void)
{
nl_settings_t in, out;
uint32_t crc;
/* simulate a record written by an older firmware: length = sizeof - 4, payload truncated */
in = sample("alt");
nl_settings_save(&in);
{
uint16_t shorter = (uint16_t)(sizeof(nl_settings_t) - 4);
memcpy(&fake_flash_mem[NL_FL_SETTINGS_A + 6], &shorter, 2); /* header.length */
crc = nl_crc32(0, &fake_flash_mem[NL_FL_SETTINGS_A], 12 + shorter);
memcpy(&fake_flash_mem[NL_FL_SETTINGS_A + 12 + shorter], &crc, 4);
}
TEST_ASSERT_TRUE(nl_settings_load(&out));
TEST_ASSERT_EQUAL_STRING("alt", out.name);
TEST_ASSERT_EQUAL_STRING("ninHome", out.wifi_ssid);
}
static void test_load_rejects_longer_record(void)
{
nl_settings_t in = sample("x"), out;
uint16_t longer = (uint16_t)(sizeof(nl_settings_t) + 1);
uint32_t crc;
nl_settings_save(&in);
memcpy(&fake_flash_mem[NL_FL_SETTINGS_A + 6], &longer, 2); /* header.length */
/* recompute the CRC over the (bogus, longer) length so the length check itself is
* what rejects the record, not a CRC mismatch left over from the original length */
crc = nl_crc32(0, &fake_flash_mem[NL_FL_SETTINGS_A], 12 + longer);
memcpy(&fake_flash_mem[NL_FL_SETTINGS_A + 12 + longer], &crc, 4);
TEST_ASSERT_FALSE(nl_settings_load(&out)); /* unknown newer layout -> defaults */
}
static void test_ota_pending_default_and_roundtrip(void)
{
nl_settings_t in, out;
TEST_ASSERT_FALSE(nl_settings_load(&out));
TEST_ASSERT_EQUAL_UINT8(0, out.ota_pending);
in = sample("ota");
in.ota_pending = 1;
TEST_ASSERT_EQUAL_INT(0, nl_settings_save(&in));
TEST_ASSERT_TRUE(nl_settings_load(&out));
TEST_ASSERT_EQUAL_UINT8(1, out.ota_pending);
}
static void test_erase(void)
{
nl_settings_t s = sample("x"), out;
@@ -100,6 +146,9 @@ int main(void)
RUN_TEST(test_alternates_slots);
RUN_TEST(test_power_loss_keeps_previous);
RUN_TEST(test_corrupt_newest_falls_back);
RUN_TEST(test_load_accepts_shorter_record);
RUN_TEST(test_load_rejects_longer_record);
RUN_TEST(test_ota_pending_default_and_roundtrip);
RUN_TEST(test_erase);
return UNITY_END();
}