github.com/mattyr/nomad@v0.3.3-0.20160919021406-3485a065154a/command/validate_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 TestValidateCommand_Implements(t *testing.T) { 13 var _ cli.Command = &ValidateCommand{} 14 } 15 16 func TestValidateCommand(t *testing.T) { 17 ui := new(cli.MockUi) 18 cmd := &ValidateCommand{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{fh.Name()}); code != 0 { 44 t.Fatalf("expect exit 0, got: %d: %s", code, ui.ErrorWriter.String()) 45 } 46 } 47 48 func TestValidateCommand_Fails(t *testing.T) { 49 ui := new(cli.MockUi) 50 cmd := &ValidateCommand{Meta: Meta{Ui: ui}} 51 52 // Fails on misuse 53 if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 { 54 t.Fatalf("expected exit code 1, got: %d", code) 55 } 56 if out := ui.ErrorWriter.String(); !strings.Contains(out, cmd.Help()) { 57 t.Fatalf("expected help output, got: %s", out) 58 } 59 ui.ErrorWriter.Reset() 60 61 // Fails when specified file does not exist 62 if code := cmd.Run([]string{"/unicorns/leprechauns"}); code != 1 { 63 t.Fatalf("expect exit 1, got: %d", code) 64 } 65 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 66 t.Fatalf("expect getting job struct error, got: %s", out) 67 } 68 ui.ErrorWriter.Reset() 69 70 // Fails on invalid HCL 71 fh1, err := ioutil.TempFile("", "nomad") 72 if err != nil { 73 t.Fatalf("err: %s", err) 74 } 75 defer os.Remove(fh1.Name()) 76 if _, err := fh1.WriteString("nope"); err != nil { 77 t.Fatalf("err: %s", err) 78 } 79 if code := cmd.Run([]string{fh1.Name()}); code != 1 { 80 t.Fatalf("expect exit 1, got: %d", code) 81 } 82 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting job struct") { 83 t.Fatalf("expect parsing error, got: %s", out) 84 } 85 ui.ErrorWriter.Reset() 86 87 // Fails on invalid job spec 88 fh2, err := ioutil.TempFile("", "nomad") 89 if err != nil { 90 t.Fatalf("err: %s", err) 91 } 92 defer os.Remove(fh2.Name()) 93 if _, err := fh2.WriteString(`job "job1" {}`); err != nil { 94 t.Fatalf("err: %s", err) 95 } 96 if code := cmd.Run([]string{fh2.Name()}); code != 1 { 97 t.Fatalf("expect exit 1, got: %d", code) 98 } 99 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error validating") { 100 t.Fatalf("expect validation error, got: %s", out) 101 } 102 ui.ErrorWriter.Reset() 103 } 104 105 func TestValidateCommand_From_STDIN(t *testing.T) { 106 stdinR, stdinW, err := os.Pipe() 107 if err != nil { 108 t.Fatalf("err: %s", err) 109 } 110 111 ui := new(cli.MockUi) 112 cmd := &ValidateCommand{ 113 Meta: Meta{Ui: ui}, 114 JobGetter: JobGetter{testStdin: stdinR}, 115 } 116 117 go func() { 118 stdinW.WriteString(` 119 job "job1" { 120 type = "service" 121 datacenters = [ "dc1" ] 122 group "group1" { 123 count = 1 124 task "task1" { 125 driver = "exec" 126 resources = { 127 cpu = 1000 128 memory = 512 129 } 130 } 131 } 132 }`) 133 stdinW.Close() 134 }() 135 136 args := []string{"-"} 137 if code := cmd.Run(args); code != 0 { 138 t.Fatalf("expected exit code 0, got %d: %q", code, ui.ErrorWriter.String()) 139 } 140 ui.ErrorWriter.Reset() 141 } 142 143 func TestValidateCommand_From_URL(t *testing.T) { 144 ui := new(cli.MockUi) 145 cmd := &RunCommand{ 146 Meta: Meta{Ui: ui}, 147 } 148 149 args := []string{"https://example.com/foo/bar"} 150 if code := cmd.Run(args); code != 1 { 151 t.Fatalf("expected exit code 1, got %d: %q", code, ui.ErrorWriter.String()) 152 } 153 154 if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error getting jobfile") { 155 t.Fatalf("expected error getting jobfile, got: %s", out) 156 } 157 }