github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/cmd/juju/synctools_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "errors" 8 "time" 9 10 "github.com/juju/loggo" 11 jc "github.com/juju/testing/checkers" 12 gc "launchpad.net/gocheck" 13 14 "github.com/juju/juju/cmd" 15 "github.com/juju/juju/cmd/envcmd" 16 "github.com/juju/juju/environs" 17 "github.com/juju/juju/environs/configstore" 18 "github.com/juju/juju/environs/sync" 19 "github.com/juju/juju/provider/dummy" 20 coretesting "github.com/juju/juju/testing" 21 ) 22 23 type syncToolsSuite struct { 24 coretesting.FakeJujuHomeSuite 25 configStore configstore.Storage 26 localStorage string 27 28 origSyncTools func(*sync.SyncContext) error 29 } 30 31 var _ = gc.Suite(&syncToolsSuite{}) 32 33 func (s *syncToolsSuite) SetUpTest(c *gc.C) { 34 s.FakeJujuHomeSuite.SetUpTest(c) 35 36 // Create a target environments.yaml and make sure its environment is empty. 37 coretesting.WriteEnvironments(c, ` 38 environments: 39 test-target: 40 type: dummy 41 state-server: false 42 authorized-keys: "not-really-one" 43 `) 44 var err error 45 s.configStore, err = configstore.Default() 46 c.Assert(err, gc.IsNil) 47 s.origSyncTools = syncTools 48 } 49 50 func (s *syncToolsSuite) TearDownTest(c *gc.C) { 51 syncTools = s.origSyncTools 52 dummy.Reset() 53 s.FakeJujuHomeSuite.TearDownTest(c) 54 } 55 56 func (s *syncToolsSuite) Reset(c *gc.C) { 57 s.TearDownTest(c) 58 s.SetUpTest(c) 59 } 60 61 func runSyncToolsCommand(c *gc.C, args ...string) (*cmd.Context, error) { 62 return coretesting.RunCommand(c, envcmd.Wrap(&SyncToolsCommand{}), args...) 63 } 64 65 func wait(signal chan struct{}) error { 66 select { 67 case <-signal: 68 return nil 69 case <-time.After(25 * time.Millisecond): 70 return errors.New("timeout") 71 } 72 } 73 74 var syncToolsCommandTests = []struct { 75 description string 76 args []string 77 sctx *sync.SyncContext 78 }{ 79 { 80 description: "environment as only argument", 81 args: []string{"-e", "test-target"}, 82 sctx: &sync.SyncContext{}, 83 }, 84 { 85 description: "specifying also the synchronization source", 86 args: []string{"-e", "test-target", "--source", "/foo/bar"}, 87 sctx: &sync.SyncContext{ 88 Source: "/foo/bar", 89 }, 90 }, 91 { 92 description: "synchronize all version including development", 93 args: []string{"-e", "test-target", "--all", "--dev"}, 94 sctx: &sync.SyncContext{ 95 AllVersions: true, 96 Dev: true, 97 }, 98 }, 99 { 100 description: "just make a dry run", 101 args: []string{"-e", "test-target", "--dry-run"}, 102 sctx: &sync.SyncContext{ 103 DryRun: true, 104 }, 105 }, 106 { 107 description: "specific public", 108 args: []string{"-e", "test-target", "--public"}, 109 sctx: &sync.SyncContext{ 110 Public: true, 111 }, 112 }, 113 { 114 description: "specify version", 115 args: []string{"-e", "test-target", "--version", "1.2"}, 116 sctx: &sync.SyncContext{ 117 MajorVersion: 1, 118 MinorVersion: 2, 119 }, 120 }, 121 } 122 123 func (s *syncToolsSuite) TestSyncToolsCommand(c *gc.C) { 124 for i, test := range syncToolsCommandTests { 125 c.Logf("test %d: %s", i, test.description) 126 targetEnv, err := environs.PrepareFromName("test-target", nullContext(c), s.configStore) 127 c.Assert(err, gc.IsNil) 128 called := false 129 syncTools = func(sctx *sync.SyncContext) error { 130 c.Assert(sctx.AllVersions, gc.Equals, test.sctx.AllVersions) 131 c.Assert(sctx.MajorVersion, gc.Equals, test.sctx.MajorVersion) 132 c.Assert(sctx.MinorVersion, gc.Equals, test.sctx.MinorVersion) 133 c.Assert(sctx.DryRun, gc.Equals, test.sctx.DryRun) 134 c.Assert(sctx.Dev, gc.Equals, test.sctx.Dev) 135 c.Assert(sctx.Public, gc.Equals, test.sctx.Public) 136 c.Assert(sctx.Source, gc.Equals, test.sctx.Source) 137 c.Assert(dummy.IsSameStorage(sctx.Target, targetEnv.Storage()), jc.IsTrue) 138 called = true 139 return nil 140 } 141 ctx, err := runSyncToolsCommand(c, test.args...) 142 c.Assert(err, gc.IsNil) 143 c.Assert(ctx, gc.NotNil) 144 c.Assert(called, jc.IsTrue) 145 s.Reset(c) 146 } 147 } 148 149 func (s *syncToolsSuite) TestSyncToolsCommandTargetDirectory(c *gc.C) { 150 called := false 151 dir := c.MkDir() 152 syncTools = func(sctx *sync.SyncContext) error { 153 c.Assert(sctx.AllVersions, gc.Equals, false) 154 c.Assert(sctx.DryRun, gc.Equals, false) 155 c.Assert(sctx.Dev, gc.Equals, false) 156 c.Assert(sctx.Source, gc.Equals, "") 157 url, err := sctx.Target.URL("") 158 c.Assert(err, gc.IsNil) 159 c.Assert(url, gc.Equals, "file://"+dir) 160 called = true 161 return nil 162 } 163 ctx, err := runSyncToolsCommand(c, "-e", "test-target", "--local-dir", dir) 164 c.Assert(err, gc.IsNil) 165 c.Assert(ctx, gc.NotNil) 166 c.Assert(called, jc.IsTrue) 167 s.Reset(c) 168 } 169 170 func (s *syncToolsSuite) TestSyncToolsCommandDeprecatedDestination(c *gc.C) { 171 called := false 172 dir := c.MkDir() 173 syncTools = func(sctx *sync.SyncContext) error { 174 c.Assert(sctx.AllVersions, gc.Equals, false) 175 c.Assert(sctx.DryRun, gc.Equals, false) 176 c.Assert(sctx.Dev, gc.Equals, false) 177 c.Assert(sctx.Source, gc.Equals, "") 178 url, err := sctx.Target.URL("") 179 c.Assert(err, gc.IsNil) 180 c.Assert(url, gc.Equals, "file://"+dir) 181 called = true 182 return nil 183 } 184 // Register writer. 185 tw := &loggo.TestWriter{} 186 c.Assert(loggo.RegisterWriter("deprecated-tester", tw, loggo.DEBUG), gc.IsNil) 187 defer loggo.RemoveWriter("deprecated-tester") 188 // Add deprecated message to be checked. 189 messages := []jc.SimpleMessage{ 190 {loggo.WARNING, "Use of the --destination flag is deprecated in 1.18. Please use --local-dir instead."}, 191 } 192 // Run sync-tools command with --destination flag. 193 ctx, err := runSyncToolsCommand(c, "-e", "test-target", "--destination", dir) 194 c.Assert(err, gc.IsNil) 195 c.Assert(ctx, gc.NotNil) 196 c.Assert(called, jc.IsTrue) 197 // Check deprecated message was logged. 198 c.Check(tw.Log, jc.LogMatches, messages) 199 s.Reset(c) 200 }