github.com/davecheney/cmd@v0.0.0-20151013155037-62127977de0d/cmd_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the LGPLv3, see LICENSE file for details. 3 4 package cmd_test 5 6 import ( 7 "bytes" 8 "fmt" 9 "os" 10 "path/filepath" 11 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/cmd" 15 "github.com/juju/cmd/cmdtesting" 16 ) 17 18 type CmdSuite struct{} 19 20 var _ = gc.Suite(&CmdSuite{}) 21 22 func (s *CmdSuite) TestContext(c *gc.C) { 23 ctx := cmdtesting.Context(c) 24 c.Assert(ctx.AbsPath("/foo/bar"), gc.Equals, "/foo/bar") 25 c.Assert(ctx.AbsPath("foo/bar"), gc.Equals, filepath.Join(ctx.Dir, "foo/bar")) 26 } 27 28 func (s *CmdSuite) TestContextGetenv(c *gc.C) { 29 ctx := cmdtesting.Context(c) 30 ctx.Env = make(map[string]string) 31 before := ctx.Getenv("foo") 32 ctx.Env["foo"] = "bar" 33 after := ctx.Getenv("foo") 34 35 c.Check(before, gc.Equals, "") 36 c.Check(after, gc.Equals, "bar") 37 } 38 39 func (s *CmdSuite) TestContextSetenv(c *gc.C) { 40 ctx := cmdtesting.Context(c) 41 before := ctx.Env["foo"] 42 ctx.Setenv("foo", "bar") 43 after := ctx.Env["foo"] 44 45 c.Check(before, gc.Equals, "") 46 c.Check(after, gc.Equals, "bar") 47 } 48 49 func (s *CmdSuite) TestInfo(c *gc.C) { 50 minimal := &TestCommand{Name: "verb", Minimal: true} 51 help := minimal.Info().Help(cmdtesting.NewFlagSet()) 52 c.Assert(string(help), gc.Equals, minimalHelp) 53 54 full := &TestCommand{Name: "verb"} 55 f := cmdtesting.NewFlagSet() 56 var ignored string 57 f.StringVar(&ignored, "option", "", "option-doc") 58 help = full.Info().Help(f) 59 c.Assert(string(help), gc.Equals, fullHelp) 60 61 optionInfo := full.Info() 62 optionInfo.Doc = "" 63 help = optionInfo.Help(f) 64 c.Assert(string(help), gc.Equals, optionHelp) 65 } 66 67 var initErrorTests = []struct { 68 c *TestCommand 69 help string 70 }{ 71 {&TestCommand{Name: "verb"}, fullHelp}, 72 {&TestCommand{Name: "verb", Minimal: true}, minimalHelp}, 73 } 74 75 func (s *CmdSuite) TestMainInitError(c *gc.C) { 76 for _, t := range initErrorTests { 77 ctx := cmdtesting.Context(c) 78 result := cmd.Main(t.c, ctx, []string{"--unknown"}) 79 c.Assert(result, gc.Equals, 2) 80 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 81 expected := "error: flag provided but not defined: --unknown\n" 82 c.Assert(bufferString(ctx.Stderr), gc.Equals, expected) 83 } 84 } 85 86 func (s *CmdSuite) TestMainRunError(c *gc.C) { 87 ctx := cmdtesting.Context(c) 88 result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "error"}) 89 c.Assert(result, gc.Equals, 1) 90 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 91 c.Assert(bufferString(ctx.Stderr), gc.Equals, "error: BAM!\n") 92 } 93 94 func (s *CmdSuite) TestMainRunSilentError(c *gc.C) { 95 ctx := cmdtesting.Context(c) 96 result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "silent-error"}) 97 c.Assert(result, gc.Equals, 1) 98 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 99 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 100 } 101 102 func (s *CmdSuite) TestMainSuccess(c *gc.C) { 103 ctx := cmdtesting.Context(c) 104 result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "success!"}) 105 c.Assert(result, gc.Equals, 0) 106 c.Assert(bufferString(ctx.Stdout), gc.Equals, "success!\n") 107 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 108 } 109 110 func (s *CmdSuite) TestStdin(c *gc.C) { 111 const phrase = "Do you, Juju?" 112 ctx := cmdtesting.Context(c) 113 ctx.Stdin = bytes.NewBuffer([]byte(phrase)) 114 result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{"--option", "echo"}) 115 c.Assert(result, gc.Equals, 0) 116 c.Assert(bufferString(ctx.Stdout), gc.Equals, phrase) 117 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 118 } 119 120 func (s *CmdSuite) TestMainHelp(c *gc.C) { 121 for _, arg := range []string{"-h", "--help"} { 122 ctx := cmdtesting.Context(c) 123 result := cmd.Main(&TestCommand{Name: "verb"}, ctx, []string{arg}) 124 c.Assert(result, gc.Equals, 0) 125 c.Assert(bufferString(ctx.Stdout), gc.Equals, fullHelp) 126 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 127 } 128 } 129 130 func (s *CmdSuite) TestDefaultContextReturnsErrorInDeletedDirectory(c *gc.C) { 131 ctx := cmdtesting.Context(c) 132 wd, err := os.Getwd() 133 c.Assert(err, gc.IsNil) 134 missing := ctx.Dir + "/missing" 135 err = os.Mkdir(missing, 0700) 136 c.Assert(err, gc.IsNil) 137 err = os.Chdir(missing) 138 c.Assert(err, gc.IsNil) 139 defer os.Chdir(wd) 140 err = os.Remove(missing) 141 c.Assert(err, gc.IsNil) 142 ctx, err = cmd.DefaultContext() 143 c.Assert(err, gc.ErrorMatches, `getwd: no such file or directory`) 144 c.Assert(ctx, gc.IsNil) 145 } 146 147 func (s *CmdSuite) TestCheckEmpty(c *gc.C) { 148 c.Assert(cmd.CheckEmpty(nil), gc.IsNil) 149 c.Assert(cmd.CheckEmpty([]string{"boo!"}), gc.ErrorMatches, `unrecognized args: \["boo!"\]`) 150 } 151 152 func (s *CmdSuite) TestZeroOrOneArgs(c *gc.C) { 153 154 expectValue := func(args []string, expected string) { 155 arg, err := cmd.ZeroOrOneArgs(args) 156 c.Assert(arg, gc.Equals, expected) 157 c.Assert(err, gc.IsNil) 158 } 159 160 expectValue(nil, "") 161 expectValue([]string{}, "") 162 expectValue([]string{"foo"}, "foo") 163 164 arg, err := cmd.ZeroOrOneArgs([]string{"foo", "bar"}) 165 c.Assert(arg, gc.Equals, "") 166 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["bar"\]`) 167 } 168 169 func (s *CmdSuite) TestIsErrSilent(c *gc.C) { 170 c.Assert(cmd.IsErrSilent(cmd.ErrSilent), gc.Equals, true) 171 c.Assert(cmd.IsErrSilent(cmd.NewRcPassthroughError(99)), gc.Equals, true) 172 c.Assert(cmd.IsErrSilent(fmt.Errorf("noisy")), gc.Equals, false) 173 }