Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 Canonical Ltd. | |
2 // Licensed under the AGPLv3, see LICENCE file for details. | |
3 | |
4 package sync_test | |
5 | |
6 import ( | |
7 "io/ioutil" | |
8 "os" | |
9 "path/filepath" | |
10 "testing" | |
11 | |
12 gc "launchpad.net/gocheck" | |
13 | |
14 "launchpad.net/juju-core/agent/tools" | |
15 "launchpad.net/juju-core/environs" | |
16 "launchpad.net/juju-core/environs/dummy" | |
17 "launchpad.net/juju-core/environs/sync" | |
18 envtesting "launchpad.net/juju-core/environs/testing" | |
19 coretesting "launchpad.net/juju-core/testing" | |
20 "launchpad.net/juju-core/version" | |
21 ) | |
22 | |
23 func TestPackage(t *testing.T) { | |
24 gc.TestingT(t) | |
25 } | |
26 | |
27 type syncSuite struct { | |
28 coretesting.LoggingSuite | |
29 home *coretesting.FakeHome | |
30 targetEnv environs.Environ | |
31 origVersion version.Binary | |
32 origLocation string | |
33 storage *envtesting.EC2HTTPTestStorage | |
34 localStorage string | |
35 } | |
36 | |
37 var _ = gc.Suite(&syncSuite{}) | |
38 | |
39 func (s *syncSuite) SetUpTest(c *gc.C) { | |
40 s.LoggingSuite.SetUpTest(c) | |
41 s.origVersion = version.Current | |
42 // It's important that this be v1 to match the test data. | |
dimitern
2013/07/24 14:52:06
s/that this be v1/to use v1/ ?
| |
43 version.Current.Number = version.MustParse("1.2.3") | |
44 | |
45 // Create a target environments.yaml and make sure its environment is em pty. | |
46 s.home = coretesting.MakeFakeHome(c, ` | |
47 environments: | |
48 test-target: | |
49 type: dummy | |
50 state-server: false | |
51 authorized-keys: "not-really-one" | |
52 `) | |
53 var err error | |
54 s.targetEnv, err = environs.NewFromName("test-target") | |
55 c.Assert(err, gc.IsNil) | |
56 envtesting.RemoveAllTools(c, s.targetEnv) | |
57 | |
58 // Create a source storage. | |
59 s.storage, err = envtesting.NewEC2HTTPTestStorage("127.0.0.1") | |
60 c.Assert(err, gc.IsNil) | |
61 | |
62 // Create a local tools directory. | |
63 s.localStorage = c.MkDir() | |
64 | |
65 // Populate both with the public tools. | |
66 for _, vers := range vAll { | |
67 s.storage.PutBinary(vers) | |
68 putBinary(c, s.localStorage, vers) | |
69 } | |
70 | |
71 // Switch tools location. | |
72 s.origLocation = sync.DefaultToolsLocation | |
73 sync.DefaultToolsLocation = s.storage.Location() | |
74 } | |
75 | |
76 func (s *syncSuite) TearDownTest(c *gc.C) { | |
77 c.Assert(s.storage.Stop(), gc.IsNil) | |
dimitern
2013/07/24 14:52:06
if s.storage != nil {
c.Check(s.storage.Stop(),
| |
78 sync.DefaultToolsLocation = s.origLocation | |
79 dummy.Reset() | |
80 s.home.Restore() | |
81 version.Current = s.origVersion | |
82 s.LoggingSuite.TearDownTest(c) | |
83 } | |
84 | |
85 func (s *syncSuite) TestCopyNewestFromFilesystem(c *gc.C) { | |
dimitern
2013/07/24 14:52:06
All these test cases are an excellent candidate fo
| |
86 ctx := &sync.SyncContext{ | |
87 EnvName: "test-target", | |
88 Source: s.localStorage, | |
89 } | |
90 err := sync.SyncTools(ctx) | |
91 c.Assert(err, gc.IsNil) | |
92 | |
93 // Newest released v1 tools made available to target env. | |
94 targetTools, err := environs.FindAvailableTools(s.targetEnv, 1) | |
95 c.Assert(err, gc.IsNil) | |
96 assertToolsList(c, targetTools, v100all) | |
97 | |
98 // Public bucket was not touched. | |
99 assertEmpty(c, s.targetEnv.PublicStorage()) | |
100 } | |
101 | |
102 func (s *syncSuite) TestCopyNewestFromDummy(c *gc.C) { | |
103 ctx := &sync.SyncContext{ | |
104 EnvName: "test-target", | |
105 } | |
106 err := sync.SyncTools(ctx) | |
107 c.Assert(err, gc.IsNil) | |
108 | |
109 // Newest released v1 tools made available to target env. | |
110 targetTools, err := environs.FindAvailableTools(s.targetEnv, 1) | |
111 c.Assert(err, gc.IsNil) | |
112 assertToolsList(c, targetTools, v100all) | |
113 | |
114 // Public bucket was not touched. | |
115 assertEmpty(c, s.targetEnv.PublicStorage()) | |
116 } | |
117 | |
118 func (s *syncSuite) TestCopyNewestDevFromDummy(c *gc.C) { | |
119 ctx := &sync.SyncContext{ | |
120 EnvName: "test-target", | |
121 Dev: true, | |
122 } | |
123 err := sync.SyncTools(ctx) | |
124 c.Assert(err, gc.IsNil) | |
125 | |
126 // Newest v1 dev tools made available to target env. | |
127 targetTools, err := environs.FindAvailableTools(s.targetEnv, 1) | |
128 c.Assert(err, gc.IsNil) | |
129 assertToolsList(c, targetTools, v190all) | |
130 | |
131 // Public bucket was not touched. | |
132 assertEmpty(c, s.targetEnv.PublicStorage()) | |
133 } | |
134 | |
135 func (s *syncSuite) TestCopyAllFromDummy(c *gc.C) { | |
136 ctx := &sync.SyncContext{ | |
137 EnvName: "test-target", | |
138 AllVersions: true, | |
139 } | |
140 err := sync.SyncTools(ctx) | |
141 c.Assert(err, gc.IsNil) | |
142 | |
143 // All released v1 tools made available to target env. | |
144 targetTools, err := environs.FindAvailableTools(s.targetEnv, 1) | |
145 c.Assert(err, gc.IsNil) | |
146 assertToolsList(c, targetTools, v100all) | |
147 | |
148 // Public bucket was not touched. | |
149 assertEmpty(c, s.targetEnv.PublicStorage()) | |
150 } | |
151 | |
152 func (s *syncSuite) TestCopyAllDevFromDummy(c *gc.C) { | |
153 ctx := &sync.SyncContext{ | |
154 EnvName: "test-target", | |
155 AllVersions: true, | |
156 Dev: true, | |
157 } | |
158 err := sync.SyncTools(ctx) | |
159 c.Assert(err, gc.IsNil) | |
160 | |
161 // All v1 tools, dev and release, made available to target env. | |
162 targetTools, err := environs.FindAvailableTools(s.targetEnv, 1) | |
163 c.Assert(err, gc.IsNil) | |
164 assertToolsList(c, targetTools, v1all) | |
165 | |
166 // Public bucket was not touched. | |
167 assertEmpty(c, s.targetEnv.PublicStorage()) | |
168 } | |
169 | |
170 func (s *syncSuite) TestCopyToDummyPublic(c *gc.C) { | |
171 ctx := &sync.SyncContext{ | |
172 EnvName: "test-target", | |
173 PublicBucket: true, | |
174 } | |
175 err := sync.SyncTools(ctx) | |
176 c.Assert(err, gc.IsNil) | |
177 | |
178 // Newest released tools made available to target env. | |
179 targetTools, err := environs.FindAvailableTools(s.targetEnv, 1) | |
180 c.Assert(err, gc.IsNil) | |
181 assertToolsList(c, targetTools, v100all) | |
182 | |
183 // Private bucket was not touched. | |
184 assertEmpty(c, s.targetEnv.Storage()) | |
185 } | |
186 | |
187 func (s *syncSuite) TestCopyToDummyPublicBlockedByPrivate(c *gc.C) { | |
188 envtesting.UploadFakeToolsVersion(c, s.targetEnv.Storage(), v200p64) | |
189 ctx := &sync.SyncContext{ | |
190 EnvName: "test-target", | |
191 PublicBucket: true, | |
192 } | |
193 err := sync.SyncTools(ctx) | |
194 c.Assert(err, gc.ErrorMatches, "private tools present: public tools woul d be ignored") | |
195 assertEmpty(c, s.targetEnv.PublicStorage()) | |
196 } | |
197 | |
198 var ( | |
199 v100p64 = version.MustParseBinary("1.0.0-precise-amd64") | |
200 v100q64 = version.MustParseBinary("1.0.0-quantal-amd64") | |
201 v100q32 = version.MustParseBinary("1.0.0-quantal-i386") | |
202 v100all = []version.Binary{v100p64, v100q64, v100q32} | |
203 v190q64 = version.MustParseBinary("1.9.0-quantal-amd64") | |
204 v190p32 = version.MustParseBinary("1.9.0-precise-i386") | |
205 v190all = []version.Binary{v190q64, v190p32} | |
206 v1all = append(v100all, v190all...) | |
207 v200p64 = version.MustParseBinary("2.0.0-precise-amd64") | |
208 vAll = append(v1all, v200p64) | |
209 ) | |
210 | |
211 // putBinary stores a faked binary in the test directory. | |
212 func putBinary(c *gc.C, storagePath string, v version.Binary) { | |
213 data := v.String() | |
214 name := tools.StorageName(v) | |
215 filename := filepath.Join(storagePath, name) | |
216 dir := filepath.Dir(filename) | |
217 err := os.MkdirAll(dir, 0755) | |
218 c.Assert(err, gc.IsNil) | |
219 err = ioutil.WriteFile(filename, []byte(data), 0666) | |
220 c.Assert(err, gc.IsNil) | |
221 } | |
222 | |
223 func assertEmpty(c *gc.C, storage environs.StorageReader) { | |
224 list, err := tools.ReadList(storage, 1) | |
225 if len(list) > 0 { | |
226 c.Logf("got unexpected tools: %s", list) | |
227 } | |
228 c.Assert(err, gc.Equals, tools.ErrNoTools) | |
229 } | |
230 | |
231 func assertToolsList(c *gc.C, list tools.List, expected []version.Binary) { | |
232 urls := list.URLs() | |
233 c.Check(urls, gc.HasLen, len(expected)) | |
234 for _, vers := range expected { | |
235 c.Assert(urls[vers], gc.Not(gc.Equals), "") | |
236 } | |
237 } | |
OLD | NEW |