feat: add automatic network failover
This commit is contained in:
1 parent
03c0ad81fe
commit
366b086713
23 files changed
+600
-86
No files matched your search
@@ -113,6 +113,7 @@ TEST(MQTTPrefsSerializer, RoundTripsEveryGroupAndNumericSlotKeys) {
|
||||
source.snmp_enabled = 1;
|
||||
source.radio_watchdog_minutes = 120;
|
||||
source.alert_enabled = 1;
|
||||
source.network_setup_complete = 1;
|
||||
strcpy(source.alert_psk_hex, "0123456789abcdef0123456789abcdef");
|
||||
strcpy(source.alert_hashtag, "#ops");
|
||||
strcpy(source.alert_region, "PNW");
|
||||
@@ -137,6 +138,19 @@ TEST(MQTTPrefsSerializer, RoundTripsEveryGroupAndNumericSlotKeys) {
|
||||
EXPECT_EQ(0x8001, loaded.mqtt_slot_packet_filter[5]);
|
||||
EXPECT_EQ(MQTT_NEIGHBORS_MAX_INTERVAL_MS, loaded.mqtt_neighbors_interval);
|
||||
EXPECT_STREQ("PNW", loaded.alert_region);
|
||||
EXPECT_EQ(1, loaded.network_setup_complete);
|
||||
}
|
||||
|
||||
TEST(MQTTPrefsSerializer, NetworkOnboardingSupportsWifiAndEthernetOnlyInstalls) {
|
||||
MQTTPrefs prefs = defaults();
|
||||
EXPECT_FALSE(mqttNetworkSetupComplete(&prefs));
|
||||
|
||||
strcpy(prefs.wifi_ssid, "existing-install");
|
||||
EXPECT_TRUE(mqttNetworkSetupComplete(&prefs));
|
||||
|
||||
prefs.wifi_ssid[0] = 0;
|
||||
prefs.network_setup_complete = 1;
|
||||
EXPECT_TRUE(mqttNetworkSetupComplete(&prefs));
|
||||
}
|
||||
|
||||
TEST(MQTTPrefsSerializer, MissingOptionalKeysKeepDefaults) {
|
||||
|
||||
@@ -20,6 +20,62 @@ TEST(NetworkPolicy, NoTransitionHasNoMqttSideEffects) {
|
||||
EXPECT_FALSE(actions.retry_disconnected_slots_now);
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, LinkSwitchReconnectsMqttSlotsImmediately) {
|
||||
const auto actions = NetworkPolicy::mqttActions(NetworkTransition::Switched);
|
||||
EXPECT_TRUE(actions.disconnect_slots);
|
||||
EXPECT_TRUE(actions.retry_disconnected_slots_now);
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, BootPrefersEthernetAndOtherwiseUsesConfiguredWifi) {
|
||||
EXPECT_EQ(NetworkMedium::Ethernet, NetworkPolicy::bootSelection(true, true));
|
||||
EXPECT_EQ(NetworkMedium::WiFi, NetworkPolicy::bootSelection(false, true));
|
||||
EXPECT_EQ(NetworkMedium::None, NetworkPolicy::bootSelection(false, false));
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, EthernetFailureWaitsForGraceAndConnectedWifi) {
|
||||
NetworkPolicy::AutomaticSelectionInput input = {
|
||||
NetworkMedium::Ethernet, false, true, true, false, 0,
|
||||
NetworkPolicy::kEthernetDownGraceMs - 1};
|
||||
EXPECT_EQ(NetworkMedium::Ethernet, NetworkPolicy::automaticSelection(input));
|
||||
input.selected_down_ms = NetworkPolicy::kEthernetDownGraceMs;
|
||||
EXPECT_EQ(NetworkMedium::WiFi, NetworkPolicy::automaticSelection(input));
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, FailbackRequiresStableEthernet) {
|
||||
NetworkPolicy::AutomaticSelectionInput input = {
|
||||
NetworkMedium::WiFi, true, true, true, false,
|
||||
NetworkPolicy::kEthernetFailbackStableMs - 1, 0};
|
||||
EXPECT_EQ(NetworkMedium::WiFi, NetworkPolicy::automaticSelection(input));
|
||||
input.ethernet_stable_ms = NetworkPolicy::kEthernetFailbackStableMs;
|
||||
EXPECT_EQ(NetworkMedium::Ethernet, NetworkPolicy::automaticSelection(input));
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, SwitchingLockPinsTheCurrentMedium) {
|
||||
const NetworkPolicy::AutomaticSelectionInput input = {
|
||||
NetworkMedium::WiFi, true, true, true, true,
|
||||
NetworkPolicy::kEthernetFailbackStableMs, 0};
|
||||
EXPECT_EQ(NetworkMedium::WiFi, NetworkPolicy::automaticSelection(input));
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, NtpIsScheduledOncePerConnectivityEdge) {
|
||||
EXPECT_TRUE(NetworkPolicy::ntpPendingAfterConnectivitySample(
|
||||
false, false, false, true));
|
||||
EXPECT_FALSE(NetworkPolicy::ntpPendingAfterConnectivitySample(
|
||||
false, false, true, true));
|
||||
EXPECT_TRUE(NetworkPolicy::ntpPendingAfterConnectivitySample(
|
||||
false, true, true, true));
|
||||
EXPECT_FALSE(NetworkPolicy::ntpPendingAfterConnectivitySample(
|
||||
true, false, false, true));
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, FailedNtpSyncWaitsForThirtySecondRetryBoundary) {
|
||||
EXPECT_FALSE(NetworkPolicy::ntpRetryDue(false, true, 29999, 0));
|
||||
EXPECT_TRUE(NetworkPolicy::ntpRetryDue(false, true, 30000, 0));
|
||||
EXPECT_FALSE(NetworkPolicy::ntpRetryDue(true, true, 60000, 0));
|
||||
EXPECT_FALSE(NetworkPolicy::ntpRetryDue(false, false, 60000, 0));
|
||||
EXPECT_TRUE(NetworkPolicy::ntpRetryDue(false, true, 10, 0xffff8000u));
|
||||
}
|
||||
|
||||
TEST(NetworkPolicy, StartOtaUsesReachableSelectedNetworkByDefault) {
|
||||
EXPECT_TRUE(NetworkPolicy::startOtaUsesSelectedNetwork(false, true));
|
||||
EXPECT_FALSE(NetworkPolicy::startOtaUsesSelectedNetwork(false, false));
|
||||
|
||||
Reference in new issue
Block a user