github.com/diptanu/nomad@v0.5.7-0.20170516172507-d72e86cbe3d9/command/plan_test.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 10 "github.com/hashicorp/nomad/testutil" 11 "github.com/mitchellh/cli" 12 ) 13 14 func TestPlanCommand_Implements(t *testing.T) { 15 var _ cli.Command = &RunCommand{} 16 } 17 18 func TestPlanCommand_Fails(t *testing.T) { 19 ui := new(cli.MockUi) 20 cmd := &PlanCommand{Meta: Meta{Ui: ui}} 21 22 // Create a server 23 s := testutil.NewTestServer(t, nil) 24 defer s.Stop() 25 os.Setenv("NOMAD_ADDR", fmt.Sprintf("http://%s", s.HTTPAddr)) 26 27 // Fails on misuse 28 if code := cmd.Run([]string{"some", "bad", "args"}); code != 255 { 29 t.Fatalf("expected exit code 1, got: %d", code) 30 } 31 if out := ui.ErrorWriter.String(); !strings.Contains(out, cmd.Help()) { 32 t.Fatalf("expected help output, got: %s", out) 33 } 34 ui.ErrorWriter.Reset() 35 36 // Fails when specified file does not exist 37 if code := cmd.Run([]string{"/unicorns/leprechauns"}); code != 255 { 38 t.Fatalf("expect exit 255, got: %d", code) 39 } 40 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 41 t.Fatalf("expect getting job struct error, got: %s", out) 42 } 43 ui.ErrorWriter.Reset() 44 45 // Fails on invalid HCL 46 fh1, err := ioutil.TempFile("", "nomad") 47 if err != nil { 48 t.Fatalf("err: %s", err) 49 } 50 defer os.Remove(fh1.Name()) 51 if _, err := fh1.WriteString("nope"); err != nil { 52 t.Fatalf("err: %s", err) 53 } 54 if code := cmd.Run([]string{fh1.Name()}); code != 255 { 55 t.Fatalf("expect exit 255, got: %d", code) 56 } 57 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 58 t.Fatalf("expect parsing error, got: %s", out) 59 } 60 ui.ErrorWriter.Reset() 61 62 // Fails on invalid job spec 63 fh2, err := ioutil.TempFile("", "nomad") 64 if err != nil { 65 t.Fatalf("err: %s", err) 66 } 67 defer os.Remove(fh2.Name()) 68 if _, err := fh2.WriteString(`job "job1" {}`); err != nil { 69 t.Fatalf("err: %s", err) 70 } 71 if code := cmd.Run([]string{fh2.Name()}); code != 255 { 72 t.Fatalf("expect exit 255, got: %d", code) 73 } 74 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error during plan") { 75 t.Fatalf("expect validation error, got: %s", out) 76 } 77 ui.ErrorWriter.Reset() 78 79 // Fails on connection failure (requires a valid job) 80 fh3, err := ioutil.TempFile("", "nomad") 81 if err != nil { 82 t.Fatalf("err: %s", err) 83 } 84 defer os.Remove(fh3.Name()) 85 _, err = fh3.WriteString(` 86 job "job1" { 87 type = "service" 88 datacenters = [ "dc1" ] 89 group "group1" { 90 count = 1 91 task "task1" { 92 driver = "exec" 93 resources = { 94 cpu = 1000 95 memory = 512 96 } 97 } 98 } 99 }`) 100 if err != nil { 101 t.Fatalf("err: %s", err) 102 } 103 if code := cmd.Run([]string{"-address=nope", fh3.Name()}); code != 255 { 104 t.Fatalf("expected exit code 255, got: %d", code) 105 } 106 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error during plan") { 107 t.Fatalf("expected failed query error, got: %s", out) 108 } 109 } 110 111 func TestPlanCommand_From_STDIN(t *testing.T) { 112 stdinR, stdinW, err := os.Pipe() 113 if err != nil { 114 t.Fatalf("err: %s", err) 115 } 116 117 ui := new(cli.MockUi) 118 cmd := &PlanCommand{ 119 Meta: Meta{Ui: ui}, 120 JobGetter: JobGetter{testStdin: stdinR}, 121 } 122 123 go func() { 124 stdinW.WriteString(` 125 job "job1" { 126 type = "service" 127 datacenters = [ "dc1" ] 128 group "group1" { 129 count = 1 130 task "task1" { 131 driver = "exec" 132 resources = { 133 cpu = 1000 134 memory = 512 135 } 136 } 137 } 138 }`) 139 stdinW.Close() 140 }() 141 142 args := []string{"-"} 143 if code := cmd.Run(args); code != 255 { 144 t.Fatalf("expected exit code 255, got %d: %q", code, ui.ErrorWriter.String()) 145 } 146 147 if out := ui.ErrorWriter.String(); !strings.Contains(out, "connection refused") { 148 t.Fatalf("expected connection refused error, got: %s", out) 149 } 150 ui.ErrorWriter.Reset() 151 } 152 153 func TestPlanCommand_From_URL(t *testing.T) { 154 ui := new(cli.MockUi) 155 cmd := &PlanCommand{ 156 Meta: Meta{Ui: ui}, 157 } 158 159 args := []string{"https://example.com/foo/bar"} 160 if code := cmd.Run(args); code != 255 { 161 t.Fatalf("expected exit code 255, got %d: %q", code, ui.ErrorWriter.String()) 162 } 163 164 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting jobfile") { 165 t.Fatalf("expected error getting jobfile, got: %s", out) 166 } 167 }