LEFT | RIGHT |
1 // Copyright 2013 Canonical Ltd. | 1 // Copyright 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package tools_test | 4 package tools_test |
5 | 5 |
6 import ( | 6 import ( |
7 "flag" | 7 "flag" |
8 "fmt" | 8 "fmt" |
9 "io" | 9 "io" |
10 "path/filepath" | |
11 "reflect" | 10 "reflect" |
12 "testing" | 11 "testing" |
13 | 12 |
14 "launchpad.net/goamz/aws" | 13 "launchpad.net/goamz/aws" |
15 gc "launchpad.net/gocheck" | 14 gc "launchpad.net/gocheck" |
16 | 15 |
17 "launchpad.net/juju-core/environs/filestorage" | 16 "launchpad.net/juju-core/environs/filestorage" |
18 "launchpad.net/juju-core/environs/simplestreams" | 17 "launchpad.net/juju-core/environs/simplestreams" |
19 sstesting "launchpad.net/juju-core/environs/simplestreams/testing" | 18 sstesting "launchpad.net/juju-core/environs/simplestreams/testing" |
20 "launchpad.net/juju-core/environs/storage" | 19 "launchpad.net/juju-core/environs/storage" |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 FileType: "tar.gz", | 273 FileType: "tar.gz", |
275 SHA256: "447aeb6a934a5eaec4f703eda4ef2dde", | 274 SHA256: "447aeb6a934a5eaec4f703eda4ef2dde", |
276 } | 275 } |
277 c.Assert(err, gc.IsNil) | 276 c.Assert(err, gc.IsNil) |
278 c.Assert(toolsMetadata[0], gc.DeepEquals, expectedMetadata) | 277 c.Assert(toolsMetadata[0], gc.DeepEquals, expectedMetadata) |
279 } | 278 } |
280 | 279 |
281 func assertMetadataMatches(c *gc.C, storageDir string, toolList coretools.List,
metadata []*tools.ToolsMetadata) { | 280 func assertMetadataMatches(c *gc.C, storageDir string, toolList coretools.List,
metadata []*tools.ToolsMetadata) { |
282 var expectedMetadata []*tools.ToolsMetadata = make([]*tools.ToolsMetadat
a, len(toolList)) | 281 var expectedMetadata []*tools.ToolsMetadata = make([]*tools.ToolsMetadat
a, len(toolList)) |
283 for i, tool := range toolList { | 282 for i, tool := range toolList { |
284 if tool.Size == 0 { | |
285 path := filepath.Join(storageDir, tools.StorageName(tool
.Version)) | |
286 size, sha256 := ttesting.SHA256sum(c, path) | |
287 tool.SHA256 = sha256 | |
288 tool.Size = size | |
289 } | |
290 expectedMetadata[i] = &tools.ToolsMetadata{ | 283 expectedMetadata[i] = &tools.ToolsMetadata{ |
291 Release: tool.Version.Series, | 284 Release: tool.Version.Series, |
292 Version: tool.Version.Number.String(), | 285 Version: tool.Version.Number.String(), |
293 Arch: tool.Version.Arch, | 286 Arch: tool.Version.Arch, |
294 Size: tool.Size, | 287 Size: tool.Size, |
295 Path: fmt.Sprintf("releases/juju-%s.tgz", tool.Versi
on.String()), | 288 Path: fmt.Sprintf("releases/juju-%s.tgz", tool.Versi
on.String()), |
296 FileType: "tar.gz", | 289 FileType: "tar.gz", |
297 SHA256: tool.SHA256, | 290 SHA256: tool.SHA256, |
298 } | 291 } |
299 } | 292 } |
300 c.Assert(metadata, gc.DeepEquals, expectedMetadata) | 293 c.Assert(metadata, gc.DeepEquals, expectedMetadata) |
301 } | 294 } |
302 | 295 |
303 func (s *simplestreamsSuite) TestWriteMetadataNoFetch(c *gc.C) { | 296 func (s *simplestreamsSuite) TestWriteMetadataNoFetch(c *gc.C) { |
304 toolsList := coretools.List{ | 297 toolsList := coretools.List{ |
305 { | 298 { |
306 Version: version.MustParseBinary("1.2.3-precise-amd64"), | 299 Version: version.MustParseBinary("1.2.3-precise-amd64"), |
307 Size: 123, | 300 Size: 123, |
308 SHA256: "abcd", | 301 SHA256: "abcd", |
309 }, { | 302 }, { |
310 Version: version.MustParseBinary("2.0.1-raring-amd64"), | 303 Version: version.MustParseBinary("2.0.1-raring-amd64"), |
311 Size: 456, | 304 Size: 456, |
312 SHA256: "xyz", | 305 SHA256: "xyz", |
313 }, | 306 }, |
314 } | 307 } |
315 dir := c.MkDir() | 308 dir := c.MkDir() |
316 writer, err := filestorage.NewFileStorageWriter(dir, filestorage.UseDefa
ultTmpDir) | 309 writer, err := filestorage.NewFileStorageWriter(dir, filestorage.UseDefa
ultTmpDir) |
317 c.Assert(err, gc.IsNil) | 310 c.Assert(err, gc.IsNil) |
318 » err = tools.MergeAndWriteMetadata(writer, toolsList, tools.DontResolve) | 311 » err = tools.MergeAndWriteMetadata(writer, toolsList) |
319 c.Assert(err, gc.IsNil) | 312 c.Assert(err, gc.IsNil) |
320 metadata := ttesting.ParseMetadata(c, dir) | 313 metadata := ttesting.ParseMetadata(c, dir) |
321 assertMetadataMatches(c, dir, toolsList, metadata) | 314 assertMetadataMatches(c, dir, toolsList, metadata) |
322 } | 315 } |
323 | 316 |
324 func (s *simplestreamsSuite) TestWriteMetadata(c *gc.C) { | 317 func (s *simplestreamsSuite) TestWriteMetadata(c *gc.C) { |
325 var versionStrings = []string{ | 318 var versionStrings = []string{ |
326 "1.2.3-precise-amd64", | 319 "1.2.3-precise-amd64", |
327 "2.0.1-raring-amd64", | 320 "2.0.1-raring-amd64", |
328 } | 321 } |
329 dir := c.MkDir() | 322 dir := c.MkDir() |
330 ttesting.MakeTools(c, dir, "releases", versionStrings) | 323 ttesting.MakeTools(c, dir, "releases", versionStrings) |
331 | 324 |
332 toolsList := coretools.List{ | 325 toolsList := coretools.List{ |
333 { | 326 { |
334 // If sha256/size is already known, do not recalculate | 327 // If sha256/size is already known, do not recalculate |
335 Version: version.MustParseBinary("1.2.3-precise-amd64"), | 328 Version: version.MustParseBinary("1.2.3-precise-amd64"), |
336 Size: 123, | 329 Size: 123, |
337 SHA256: "abcd", | 330 SHA256: "abcd", |
338 }, { | 331 }, { |
339 Version: version.MustParseBinary("2.0.1-raring-amd64"), | 332 Version: version.MustParseBinary("2.0.1-raring-amd64"), |
340 // The URL is not used for generating metadata. | 333 // The URL is not used for generating metadata. |
341 URL: "bogus://", | 334 URL: "bogus://", |
342 }, | 335 }, |
343 } | 336 } |
344 writer, err := filestorage.NewFileStorageWriter(dir, filestorage.UseDefa
ultTmpDir) | 337 writer, err := filestorage.NewFileStorageWriter(dir, filestorage.UseDefa
ultTmpDir) |
345 c.Assert(err, gc.IsNil) | 338 c.Assert(err, gc.IsNil) |
346 » err = tools.MergeAndWriteMetadata(writer, toolsList, tools.Resolve) | 339 » err = tools.MergeAndWriteMetadata(writer, toolsList) |
347 c.Assert(err, gc.IsNil) | 340 c.Assert(err, gc.IsNil) |
348 metadata := ttesting.ParseMetadata(c, dir) | 341 metadata := ttesting.ParseMetadata(c, dir) |
349 assertMetadataMatches(c, dir, toolsList, metadata) | 342 assertMetadataMatches(c, dir, toolsList, metadata) |
350 } | 343 } |
351 | 344 |
352 func (s *simplestreamsSuite) TestWriteMetadataMergeWithExisting(c *gc.C) { | 345 func (s *simplestreamsSuite) TestWriteMetadataMergeWithExisting(c *gc.C) { |
353 dir := c.MkDir() | 346 dir := c.MkDir() |
354 existingToolsList := coretools.List{ | 347 existingToolsList := coretools.List{ |
355 { | 348 { |
356 Version: version.MustParseBinary("1.2.3-precise-amd64"), | 349 Version: version.MustParseBinary("1.2.3-precise-amd64"), |
357 Size: 123, | 350 Size: 123, |
358 SHA256: "abc", | 351 SHA256: "abc", |
359 }, { | 352 }, { |
360 Version: version.MustParseBinary("2.0.1-raring-amd64"), | 353 Version: version.MustParseBinary("2.0.1-raring-amd64"), |
361 Size: 456, | 354 Size: 456, |
362 SHA256: "xyz", | 355 SHA256: "xyz", |
363 }, | 356 }, |
364 } | 357 } |
365 writer, err := filestorage.NewFileStorageWriter(dir, filestorage.UseDefa
ultTmpDir) | 358 writer, err := filestorage.NewFileStorageWriter(dir, filestorage.UseDefa
ultTmpDir) |
366 c.Assert(err, gc.IsNil) | 359 c.Assert(err, gc.IsNil) |
367 » err = tools.MergeAndWriteMetadata(writer, existingToolsList, tools.Resol
ve) | 360 » err = tools.MergeAndWriteMetadata(writer, existingToolsList) |
368 c.Assert(err, gc.IsNil) | 361 c.Assert(err, gc.IsNil) |
369 newToolsList := coretools.List{ | 362 newToolsList := coretools.List{ |
370 existingToolsList[0], | 363 existingToolsList[0], |
371 { | 364 { |
372 Version: version.MustParseBinary("2.1.0-raring-amd64"), | 365 Version: version.MustParseBinary("2.1.0-raring-amd64"), |
373 Size: 789, | 366 Size: 789, |
374 SHA256: "def", | 367 SHA256: "def", |
375 }, | 368 }, |
376 } | 369 } |
377 » err = tools.MergeAndWriteMetadata(writer, newToolsList, tools.Resolve) | 370 » err = tools.MergeAndWriteMetadata(writer, newToolsList) |
378 c.Assert(err, gc.IsNil) | 371 c.Assert(err, gc.IsNil) |
379 requiredToolsList := append(existingToolsList, newToolsList[1]) | 372 requiredToolsList := append(existingToolsList, newToolsList[1]) |
380 metadata := ttesting.ParseMetadata(c, dir) | 373 metadata := ttesting.ParseMetadata(c, dir) |
381 assertMetadataMatches(c, dir, requiredToolsList, metadata) | 374 assertMetadataMatches(c, dir, requiredToolsList, metadata) |
382 } | 375 } |
383 | 376 |
384 type productSpecSuite struct{} | 377 type productSpecSuite struct{} |
385 | 378 |
386 var _ = gc.Suite(&productSpecSuite{}) | 379 var _ = gc.Suite(&productSpecSuite{}) |
387 | 380 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 Version: "1.2.3", | 569 Version: "1.2.3", |
577 Arch: "amd64", | 570 Arch: "amd64", |
578 Path: "path3", | 571 Path: "path3", |
579 } | 572 } |
580 | 573 |
581 withSize := func(md *tools.ToolsMetadata, size int64) *tools.ToolsMetada
ta { | 574 withSize := func(md *tools.ToolsMetadata, size int64) *tools.ToolsMetada
ta { |
582 clone := *md | 575 clone := *md |
583 clone.Size = size | 576 clone.Size = size |
584 return &clone | 577 return &clone |
585 } | 578 } |
| 579 withSHA256 := func(md *tools.ToolsMetadata, sha256 string) *tools.ToolsM
etadata { |
| 580 clone := *md |
| 581 clone.SHA256 = sha256 |
| 582 return &clone |
| 583 } |
586 | 584 |
587 type mdlist []*tools.ToolsMetadata | 585 type mdlist []*tools.ToolsMetadata |
588 type test struct { | 586 type test struct { |
589 name string | 587 name string |
590 lhs, rhs, merged []*tools.ToolsMetadata | 588 lhs, rhs, merged []*tools.ToolsMetadata |
| 589 err string |
591 } | 590 } |
592 tests := []test{{ | 591 tests := []test{{ |
593 name: "non-empty lhs, empty rhs", | 592 name: "non-empty lhs, empty rhs", |
594 lhs: mdlist{md1}, | 593 lhs: mdlist{md1}, |
595 rhs: nil, | 594 rhs: nil, |
596 merged: mdlist{md1}, | 595 merged: mdlist{md1}, |
597 }, { | 596 }, { |
598 name: "empty lhs, non-empty rhs", | 597 name: "empty lhs, non-empty rhs", |
599 lhs: nil, | 598 lhs: nil, |
600 rhs: mdlist{md2}, | 599 rhs: mdlist{md2}, |
(...skipping 12 matching lines...) Expand all Loading... |
613 name: "same tools in lhs and rhs, only lhs has a size: prefer
lhs", | 612 name: "same tools in lhs and rhs, only lhs has a size: prefer
lhs", |
614 lhs: mdlist{withSize(md1, 123)}, | 613 lhs: mdlist{withSize(md1, 123)}, |
615 rhs: mdlist{md2}, | 614 rhs: mdlist{md2}, |
616 merged: mdlist{withSize(md1, 123)}, | 615 merged: mdlist{withSize(md1, 123)}, |
617 }, { | 616 }, { |
618 name: "same tools in lhs and rhs, only rhs has a size: prefer
rhs", | 617 name: "same tools in lhs and rhs, only rhs has a size: prefer
rhs", |
619 lhs: mdlist{md1}, | 618 lhs: mdlist{md1}, |
620 rhs: mdlist{withSize(md2, 123)}, | 619 rhs: mdlist{withSize(md2, 123)}, |
621 merged: mdlist{withSize(md2, 123)}, | 620 merged: mdlist{withSize(md2, 123)}, |
622 }, { | 621 }, { |
623 » » name: "same tools in lhs and rhs, both have a size: prefer lhs
", | 622 » » name: "same tools in lhs and rhs, both have the same size: pre
fer lhs", |
624 lhs: mdlist{withSize(md1, 123)}, | 623 lhs: mdlist{withSize(md1, 123)}, |
625 » » rhs: mdlist{withSize(md2, 456)}, | 624 » » rhs: mdlist{withSize(md2, 123)}, |
626 merged: mdlist{withSize(md1, 123)}, | 625 merged: mdlist{withSize(md1, 123)}, |
| 626 }, { |
| 627 name: "same tools in lhs and rhs, both have different sizes: err
or", |
| 628 lhs: mdlist{withSize(md1, 123)}, |
| 629 rhs: mdlist{withSize(md2, 456)}, |
| 630 err: "metadata mismatch for 1\\.2\\.3-precise-amd64: sizes=\\(1
23,456\\) sha256=\\(,\\)", |
| 631 }, { |
| 632 name: "same tools in lhs and rhs, both have same size but differ
ent sha256: error", |
| 633 lhs: mdlist{withSHA256(withSize(md1, 123), "a")}, |
| 634 rhs: mdlist{withSHA256(withSize(md2, 123), "b")}, |
| 635 err: "metadata mismatch for 1\\.2\\.3-precise-amd64: sizes=\\(1
23,123\\) sha256=\\(a,b\\)", |
627 }, { | 636 }, { |
628 name: "lhs is a proper superset of rhs: union of lhs and rhs", | 637 name: "lhs is a proper superset of rhs: union of lhs and rhs", |
629 lhs: mdlist{md1, md3}, | 638 lhs: mdlist{md1, md3}, |
630 rhs: mdlist{md1}, | 639 rhs: mdlist{md1}, |
631 merged: mdlist{md1, md3}, | 640 merged: mdlist{md1, md3}, |
632 }, { | 641 }, { |
633 name: "rhs is a proper superset of lhs: union of lhs and rhs", | 642 name: "rhs is a proper superset of lhs: union of lhs and rhs", |
634 lhs: mdlist{md1}, | 643 lhs: mdlist{md1}, |
635 rhs: mdlist{md1, md3}, | 644 rhs: mdlist{md1, md3}, |
636 merged: mdlist{md1, md3}, | 645 merged: mdlist{md1, md3}, |
637 }} | 646 }} |
638 for i, test := range tests { | 647 for i, test := range tests { |
639 c.Logf("test %d: %s", i, test.name) | 648 c.Logf("test %d: %s", i, test.name) |
640 » » merged := tools.MergeMetadata(test.lhs, test.rhs) | 649 » » merged, err := tools.MergeMetadata(test.lhs, test.rhs) |
641 » » c.Assert(merged, gc.DeepEquals, test.merged) | 650 » » if test.err == "" { |
| 651 » » » c.Assert(err, gc.IsNil) |
| 652 » » » c.Assert(merged, gc.DeepEquals, test.merged) |
| 653 » » } else { |
| 654 » » » c.Assert(err, gc.ErrorMatches, test.err) |
| 655 » » » c.Assert(merged, gc.IsNil) |
| 656 » » } |
642 } | 657 } |
643 } | 658 } |
644 | 659 |
645 func (*metadataHelperSuite) TestReadWriteMetadata(c *gc.C) { | 660 func (*metadataHelperSuite) TestReadWriteMetadata(c *gc.C) { |
646 metadata := []*tools.ToolsMetadata{{ | 661 metadata := []*tools.ToolsMetadata{{ |
647 Release: "precise", | 662 Release: "precise", |
648 Version: "1.2.3", | 663 Version: "1.2.3", |
649 Arch: "amd64", | 664 Arch: "amd64", |
650 Path: "path1", | 665 Path: "path1", |
651 }, { | 666 }, { |
(...skipping 11 matching lines...) Expand all Loading... |
663 err = tools.WriteMetadata(stor, metadata) | 678 err = tools.WriteMetadata(stor, metadata) |
664 c.Assert(err, gc.IsNil) | 679 c.Assert(err, gc.IsNil) |
665 out, err = tools.ReadMetadata(stor) | 680 out, err = tools.ReadMetadata(stor) |
666 for _, md := range out { | 681 for _, md := range out { |
667 // FullPath is set by ReadMetadata. | 682 // FullPath is set by ReadMetadata. |
668 c.Assert(md.FullPath, gc.Not(gc.Equals), "") | 683 c.Assert(md.FullPath, gc.Not(gc.Equals), "") |
669 md.FullPath = "" | 684 md.FullPath = "" |
670 } | 685 } |
671 c.Assert(out, gc.DeepEquals, metadata) | 686 c.Assert(out, gc.DeepEquals, metadata) |
672 } | 687 } |
LEFT | RIGHT |