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