github.com/diptanu/nomad@v0.5.7-0.20170516172507-d72e86cbe3d9/command/run_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 TestRunCommand_Implements(t *testing.T) { 15 var _ cli.Command = &RunCommand{} 16 } 17 18 func TestRunCommand_Output_Json(t *testing.T) { 19 ui := new(cli.MockUi) 20 cmd := &RunCommand{Meta: Meta{Ui: ui}} 21 22 fh, err := ioutil.TempFile("", "nomad") 23 if err != nil { 24 t.Fatalf("err: %s", err) 25 } 26 defer os.Remove(fh.Name()) 27 _, err = fh.WriteString(` 28 job "job1" { 29 type = "service" 30 datacenters = [ "dc1" ] 31 group "group1" { 32 count = 1 33 task "task1" { 34 driver = "exec" 35 resources = { 36 cpu = 1000 37 memory = 512 38 } 39 } 40 } 41 }`) 42 if err != nil { 43 t.Fatalf("err: %s", err) 44 } 45 if code := cmd.Run([]string{"-output", fh.Name()}); code != 0 { 46 t.Fatalf("expected exit code 0, got: %d", code) 47 } 48 if out := ui.OutputWriter.String(); !strings.Contains(out, `"Type": "service",`) { 49 t.Fatalf("Expected JSON output: %v", out) 50 } 51 } 52 53 func TestRunCommand_Fails(t *testing.T) { 54 ui := new(cli.MockUi) 55 cmd := &RunCommand{Meta: Meta{Ui: ui}} 56 57 // Create a server 58 s := testutil.NewTestServer(t, nil) 59 defer s.Stop() 60 os.Setenv("NOMAD_ADDR", fmt.Sprintf("http://%s", s.HTTPAddr)) 61 62 // Fails on misuse 63 if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 { 64 t.Fatalf("expected exit code 1, got: %d", code) 65 } 66 if out := ui.ErrorWriter.String(); !strings.Contains(out, cmd.Help()) { 67 t.Fatalf("expected help output, got: %s", out) 68 } 69 ui.ErrorWriter.Reset() 70 71 // Fails when specified file does not exist 72 if code := cmd.Run([]string{"/unicorns/leprechauns"}); code != 1 { 73 t.Fatalf("expect exit 1, got: %d", code) 74 } 75 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 76 t.Fatalf("expect getting job struct error, got: %s", out) 77 } 78 ui.ErrorWriter.Reset() 79 80 // Fails on invalid HCL 81 fh1, err := ioutil.TempFile("", "nomad") 82 if err != nil { 83 t.Fatalf("err: %s", err) 84 } 85 defer os.Remove(fh1.Name()) 86 if _, err := fh1.WriteString("nope"); err != nil { 87 t.Fatalf("err: %s", err) 88 } 89 if code := cmd.Run([]string{fh1.Name()}); code != 1 { 90 t.Fatalf("expect exit 1, got: %d", code) 91 } 92 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 93 t.Fatalf("expect parsing error, got: %s", out) 94 } 95 ui.ErrorWriter.Reset() 96 97 // Fails on invalid job spec 98 fh2, err := ioutil.TempFile("", "nomad") 99 if err != nil { 100 t.Fatalf("err: %s", err) 101 } 102 defer os.Remove(fh2.Name()) 103 if _, err := fh2.WriteString(`job "job1" {}`); err != nil { 104 t.Fatalf("err: %s", err) 105 } 106 if code := cmd.Run([]string{fh2.Name()}); code != 1 { 107 t.Fatalf("expect exit 1, got: %d", code) 108 } 109 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error submitting job") { 110 t.Fatalf("expect validation error, got: %s", out) 111 } 112 ui.ErrorWriter.Reset() 113 114 // Fails on connection failure (requires a valid job) 115 fh3, err := ioutil.TempFile("", "nomad") 116 if err != nil { 117 t.Fatalf("err: %s", err) 118 } 119 defer os.Remove(fh3.Name()) 120 _, err = fh3.WriteString(` 121 job "job1" { 122 type = "service" 123 datacenters = [ "dc1" ] 124 group "group1" { 125 count = 1 126 task "task1" { 127 driver = "exec" 128 resources = { 129 cpu = 1000 130 memory = 512 131 } 132 } 133 } 134 }`) 135 if err != nil { 136 t.Fatalf("err: %s", err) 137 } 138 if code := cmd.Run([]string{"-address=nope", fh3.Name()}); code != 1 { 139 t.Fatalf("expected exit code 1, got: %d", code) 140 } 141 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error submitting job") { 142 t.Fatalf("expected failed query error, got: %s", out) 143 } 144 145 // Fails on invalid check-index (requires a valid job) 146 if code := cmd.Run([]string{"-check-index=bad", fh3.Name()}); code != 1 { 147 t.Fatalf("expected exit code 1, got: %d", code) 148 } 149 if out := ui.ErrorWriter.String(); !strings.Contains(out, "parsing check-index") { 150 t.Fatalf("expected parse error, got: %s", out) 151 } 152 ui.ErrorWriter.Reset() 153 154 } 155 156 func TestRunCommand_From_STDIN(t *testing.T) { 157 stdinR, stdinW, err := os.Pipe() 158 if err != nil { 159 t.Fatalf("err: %s", err) 160 } 161 162 ui := new(cli.MockUi) 163 cmd := &RunCommand{ 164 Meta: Meta{Ui: ui}, 165 JobGetter: JobGetter{testStdin: stdinR}, 166 } 167 168 go func() { 169 stdinW.WriteString(` 170 job "job1" { 171 type = "service" 172 datacenters = [ "dc1" ] 173 group "group1" { 174 count = 1 175 task "task1" { 176 driver = "exec" 177 resources = { 178 cpu = 1000 179 memory = 512 180 } 181 } 182 } 183 }`) 184 stdinW.Close() 185 }() 186 187 args := []string{"-"} 188 if code := cmd.Run(args); code != 1 { 189 t.Fatalf("expected exit code 1, got %d: %q", code, ui.ErrorWriter.String()) 190 } 191 192 if out := ui.ErrorWriter.String(); !strings.Contains(out, "connection refused") { 193 t.Fatalf("expected connection refused error, got: %s", out) 194 } 195 ui.ErrorWriter.Reset() 196 } 197 198 func TestRunCommand_From_URL(t *testing.T) { 199 ui := new(cli.MockUi) 200 cmd := &RunCommand{ 201 Meta: Meta{Ui: ui}, 202 } 203 204 args := []string{"https://example.com/foo/bar"} 205 if code := cmd.Run(args); code != 1 { 206 t.Fatalf("expected exit code 1, got %d: %q", code, ui.ErrorWriter.String()) 207 } 208 209 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting jobfile") { 210 t.Fatalf("expected error getting jobfile, got: %s", out) 211 } 212 }