github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/cmd/juju/scp_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  	"bytes"
     8  	"fmt"
     9  	"io/ioutil"
    10  	"net/url"
    11  	"path/filepath"
    12  
    13  	gc "launchpad.net/gocheck"
    14  
    15  	"launchpad.net/juju-core/charm"
    16  	"launchpad.net/juju-core/instance"
    17  	coretesting "launchpad.net/juju-core/testing"
    18  )
    19  
    20  var _ = gc.Suite(&SCPSuite{})
    21  
    22  type SCPSuite struct {
    23  	SSHCommonSuite
    24  }
    25  
    26  var scpTests = []struct {
    27  	about  string
    28  	args   []string
    29  	result string
    30  	error  string
    31  }{
    32  	{
    33  		"scp from machine 0 to current dir",
    34  		[]string{"0:foo", "."},
    35  		commonArgs + "ubuntu@dummyenv-0.dns:foo .\n",
    36  		"",
    37  	},
    38  	{
    39  		"scp from machine 0 to current dir with extra args",
    40  		[]string{"0:foo", ".", "-rv -o SomeOption"},
    41  		commonArgs + "-rv -o SomeOption ubuntu@dummyenv-0.dns:foo .\n",
    42  		"",
    43  	},
    44  	{
    45  		"scp from current dir to machine 0",
    46  		[]string{"foo", "0:"},
    47  		commonArgs + "foo ubuntu@dummyenv-0.dns:\n",
    48  		"",
    49  	},
    50  	{
    51  		"scp from current dir to machine 0 with extra args",
    52  		[]string{"foo", "0:", "-r -v"},
    53  		commonArgs + "-r -v foo ubuntu@dummyenv-0.dns:\n",
    54  		"",
    55  	},
    56  	{
    57  		"scp from machine 0 to unit mysql/0",
    58  		[]string{"0:foo", "mysql/0:/foo"},
    59  		commonArgs + "ubuntu@dummyenv-0.dns:foo ubuntu@dummyenv-0.dns:/foo\n",
    60  		"",
    61  	},
    62  	{
    63  		"scp from machine 0 to unit mysql/0 and extra args",
    64  		[]string{"0:foo", "mysql/0:/foo", "-q"},
    65  		commonArgs + "-q ubuntu@dummyenv-0.dns:foo ubuntu@dummyenv-0.dns:/foo\n",
    66  		"",
    67  	},
    68  	{
    69  		"scp from machine 0 to unit mysql/0 and extra args before",
    70  		[]string{"-q", "-r", "0:foo", "mysql/0:/foo"},
    71  		"",
    72  		`unexpected argument "-q"; extra arguments must be last`,
    73  	},
    74  	{
    75  		"scp two local files to unit mysql/0",
    76  		[]string{"file1", "file2", "mysql/0:/foo/"},
    77  		commonArgs + "file1 file2 ubuntu@dummyenv-0.dns:/foo/\n",
    78  		"",
    79  	},
    80  	{
    81  		"scp from unit mongodb/1 to unit mongodb/0 and multiple extra args",
    82  		[]string{"mongodb/1:foo", "mongodb/0:", "-r -v -q -l5"},
    83  		commonArgs + "-r -v -q -l5 ubuntu@dummyenv-2.dns:foo ubuntu@dummyenv-1.dns:\n",
    84  		"",
    85  	},
    86  	{
    87  		"scp works with IPv6 addresses",
    88  		[]string{"ipv6-svc/0:foo", "bar"},
    89  		commonArgs + `ubuntu@\[2001:db8::\]:foo bar` + "\n",
    90  		"",
    91  	},
    92  }
    93  
    94  func (s *SCPSuite) TestSCPCommand(c *gc.C) {
    95  	m := s.makeMachines(4, c, true)
    96  	ch := coretesting.Charms.Dir("dummy")
    97  	curl := charm.MustParseURL(
    98  		fmt.Sprintf("local:quantal/%s-%d", ch.Meta().Name, ch.Revision()),
    99  	)
   100  	bundleURL, err := url.Parse("http://bundles.testing.invalid/dummy-1")
   101  	c.Assert(err, gc.IsNil)
   102  	dummyCharm, err := s.State.AddCharm(ch, curl, bundleURL, "dummy-1-sha256")
   103  	c.Assert(err, gc.IsNil)
   104  	srv := s.AddTestingService(c, "mysql", dummyCharm)
   105  	s.addUnit(srv, m[0], c)
   106  
   107  	srv = s.AddTestingService(c, "mongodb", dummyCharm)
   108  	s.addUnit(srv, m[1], c)
   109  	s.addUnit(srv, m[2], c)
   110  	// Simulate machine 3 has a public IPv6 address.
   111  	ipv6Addr := instance.Address{
   112  		Value:        "2001:db8::",
   113  		Type:         instance.Ipv4Address, // ..because SelectPublicAddress ignores IPv6 addresses
   114  		NetworkScope: instance.NetworkPublic,
   115  	}
   116  	err = m[3].SetAddresses([]instance.Address{ipv6Addr})
   117  	c.Assert(err, gc.IsNil)
   118  	srv = s.AddTestingService(c, "ipv6-svc", dummyCharm)
   119  	s.addUnit(srv, m[3], c)
   120  
   121  	for i, t := range scpTests {
   122  		c.Logf("test %d: %s -> %s\n", i, t.about, t.args)
   123  		ctx := coretesting.Context(c)
   124  		scpcmd := &SCPCommand{}
   125  
   126  		err := scpcmd.Init(t.args)
   127  		c.Check(err, gc.IsNil)
   128  		err = scpcmd.Run(ctx)
   129  		if t.error != "" {
   130  			c.Check(err, gc.ErrorMatches, t.error)
   131  			c.Check(t.result, gc.Equals, "")
   132  		} else {
   133  			c.Check(err, gc.IsNil)
   134  			// we suppress stdout from scp
   135  			c.Check(ctx.Stderr.(*bytes.Buffer).String(), gc.Equals, "")
   136  			c.Check(ctx.Stdout.(*bytes.Buffer).String(), gc.Equals, "")
   137  			data, err := ioutil.ReadFile(filepath.Join(s.bin, "scp.args"))
   138  			c.Check(err, gc.IsNil)
   139  			c.Check(string(data), gc.Equals, t.result)
   140  		}
   141  	}
   142  }