launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cmd/plugins/juju-metadata/metadataplugin_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "flag" 8 "fmt" 9 "os" 10 "os/exec" 11 "strings" 12 stdtesting "testing" 13 14 gc "launchpad.net/gocheck" 15 16 "launchpad.net/juju-core/juju/osenv" 17 "launchpad.net/juju-core/testing" 18 ) 19 20 func Test(t *stdtesting.T) { 21 gc.TestingT(t) 22 } 23 24 type MetadataSuite struct { 25 jujuHome *testing.FakeHome 26 } 27 28 var _ = gc.Suite(&MetadataSuite{}) 29 30 var metadataCommandNames = []string{ 31 "generate-image", 32 "generate-tools", 33 "help", 34 "sign", 35 "validate-images", 36 "validate-tools", 37 } 38 39 func (s *MetadataSuite) SetUpTest(c *gc.C) { 40 s.jujuHome = testing.MakeEmptyFakeHome(c) 41 } 42 43 func (s *MetadataSuite) TearDownTest(c *gc.C) { 44 s.jujuHome.Restore() 45 } 46 47 var ( 48 flagRunMain = flag.Bool("run-main", false, "Run the application's main function for recursive testing") 49 ) 50 51 // Reentrancy point for testing (something as close as possible to) the juju 52 // tool itself. 53 func TestRunMain(t *stdtesting.T) { 54 if *flagRunMain { 55 Main(flag.Args()) 56 } 57 } 58 59 func badrun(c *gc.C, exit int, args ...string) string { 60 localArgs := append([]string{"-test.run", "TestRunMain", "-run-main", "--", "juju-metadata"}, args...) 61 62 ps := exec.Command(os.Args[0], localArgs...) 63 64 ps.Env = append(os.Environ(), osenv.JujuHomeEnvKey+"="+osenv.JujuHome()) 65 output, err := ps.CombinedOutput() 66 if exit != 0 { 67 c.Assert(err, gc.ErrorMatches, fmt.Sprintf("exit status %d", exit)) 68 } 69 return string(output) 70 } 71 72 func (s *MetadataSuite) TestHelpCommands(c *gc.C) { 73 // Check that we have correctly registered all the sub commands 74 // by checking the help output. 75 out := badrun(c, 0, "--help") 76 lines := strings.Split(out, "\n") 77 var names []string 78 for _, line := range lines { 79 f := strings.Fields(line) 80 if len(f) == 0 || !strings.HasPrefix(line, " ") { 81 continue 82 } 83 names = append(names, f[0]) 84 } 85 // The names should be output in alphabetical order, so don't sort. 86 c.Assert(names, gc.DeepEquals, metadataCommandNames) 87 } 88 89 func (s *MetadataSuite) assertHelpOutput(c *gc.C, cmd string) { 90 expected := fmt.Sprintf("usage: juju metadata %s [options]", cmd) 91 out := badrun(c, 0, cmd, "--help") 92 lines := strings.Split(out, "\n") 93 c.Assert(lines[0], gc.Equals, expected) 94 } 95 96 func (s *MetadataSuite) TestHelpValidateImages(c *gc.C) { 97 s.assertHelpOutput(c, "validate-images") 98 } 99 100 func (s *MetadataSuite) TestHelpValidateTools(c *gc.C) { 101 s.assertHelpOutput(c, "validate-tools") 102 } 103 104 func (s *MetadataSuite) TestHelpGenerateImage(c *gc.C) { 105 s.assertHelpOutput(c, "generate-image") 106 }