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 }