diff --git a/command/monitor_test.go b/command/monitor_test.go new file mode 100644 index 000000000..701a73f03 --- /dev/null +++ b/command/monitor_test.go @@ -0,0 +1,115 @@ +package command + +import ( + "strings" + "testing" + "time" + + "github.com/hashicorp/nomad/api" + "github.com/hashicorp/nomad/nomad/structs" + "github.com/mitchellh/cli" +) + +func TestMonitor_Update(t *testing.T) { + ui := new(cli.MockUi) + mon := newMonitor(ui, nil) + + // Basic eval updates work + eval := &api.Evaluation{ + Status: "pending", + NodeID: "node1", + Wait: 10 * time.Second, + } + mon.update(eval, nil) + + // Logs were output + out := ui.OutputWriter.String() + if !strings.Contains(out, "pending") { + t.Fatalf("missing status\n\n%s", out) + } + if !strings.Contains(out, "node1") { + t.Fatalf("missing node\n\n%s", out) + } + if !strings.Contains(out, "10s") { + t.Fatalf("missing eval wait\n\n%s", out) + } + ui.OutputWriter.Reset() + + // No logs sent if no state update + mon.update(eval, nil) + if out := ui.OutputWriter.String(); out != "" { + t.Fatalf("expected no output\n\n%s", out) + } + + // Updates cause more logs to output + eval.Status = "complete" + mon.update(eval, nil) + out = ui.OutputWriter.String() + if !strings.Contains(out, "complete") { + t.Fatalf("missing status\n\n%s", out) + } + ui.OutputWriter.Reset() + + // Allocations write new logs + allocs := []*api.AllocationListStub{ + &api.AllocationListStub{ + ID: "alloc1", + TaskGroup: "group1", + NodeID: "node1", + DesiredStatus: "running", + ClientStatus: "pending", + }, + } + mon.update(eval, allocs) + + // Logs were output + out = ui.OutputWriter.String() + if !strings.Contains(out, "alloc1") { + t.Fatalf("missing alloc\n\n%s", out) + } + if !strings.Contains(out, "group1") { + t.Fatalf("missing group\n\n%s", out) + } + if !strings.Contains(out, "node1") { + t.Fatalf("missing node\n\n%s", out) + } + ui.OutputWriter.Reset() + + // No change yields no logs + mon.update(eval, allocs) + if out := ui.OutputWriter.String(); out != "" { + t.Fatalf("expected no output\n\n%s", out) + } + ui.OutputWriter.Reset() + + // Updates cause more log lines + allocs[0].ClientStatus = "running" + mon.update(eval, allocs) + out = ui.OutputWriter.String() + if !strings.Contains(out, "alloc1") { + t.Fatalf("missing alloc\n\n%s", out) + } + if !strings.Contains(out, "pending") { + t.Fatalf("missing old status\n\n%s", out) + } + if !strings.Contains(out, "running") { + t.Fatalf("missing new status\n\n%s", out) + } + ui.OutputWriter.Reset() + + // New allocs with desired status failed warns + allocs = append(allocs, &api.AllocationListStub{ + TaskGroup: "group2", + DesiredStatus: structs.AllocDesiredStatusFailed, + }) + mon.update(eval, allocs) + + // Scheduling failure was logged + out = ui.OutputWriter.String() + if !strings.Contains(out, "group2") { + t.Fatalf("missing group\n\n%s", out) + } + if !strings.Contains(out, "Scheduling failed") { + t.Fatalf("missing failure\n\n%s", out) + } +}