175
175
// Uses the TearDownTest from testing.LoggingSuite
177
func (s *StoreSuite) TearDownSuite(c *C) {
177
func (s *StoreSuite) TearDownSuite(c *gc.C) {
178
178
charm.CacheDir = s.oldCacheDir
179
179
s.server.lis.Close()
180
180
s.LoggingSuite.TearDownSuite(c)
183
func (s *StoreSuite) TestMissing(c *C) {
183
func (s *StoreSuite) TestMissing(c *gc.C) {
184
184
charmURL := charm.MustParseURL("cs:series/missing")
185
185
expect := `charm not found: cs:series/missing`
186
186
_, err := s.store.Latest(charmURL)
187
c.Assert(err, ErrorMatches, expect)
187
c.Assert(err, gc.ErrorMatches, expect)
188
188
_, err = s.store.Get(charmURL)
189
c.Assert(err, ErrorMatches, expect)
189
c.Assert(err, gc.ErrorMatches, expect)
192
func (s *StoreSuite) TestError(c *C) {
192
func (s *StoreSuite) TestError(c *gc.C) {
193
193
charmURL := charm.MustParseURL("cs:series/borken")
194
194
expect := `charm info errors for "cs:series/borken": badness`
195
195
_, err := s.store.Latest(charmURL)
196
c.Assert(err, ErrorMatches, expect)
196
c.Assert(err, gc.ErrorMatches, expect)
197
197
_, err = s.store.Get(charmURL)
198
c.Assert(err, ErrorMatches, expect)
198
c.Assert(err, gc.ErrorMatches, expect)
201
func (s *StoreSuite) TestWarning(c *C) {
201
func (s *StoreSuite) TestWarning(c *gc.C) {
202
202
charmURL := charm.MustParseURL("cs:series/unwise")
203
203
expect := `.* WARNING juju charm: charm store reports for "cs:series/unwise": foolishness` + "\n"
204
204
r, err := s.store.Latest(charmURL)
205
c.Assert(r, Equals, 23)
207
c.Assert(c.GetTestLog(), Matches, expect)
205
c.Assert(r, gc.Equals, 23)
206
c.Assert(err, gc.IsNil)
207
c.Assert(c.GetTestLog(), gc.Matches, expect)
208
208
ch, err := s.store.Get(charmURL)
211
c.Assert(c.GetTestLog(), Matches, expect+expect)
209
c.Assert(ch, gc.NotNil)
210
c.Assert(err, gc.IsNil)
211
c.Assert(c.GetTestLog(), gc.Matches, expect+expect)
214
func (s *StoreSuite) TestLatest(c *C) {
214
func (s *StoreSuite) TestLatest(c *gc.C) {
215
215
for _, str := range []string{
216
216
"cs:series/good",
217
217
"cs:series/good-2",
218
218
"cs:series/good-99",
220
220
r, err := s.store.Latest(charm.MustParseURL(str))
221
c.Assert(r, Equals, 23)
221
c.Assert(r, gc.Equals, 23)
222
c.Assert(err, gc.IsNil)
226
func (s *StoreSuite) assertCached(c *C, charmURL *charm.URL) {
226
func (s *StoreSuite) assertCached(c *gc.C, charmURL *charm.URL) {
227
227
s.server.downloads = nil
228
228
ch, err := s.store.Get(charmURL)
231
c.Assert(s.server.downloads, IsNil)
229
c.Assert(err, gc.IsNil)
230
c.Assert(ch, gc.NotNil)
231
c.Assert(s.server.downloads, gc.IsNil)
234
func (s *StoreSuite) TestGetCacheImplicitRevision(c *C) {
234
func (s *StoreSuite) TestGetCacheImplicitRevision(c *gc.C) {
235
235
base := "cs:series/good"
236
236
charmURL := charm.MustParseURL(base)
237
237
revCharmURL := charm.MustParseURL(base + "-23")
238
238
ch, err := s.store.Get(charmURL)
241
c.Assert(s.server.downloads, DeepEquals, []*charm.URL{revCharmURL})
239
c.Assert(err, gc.IsNil)
240
c.Assert(ch, gc.NotNil)
241
c.Assert(s.server.downloads, gc.DeepEquals, []*charm.URL{revCharmURL})
242
242
s.assertCached(c, charmURL)
243
243
s.assertCached(c, revCharmURL)
246
func (s *StoreSuite) TestGetCacheExplicitRevision(c *C) {
246
func (s *StoreSuite) TestGetCacheExplicitRevision(c *gc.C) {
247
247
base := "cs:series/good-12"
248
248
charmURL := charm.MustParseURL(base)
249
249
ch, err := s.store.Get(charmURL)
252
c.Assert(s.server.downloads, DeepEquals, []*charm.URL{charmURL})
250
c.Assert(err, gc.IsNil)
251
c.Assert(ch, gc.NotNil)
252
c.Assert(s.server.downloads, gc.DeepEquals, []*charm.URL{charmURL})
253
253
s.assertCached(c, charmURL)
256
func (s *StoreSuite) TestGetBadCache(c *C) {
257
c.Assert(os.Mkdir(filepath.Join(charm.CacheDir, "cache"), 0777), IsNil)
256
func (s *StoreSuite) TestGetBadCache(c *gc.C) {
257
c.Assert(os.Mkdir(filepath.Join(charm.CacheDir, "cache"), 0777), gc.IsNil)
258
258
base := "cs:series/good"
259
259
charmURL := charm.MustParseURL(base)
260
260
revCharmURL := charm.MustParseURL(base + "-23")
261
261
name := charm.Quote(revCharmURL.String()) + ".charm"
262
262
err := ioutil.WriteFile(filepath.Join(charm.CacheDir, "cache", name), nil, 0666)
263
c.Assert(err, gc.IsNil)
264
264
ch, err := s.store.Get(charmURL)
267
c.Assert(s.server.downloads, DeepEquals, []*charm.URL{revCharmURL})
265
c.Assert(err, gc.IsNil)
266
c.Assert(ch, gc.NotNil)
267
c.Assert(s.server.downloads, gc.DeepEquals, []*charm.URL{revCharmURL})
268
268
s.assertCached(c, charmURL)
269
269
s.assertCached(c, revCharmURL)
272
272
// The following tests cover the low-level CharmStore-specific API.
274
func (s *StoreSuite) TestInfo(c *C) {
274
func (s *StoreSuite) TestInfo(c *gc.C) {
275
275
charmURL := charm.MustParseURL("cs:series/good")
276
276
info, err := s.store.Info(charmURL)
278
c.Assert(info.Errors, IsNil)
279
c.Assert(info.Revision, Equals, 23)
277
c.Assert(err, gc.IsNil)
278
c.Assert(info.Errors, gc.IsNil)
279
c.Assert(info.Revision, gc.Equals, 23)
282
func (s *StoreSuite) TestInfoNotFound(c *C) {
282
func (s *StoreSuite) TestInfoNotFound(c *gc.C) {
283
283
charmURL := charm.MustParseURL("cs:series/missing")
284
284
info, err := s.store.Info(charmURL)
285
c.Assert(err, ErrorMatches, `charm not found: cs:series/missing`)
286
c.Assert(info, IsNil)
285
c.Assert(err, gc.ErrorMatches, `charm not found: cs:series/missing`)
286
c.Assert(info, gc.IsNil)
289
func (s *StoreSuite) TestInfoError(c *C) {
289
func (s *StoreSuite) TestInfoError(c *gc.C) {
290
290
charmURL := charm.MustParseURL("cs:series/borken")
291
291
info, err := s.store.Info(charmURL)
293
c.Assert(info.Errors, DeepEquals, []string{"badness"})
292
c.Assert(err, gc.IsNil)
293
c.Assert(info.Errors, gc.DeepEquals, []string{"badness"})
296
func (s *StoreSuite) TestInfoWarning(c *C) {
296
func (s *StoreSuite) TestInfoWarning(c *gc.C) {
297
297
charmURL := charm.MustParseURL("cs:series/unwise")
298
298
info, err := s.store.Info(charmURL)
300
c.Assert(info.Warnings, DeepEquals, []string{"foolishness"})
299
c.Assert(err, gc.IsNil)
300
c.Assert(info.Warnings, gc.DeepEquals, []string{"foolishness"})
303
func (s *StoreSuite) TestEvent(c *C) {
303
func (s *StoreSuite) TestEvent(c *gc.C) {
304
304
charmURL := charm.MustParseURL("cs:series/good")
305
305
event, err := s.store.Event(charmURL, "")
307
c.Assert(event.Errors, IsNil)
308
c.Assert(event.Revision, Equals, 23)
309
c.Assert(event.Digest, Equals, "the-digest")
306
c.Assert(err, gc.IsNil)
307
c.Assert(event.Errors, gc.IsNil)
308
c.Assert(event.Revision, gc.Equals, 23)
309
c.Assert(event.Digest, gc.Equals, "the-digest")
312
func (s *StoreSuite) TestEventWithDigest(c *C) {
312
func (s *StoreSuite) TestEventWithDigest(c *gc.C) {
313
313
charmURL := charm.MustParseURL("cs:series/good")
314
314
event, err := s.store.Event(charmURL, "the-digest")
316
c.Assert(event.Errors, IsNil)
317
c.Assert(event.Revision, Equals, 23)
318
c.Assert(event.Digest, Equals, "the-digest")
315
c.Assert(err, gc.IsNil)
316
c.Assert(event.Errors, gc.IsNil)
317
c.Assert(event.Revision, gc.Equals, 23)
318
c.Assert(event.Digest, gc.Equals, "the-digest")
321
func (s *StoreSuite) TestEventNotFound(c *C) {
321
func (s *StoreSuite) TestEventNotFound(c *gc.C) {
322
322
charmURL := charm.MustParseURL("cs:series/missing")
323
323
event, err := s.store.Event(charmURL, "")
324
c.Assert(err, ErrorMatches, `charm event not found for "cs:series/missing"`)
325
c.Assert(event, IsNil)
324
c.Assert(err, gc.ErrorMatches, `charm event not found for "cs:series/missing"`)
325
c.Assert(event, gc.IsNil)
328
func (s *StoreSuite) TestEventNotFoundDigest(c *C) {
328
func (s *StoreSuite) TestEventNotFoundDigest(c *gc.C) {
329
329
charmURL := charm.MustParseURL("cs:series/good")
330
330
event, err := s.store.Event(charmURL, "missing-digest")
331
c.Assert(err, ErrorMatches, `charm event not found for "cs:series/good" with digest "missing-digest"`)
332
c.Assert(event, IsNil)
331
c.Assert(err, gc.ErrorMatches, `charm event not found for "cs:series/good" with digest "missing-digest"`)
332
c.Assert(event, gc.IsNil)
335
func (s *StoreSuite) TestEventError(c *C) {
335
func (s *StoreSuite) TestEventError(c *gc.C) {
336
336
charmURL := charm.MustParseURL("cs:series/borken")
337
337
event, err := s.store.Event(charmURL, "")
339
c.Assert(event.Errors, DeepEquals, []string{"badness"})
338
c.Assert(err, gc.IsNil)
339
c.Assert(event.Errors, gc.DeepEquals, []string{"badness"})
342
func (s *StoreSuite) TestEventWarning(c *C) {
342
func (s *StoreSuite) TestEventWarning(c *gc.C) {
343
343
charmURL := charm.MustParseURL("cs:series/unwise")
344
344
event, err := s.store.Event(charmURL, "")
346
c.Assert(event.Warnings, DeepEquals, []string{"foolishness"})
345
c.Assert(err, gc.IsNil)
346
c.Assert(event.Warnings, gc.DeepEquals, []string{"foolishness"})
349
func (s *StoreSuite) TestBranchLocation(c *C) {
349
func (s *StoreSuite) TestBranchLocation(c *gc.C) {
350
350
charmURL := charm.MustParseURL("cs:series/name")
351
351
location := s.store.BranchLocation(charmURL)
352
c.Assert(location, Equals, "lp:charms/series/name")
352
c.Assert(location, gc.Equals, "lp:charms/series/name")
354
354
charmURL = charm.MustParseURL("cs:~user/series/name")
355
355
location = s.store.BranchLocation(charmURL)
356
c.Assert(location, Equals, "lp:~user/charms/series/name/trunk")
356
c.Assert(location, gc.Equals, "lp:~user/charms/series/name/trunk")
359
func (s *StoreSuite) TestCharmURL(c *C) {
359
func (s *StoreSuite) TestCharmURL(c *gc.C) {
360
360
tests := []struct{ url, loc string }{
361
361
{"cs:precise/wordpress", "lp:charms/precise/wordpress"},
362
362
{"cs:precise/wordpress", "http://launchpad.net/+branch/charms/precise/wordpress"},
436
func (s *LocalRepoSuite) TestMissingRepo(c *C) {
437
c.Assert(os.RemoveAll(s.repo.Path), IsNil)
436
func (s *LocalRepoSuite) TestMissingRepo(c *gc.C) {
437
c.Assert(os.RemoveAll(s.repo.Path), gc.IsNil)
438
438
_, err := s.repo.Latest(charm.MustParseURL("local:series/zebra"))
439
c.Assert(err, ErrorMatches, `no repository found at ".*"`)
439
c.Assert(err, gc.ErrorMatches, `no repository found at ".*"`)
440
440
_, err = s.repo.Get(charm.MustParseURL("local:series/zebra"))
441
c.Assert(err, ErrorMatches, `no repository found at ".*"`)
442
c.Assert(ioutil.WriteFile(s.repo.Path, nil, 0666), IsNil)
441
c.Assert(err, gc.ErrorMatches, `no repository found at ".*"`)
442
c.Assert(ioutil.WriteFile(s.repo.Path, nil, 0666), gc.IsNil)
443
443
_, err = s.repo.Latest(charm.MustParseURL("local:series/zebra"))
444
c.Assert(err, ErrorMatches, `no repository found at ".*"`)
444
c.Assert(err, gc.ErrorMatches, `no repository found at ".*"`)
445
445
_, err = s.repo.Get(charm.MustParseURL("local:series/zebra"))
446
c.Assert(err, ErrorMatches, `no repository found at ".*"`)
446
c.Assert(err, gc.ErrorMatches, `no repository found at ".*"`)
449
func (s *LocalRepoSuite) TestMultipleVersions(c *C) {
449
func (s *LocalRepoSuite) TestMultipleVersions(c *gc.C) {
450
450
charmURL := charm.MustParseURL("local:series/upgrade")
451
451
s.addDir("upgrade1")
452
452
rev, err := s.repo.Latest(charmURL)
454
c.Assert(rev, Equals, 1)
453
c.Assert(err, gc.IsNil)
454
c.Assert(rev, gc.Equals, 1)
455
455
ch, err := s.repo.Get(charmURL)
457
c.Assert(ch.Revision(), Equals, 1)
456
c.Assert(err, gc.IsNil)
457
c.Assert(ch.Revision(), gc.Equals, 1)
459
459
s.addDir("upgrade2")
460
460
rev, err = s.repo.Latest(charmURL)
462
c.Assert(rev, Equals, 2)
461
c.Assert(err, gc.IsNil)
462
c.Assert(rev, gc.Equals, 2)
463
463
ch, err = s.repo.Get(charmURL)
465
c.Assert(ch.Revision(), Equals, 2)
464
c.Assert(err, gc.IsNil)
465
c.Assert(ch.Revision(), gc.Equals, 2)
467
467
revCharmURL := charmURL.WithRevision(1)
468
468
rev, err = s.repo.Latest(revCharmURL)
470
c.Assert(rev, Equals, 2)
469
c.Assert(err, gc.IsNil)
470
c.Assert(rev, gc.Equals, 2)
471
471
ch, err = s.repo.Get(revCharmURL)
473
c.Assert(ch.Revision(), Equals, 1)
472
c.Assert(err, gc.IsNil)
473
c.Assert(ch.Revision(), gc.Equals, 1)
475
475
badRevCharmURL := charmURL.WithRevision(33)
476
476
rev, err = s.repo.Latest(badRevCharmURL)
478
c.Assert(rev, Equals, 2)
477
c.Assert(err, gc.IsNil)
478
c.Assert(rev, gc.Equals, 2)
479
479
_, err = s.repo.Get(badRevCharmURL)
480
480
s.checkNotFoundErr(c, err, badRevCharmURL)
483
func (s *LocalRepoSuite) TestBundle(c *C) {
483
func (s *LocalRepoSuite) TestBundle(c *gc.C) {
484
484
charmURL := charm.MustParseURL("local:series/dummy")
485
485
s.addBundle("dummy")
487
487
rev, err := s.repo.Latest(charmURL)
489
c.Assert(rev, Equals, 1)
488
c.Assert(err, gc.IsNil)
489
c.Assert(rev, gc.Equals, 1)
490
490
ch, err := s.repo.Get(charmURL)
492
c.Assert(ch.Revision(), Equals, 1)
491
c.Assert(err, gc.IsNil)
492
c.Assert(ch.Revision(), gc.Equals, 1)
495
func (s *LocalRepoSuite) TestLogsErrors(c *C) {
495
func (s *LocalRepoSuite) TestLogsErrors(c *gc.C) {
496
496
err := ioutil.WriteFile(filepath.Join(s.seriesPath, "blah.charm"), nil, 0666)
497
c.Assert(err, gc.IsNil)
498
498
err = os.Mkdir(filepath.Join(s.seriesPath, "blah"), 0666)
499
c.Assert(err, gc.IsNil)
500
500
samplePath := s.addDir("upgrade2")
501
501
gibberish := []byte("don't parse me by")
502
502
err = ioutil.WriteFile(filepath.Join(samplePath, "metadata.yaml"), gibberish, 0666)
503
c.Assert(err, gc.IsNil)
505
505
charmURL := charm.MustParseURL("local:series/dummy")
506
506
s.addDir("dummy")
507
507
ch, err := s.repo.Get(charmURL)
509
c.Assert(ch.Revision(), Equals, 1)
510
c.Assert(c.GetTestLog(), Matches, `
508
c.Assert(err, gc.IsNil)
509
c.Assert(ch.Revision(), gc.Equals, 1)
510
c.Assert(c.GetTestLog(), gc.Matches, `
511
511
.* WARNING juju charm: failed to load charm at ".*/series/blah": .*
512
512
.* WARNING juju charm: failed to load charm at ".*/series/blah.charm": .*
513
513
.* WARNING juju charm: failed to load charm at ".*/series/upgrade2": .*
517
func renameSibling(c *C, path, name string) {
518
c.Assert(os.Rename(path, filepath.Join(filepath.Dir(path), name)), IsNil)
517
func renameSibling(c *gc.C, path, name string) {
518
c.Assert(os.Rename(path, filepath.Join(filepath.Dir(path), name)), gc.IsNil)
521
func (s *LocalRepoSuite) TestIgnoresUnpromisingNames(c *C) {
521
func (s *LocalRepoSuite) TestIgnoresUnpromisingNames(c *gc.C) {
522
522
err := ioutil.WriteFile(filepath.Join(s.seriesPath, "blah.notacharm"), nil, 0666)
523
c.Assert(err, gc.IsNil)
524
524
err = os.Mkdir(filepath.Join(s.seriesPath, ".blah"), 0666)
525
c.Assert(err, gc.IsNil)
526
526
renameSibling(c, s.addDir("dummy"), ".dummy")
527
527
renameSibling(c, s.addBundle("dummy"), "dummy.notacharm")
528
528
charmURL := charm.MustParseURL("local:series/dummy")