|
|
@@ -451,3 +451,88 @@ func TestNoDERPHomeWarnableManual(t *testing.T) {
|
|
|
t.Fatalf("got unexpected noDERPHomeWarnable warnable: %v", ws)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestControlHealth(t *testing.T) {
|
|
|
+ ht := Tracker{}
|
|
|
+ ht.SetIPNState("NeedsLogin", true)
|
|
|
+ ht.GotStreamedMapResponse()
|
|
|
+
|
|
|
+ ht.SetControlHealth([]string{"Test message"})
|
|
|
+ state := ht.CurrentState()
|
|
|
+ warning, ok := state.Warnings["control-health"]
|
|
|
+
|
|
|
+ if !ok {
|
|
|
+ t.Fatal("no warning found in current state with code 'control-health'")
|
|
|
+ }
|
|
|
+ if got, want := warning.Title, "Coordination server reports an issue"; got != want {
|
|
|
+ t.Errorf("warning.Title = %q, want %q", got, want)
|
|
|
+ }
|
|
|
+ if got, want := warning.Severity, SeverityMedium; got != want {
|
|
|
+ t.Errorf("warning.Severity = %s, want %s", got, want)
|
|
|
+ }
|
|
|
+ if got, want := warning.Text, "The coordination server is reporting an health issue: Test message"; got != want {
|
|
|
+ t.Errorf("warning.Text = %q, want %q", got, want)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControlHealthNotifiesOnChange(t *testing.T) {
|
|
|
+ ht := Tracker{}
|
|
|
+ ht.SetIPNState("NeedsLogin", true)
|
|
|
+ ht.GotStreamedMapResponse()
|
|
|
+
|
|
|
+ gotNotified := false
|
|
|
+ ht.registerSyncWatcher(func(_ *Warnable, _ *UnhealthyState) {
|
|
|
+ gotNotified = true
|
|
|
+ })
|
|
|
+
|
|
|
+ ht.SetControlHealth([]string{"Test message"})
|
|
|
+
|
|
|
+ if !gotNotified {
|
|
|
+ t.Errorf("watcher did not get called, want it to be called")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControlHealthNoNotifyOnUnchanged(t *testing.T) {
|
|
|
+ ht := Tracker{}
|
|
|
+ ht.SetIPNState("NeedsLogin", true)
|
|
|
+ ht.GotStreamedMapResponse()
|
|
|
+
|
|
|
+ // Set up an existing control health issue
|
|
|
+ ht.SetControlHealth([]string{"Test message"})
|
|
|
+
|
|
|
+ // Now register our watcher
|
|
|
+ gotNotified := false
|
|
|
+ ht.registerSyncWatcher(func(_ *Warnable, _ *UnhealthyState) {
|
|
|
+ gotNotified = true
|
|
|
+ })
|
|
|
+
|
|
|
+ // Send the same control health message again - should not notify
|
|
|
+ ht.SetControlHealth([]string{"Test message"})
|
|
|
+
|
|
|
+ if gotNotified {
|
|
|
+ t.Errorf("watcher got called, want it to not be called")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControlHealthIgnoredOutsideMapPoll(t *testing.T) {
|
|
|
+ ht := Tracker{}
|
|
|
+ ht.SetIPNState("NeedsLogin", true)
|
|
|
+
|
|
|
+ gotNotified := false
|
|
|
+ ht.registerSyncWatcher(func(_ *Warnable, _ *UnhealthyState) {
|
|
|
+ gotNotified = true
|
|
|
+ })
|
|
|
+
|
|
|
+ ht.SetControlHealth([]string{"Test message"})
|
|
|
+
|
|
|
+ state := ht.CurrentState()
|
|
|
+ _, ok := state.Warnings["control-health"]
|
|
|
+
|
|
|
+ if ok {
|
|
|
+ t.Error("got a warning with code 'control-health', want none")
|
|
|
+ }
|
|
|
+
|
|
|
+ if gotNotified {
|
|
|
+ t.Error("watcher got called, want it to not be called")
|
|
|
+ }
|
|
|
+}
|