launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/uniter/jujuc/ports_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuc_test 5 6 import ( 7 gc "launchpad.net/gocheck" 8 9 "launchpad.net/juju-core/cmd" 10 "launchpad.net/juju-core/testing" 11 "launchpad.net/juju-core/utils/set" 12 "launchpad.net/juju-core/worker/uniter/jujuc" 13 ) 14 15 type PortsSuite struct { 16 ContextSuite 17 } 18 19 var _ = gc.Suite(&PortsSuite{}) 20 21 var portsTests = []struct { 22 cmd []string 23 expect set.Strings 24 }{ 25 {[]string{"open-port", "80"}, set.NewStrings("80/tcp")}, 26 {[]string{"open-port", "99/tcp"}, set.NewStrings("80/tcp", "99/tcp")}, 27 {[]string{"close-port", "80/TCP"}, set.NewStrings("99/tcp")}, 28 {[]string{"open-port", "123/udp"}, set.NewStrings("99/tcp", "123/udp")}, 29 {[]string{"close-port", "9999/UDP"}, set.NewStrings("99/tcp", "123/udp")}, 30 } 31 32 func (s *PortsSuite) TestOpenClose(c *gc.C) { 33 hctx := s.GetHookContext(c, -1, "") 34 for _, t := range portsTests { 35 com, err := jujuc.NewCommand(hctx, t.cmd[0]) 36 c.Assert(err, gc.IsNil) 37 ctx := testing.Context(c) 38 code := cmd.Main(com, ctx, t.cmd[1:]) 39 c.Assert(code, gc.Equals, 0) 40 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 41 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 42 c.Assert(hctx.ports, gc.DeepEquals, t.expect) 43 } 44 } 45 46 var badPortsTests = []struct { 47 args []string 48 err string 49 }{ 50 {nil, "no port specified"}, 51 {[]string{"0"}, `port must be in the range \[1, 65535\]; got "0"`}, 52 {[]string{"65536"}, `port must be in the range \[1, 65535\]; got "65536"`}, 53 {[]string{"two"}, `port must be in the range \[1, 65535\]; got "two"`}, 54 {[]string{"80/http"}, `protocol must be "tcp" or "udp"; got "http"`}, 55 {[]string{"blah/blah/blah"}, `expected <port>\[/<protocol>\]; got "blah/blah/blah"`}, 56 {[]string{"123", "haha"}, `unrecognized args: \["haha"\]`}, 57 } 58 59 func (s *PortsSuite) TestBadArgs(c *gc.C) { 60 for _, name := range []string{"open-port", "close-port"} { 61 for _, t := range badPortsTests { 62 hctx := s.GetHookContext(c, -1, "") 63 com, err := jujuc.NewCommand(hctx, name) 64 c.Assert(err, gc.IsNil) 65 err = testing.InitCommand(com, t.args) 66 c.Assert(err, gc.ErrorMatches, t.err) 67 } 68 } 69 } 70 71 func (s *PortsSuite) TestHelp(c *gc.C) { 72 hctx := s.GetHookContext(c, -1, "") 73 open, err := jujuc.NewCommand(hctx, "open-port") 74 c.Assert(err, gc.IsNil) 75 flags := testing.NewFlagSet() 76 c.Assert(string(open.Info().Help(flags)), gc.Equals, ` 77 usage: open-port <port>[/<protocol>] 78 purpose: register a port to open 79 80 The port will only be open while the service is exposed. 81 `[1:]) 82 83 close, err := jujuc.NewCommand(hctx, "close-port") 84 c.Assert(err, gc.IsNil) 85 c.Assert(string(close.Info().Help(flags)), gc.Equals, ` 86 usage: close-port <port>[/<protocol>] 87 purpose: ensure a port is always closed 88 `[1:]) 89 } 90 91 // Since the deprecation warning gets output during Run, we really need 92 // some valid commands to run 93 var portsFormatDeprectaionTests = []struct { 94 cmd []string 95 }{ 96 {[]string{"open-port", "--format", "foo", "80"}}, 97 {[]string{"close-port", "--format", "foo", "80/TCP"}}, 98 } 99 100 func (s *PortsSuite) TestOpenCloseDeprecation(c *gc.C) { 101 hctx := s.GetHookContext(c, -1, "") 102 for _, t := range portsFormatDeprectaionTests { 103 name := t.cmd[0] 104 com, err := jujuc.NewCommand(hctx, name) 105 c.Assert(err, gc.IsNil) 106 ctx := testing.Context(c) 107 code := cmd.Main(com, ctx, t.cmd[1:]) 108 c.Assert(code, gc.Equals, 0) 109 c.Assert(testing.Stdout(ctx), gc.Equals, "") 110 c.Assert(testing.Stderr(ctx), gc.Equals, "--format flag deprecated for command \""+name+"\"") 111 } 112 }