Public Access
S1 #7 steps 1-2: IPv4 checks, the IP setting per Saved Network, DNS and NTP settings
The plan and decisions Q105 to Q116 (docs/milestones/S1.md). lib/net: strict IPv4 parsing, prefix and mask, and the checks a Fixed setting must pass, each refusal with its reason. A Saved Network is Automatic or Fixed (address/prefix and an optional gateway), kept with it in flash. Settings: two DNS servers (9.9.9.9, 1.1.1.1), "Always use my DNS", two NTP servers (pool.ntp.org, time.cloudflare.com). Host-tested: 383 tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
@@ -97,6 +97,76 @@ void test_find() {
|
||||
TEST_ASSERT_NULL(n.find("other"));
|
||||
}
|
||||
|
||||
// S1, Q105: each Saved Network is Automatic (DHCP) or Fixed, and remembers which.
|
||||
void test_new_network_is_automatic() {
|
||||
MemoryStore store;
|
||||
SavedNetworks nets(store);
|
||||
nets.add("home", "password1");
|
||||
TEST_ASSERT_FALSE(nets.find("home")->fixed);
|
||||
}
|
||||
|
||||
void test_ip_setting_survives_reload() {
|
||||
MemoryStore store;
|
||||
SavedNetworks nets(store);
|
||||
nets.add("home", "password1");
|
||||
nets.add("bench", "");
|
||||
roro::net::FixedIp f;
|
||||
TEST_ASSERT_EQUAL_STRING("", roro::net::parseFixed("10.39.39.13/24 10.39.39.1", f).c_str());
|
||||
TEST_ASSERT_EQUAL_STRING("", nets.setIp("bench", &f).c_str());
|
||||
|
||||
SavedNetworks again(store);
|
||||
again.load();
|
||||
TEST_ASSERT_FALSE(again.find("home")->fixed);
|
||||
TEST_ASSERT_TRUE(again.find("bench")->fixed);
|
||||
TEST_ASSERT_EQUAL_STRING("10.39.39.13/24 10.39.39.1", roro::net::formatFixed(again.find("bench")->ip).c_str());
|
||||
|
||||
TEST_ASSERT_EQUAL_STRING("", again.setIp("bench", nullptr).c_str()); // back to Automatic
|
||||
SavedNetworks third(store);
|
||||
third.load();
|
||||
TEST_ASSERT_FALSE(third.find("bench")->fixed);
|
||||
}
|
||||
|
||||
void test_ip_setting_is_checked() {
|
||||
MemoryStore store;
|
||||
SavedNetworks nets(store);
|
||||
nets.add("bench", "");
|
||||
roro::net::FixedIp bad{0x0A272700, 24, 0}; // 10.39.39.0: the network's own address
|
||||
TEST_ASSERT_EQUAL_STRING("10.39.39.0 is the network's own address", nets.setIp("bench", &bad).c_str());
|
||||
TEST_ASSERT_FALSE(nets.find("bench")->fixed);
|
||||
roro::net::FixedIp ok{0x0A27270D, 24, 0};
|
||||
TEST_ASSERT_EQUAL_STRING("Not a saved network", nets.setIp("nowhere", &ok).c_str());
|
||||
}
|
||||
|
||||
// Forgetting a network moves the ones after it: each keeps its own setting.
|
||||
void test_ip_setting_follows_its_network() {
|
||||
MemoryStore store;
|
||||
SavedNetworks nets(store);
|
||||
nets.add("a", "");
|
||||
nets.add("b", "");
|
||||
nets.add("c", "");
|
||||
roro::net::FixedIp f{0x0A27270D, 24, 0};
|
||||
nets.setIp("c", &f);
|
||||
nets.forget("a");
|
||||
SavedNetworks again(store);
|
||||
again.load();
|
||||
TEST_ASSERT_FALSE(again.find("b")->fixed);
|
||||
TEST_ASSERT_TRUE(again.find("c")->fixed);
|
||||
// And changing the password keeps it.
|
||||
again.add("c", "password2");
|
||||
TEST_ASSERT_TRUE(again.find("c")->fixed);
|
||||
}
|
||||
|
||||
// A stored setting that no longer passes the checks falls back to Automatic.
|
||||
void test_bad_stored_ip_setting_is_ignored() {
|
||||
MemoryStore store;
|
||||
SavedNetworks nets(store);
|
||||
nets.add("bench", "");
|
||||
store.strings["net0_ip"] = "10.39.39.13/99";
|
||||
SavedNetworks again(store);
|
||||
again.load();
|
||||
TEST_ASSERT_FALSE(again.find("bench")->fixed);
|
||||
}
|
||||
|
||||
int main() {
|
||||
UNITY_BEGIN();
|
||||
RUN_TEST(test_empty_store_has_no_networks);
|
||||
@@ -107,5 +177,10 @@ int main() {
|
||||
RUN_TEST(test_validation_follows_wifi_limits);
|
||||
RUN_TEST(test_hidden_flag_survives_reload);
|
||||
RUN_TEST(test_find);
|
||||
RUN_TEST(test_new_network_is_automatic);
|
||||
RUN_TEST(test_ip_setting_survives_reload);
|
||||
RUN_TEST(test_ip_setting_is_checked);
|
||||
RUN_TEST(test_ip_setting_follows_its_network);
|
||||
RUN_TEST(test_bad_stored_ip_setting_is_ignored);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user