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  }