launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cmd/plugins/juju-metadata/toolsmetadata_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 "bytes" 8 "fmt" 9 "path/filepath" 10 "regexp" 11 "strings" 12 13 "github.com/loggo/loggo" 14 gc "launchpad.net/gocheck" 15 16 "launchpad.net/juju-core/cmd" 17 "launchpad.net/juju-core/environs" 18 "launchpad.net/juju-core/environs/configstore" 19 envtesting "launchpad.net/juju-core/environs/testing" 20 "launchpad.net/juju-core/environs/tools" 21 ttesting "launchpad.net/juju-core/environs/tools/testing" 22 "launchpad.net/juju-core/juju/osenv" 23 "launchpad.net/juju-core/provider/dummy" 24 coretesting "launchpad.net/juju-core/testing" 25 "launchpad.net/juju-core/testing/testbase" 26 "launchpad.net/juju-core/version" 27 ) 28 29 type ToolsMetadataSuite struct { 30 testbase.LoggingSuite 31 home *coretesting.FakeHome 32 env environs.Environ 33 publicStorageDir string 34 } 35 36 var _ = gc.Suite(&ToolsMetadataSuite{}) 37 38 func (s *ToolsMetadataSuite) SetUpTest(c *gc.C) { 39 s.LoggingSuite.SetUpTest(c) 40 s.home = coretesting.MakeSampleHome(c) 41 s.AddCleanup(func(*gc.C) { 42 s.home.Restore() 43 dummy.Reset() 44 loggo.ResetLoggers() 45 }) 46 env, err := environs.PrepareFromName("erewhemos", configstore.NewMem()) 47 c.Assert(err, gc.IsNil) 48 s.env = env 49 envtesting.RemoveAllTools(c, s.env) 50 loggo.GetLogger("").SetLogLevel(loggo.INFO) 51 52 // Switch the default tools location. 53 s.publicStorageDir = c.MkDir() 54 s.PatchValue(&tools.DefaultBaseURL, s.publicStorageDir) 55 } 56 57 var currentVersionStrings = []string{ 58 // only these ones will make it into the JSON files. 59 version.Current.Number.String() + "-quantal-amd64", 60 version.Current.Number.String() + "-quantal-arm", 61 version.Current.Number.String() + "-quantal-i386", 62 } 63 64 var versionStrings = append([]string{ 65 "1.12.0-precise-amd64", 66 "1.12.0-precise-i386", 67 "1.12.0-raring-amd64", 68 "1.12.0-raring-i386", 69 "1.13.0-precise-amd64", 70 }, currentVersionStrings...) 71 72 var expectedOutputCommon = makeExpectedOutputCommon() 73 74 func makeExpectedOutputCommon() string { 75 expected := `Finding tools in .* 76 .*Fetching tools to generate hash: 1\.12\.0-precise-amd64 77 .*Fetching tools to generate hash: 1\.12\.0-precise-i386 78 .*Fetching tools to generate hash: 1\.12\.0-raring-amd64 79 .*Fetching tools to generate hash: 1\.12\.0-raring-i386 80 .*Fetching tools to generate hash: 1\.13\.0-precise-amd64 81 ` 82 f := ".*Fetching tools to generate hash: %s\n" 83 for _, v := range currentVersionStrings { 84 expected += fmt.Sprintf(f, regexp.QuoteMeta(v)) 85 } 86 return strings.TrimSpace(expected) 87 } 88 89 var expectedOutputDirectory = expectedOutputCommon + ` 90 .*Writing tools/streams/v1/index\.json 91 .*Writing tools/streams/v1/com\.ubuntu\.juju:released:tools\.json 92 ` 93 var expectedOutputMirrors = expectedOutputCommon + ` 94 .*Writing tools/streams/v1/index\.json 95 .*Writing tools/streams/v1/com\.ubuntu\.juju:released:tools\.json 96 .*Writing tools/streams/v1/mirrors\.json 97 ` 98 99 func (s *ToolsMetadataSuite) TestGenerateDefaultDirectory(c *gc.C) { 100 metadataDir := osenv.JujuHome() // default metadata dir 101 ttesting.MakeTools(c, metadataDir, "releases", versionStrings) 102 ctx := coretesting.Context(c) 103 code := cmd.Main(&ToolsMetadataCommand{}, ctx, nil) 104 c.Assert(code, gc.Equals, 0) 105 output := ctx.Stdout.(*bytes.Buffer).String() 106 c.Assert(output, gc.Matches, expectedOutputDirectory) 107 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, false) 108 c.Assert(metadata, gc.HasLen, len(versionStrings)) 109 obtainedVersionStrings := make([]string, len(versionStrings)) 110 for i, metadata := range metadata { 111 s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch) 112 obtainedVersionStrings[i] = s 113 } 114 c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings) 115 } 116 117 func (s *ToolsMetadataSuite) TestGenerateDirectory(c *gc.C) { 118 metadataDir := c.MkDir() 119 ttesting.MakeTools(c, metadataDir, "releases", versionStrings) 120 ctx := coretesting.Context(c) 121 code := cmd.Main(&ToolsMetadataCommand{}, ctx, []string{"-d", metadataDir}) 122 c.Assert(code, gc.Equals, 0) 123 output := ctx.Stdout.(*bytes.Buffer).String() 124 c.Assert(output, gc.Matches, expectedOutputDirectory) 125 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, false) 126 c.Assert(metadata, gc.HasLen, len(versionStrings)) 127 obtainedVersionStrings := make([]string, len(versionStrings)) 128 for i, metadata := range metadata { 129 s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch) 130 obtainedVersionStrings[i] = s 131 } 132 c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings) 133 } 134 135 func (s *ToolsMetadataSuite) TestGenerateWithPublicFallback(c *gc.C) { 136 // Write tools and metadata to the public tools location. 137 ttesting.MakeToolsWithCheckSum(c, s.publicStorageDir, "releases", versionStrings) 138 139 // Run the command with no local metadata. 140 ctx := coretesting.Context(c) 141 metadataDir := c.MkDir() 142 code := cmd.Main(&ToolsMetadataCommand{}, ctx, []string{"-d", metadataDir}) 143 c.Assert(code, gc.Equals, 0) 144 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, false) 145 c.Assert(metadata, gc.HasLen, len(versionStrings)) 146 obtainedVersionStrings := make([]string, len(versionStrings)) 147 for i, metadata := range metadata { 148 s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch) 149 obtainedVersionStrings[i] = s 150 } 151 c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings) 152 } 153 154 func (s *ToolsMetadataSuite) TestGenerateWithMirrors(c *gc.C) { 155 metadataDir := c.MkDir() 156 ttesting.MakeTools(c, metadataDir, "releases", versionStrings) 157 ctx := coretesting.Context(c) 158 code := cmd.Main(&ToolsMetadataCommand{}, ctx, []string{"--public", "-d", metadataDir}) 159 c.Assert(code, gc.Equals, 0) 160 output := ctx.Stdout.(*bytes.Buffer).String() 161 c.Assert(output, gc.Matches, expectedOutputMirrors) 162 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, true) 163 c.Assert(metadata, gc.HasLen, len(versionStrings)) 164 obtainedVersionStrings := make([]string, len(versionStrings)) 165 for i, metadata := range metadata { 166 s := fmt.Sprintf("%s-%s-%s", metadata.Version, metadata.Release, metadata.Arch) 167 obtainedVersionStrings[i] = s 168 } 169 c.Assert(obtainedVersionStrings, gc.DeepEquals, versionStrings) 170 } 171 172 func (s *ToolsMetadataSuite) TestNoTools(c *gc.C) { 173 ctx := coretesting.Context(c) 174 code := cmd.Main(&ToolsMetadataCommand{}, ctx, nil) 175 c.Assert(code, gc.Equals, 1) 176 stdout := ctx.Stdout.(*bytes.Buffer).String() 177 c.Assert(stdout, gc.Matches, "Finding tools in .*\n") 178 stderr := ctx.Stderr.(*bytes.Buffer).String() 179 c.Assert(stderr, gc.Matches, "error: no tools available\n") 180 } 181 182 func (s *ToolsMetadataSuite) TestPatchLevels(c *gc.C) { 183 currentVersion := version.Current.Number 184 currentVersion.Build = 0 185 versionStrings := []string{ 186 currentVersion.String() + "-precise-amd64", 187 currentVersion.String() + ".1-precise-amd64", 188 } 189 metadataDir := osenv.JujuHome() // default metadata dir 190 ttesting.MakeTools(c, metadataDir, "releases", versionStrings) 191 ctx := coretesting.Context(c) 192 code := cmd.Main(&ToolsMetadataCommand{}, ctx, nil) 193 c.Assert(code, gc.Equals, 0) 194 output := ctx.Stdout.(*bytes.Buffer).String() 195 expectedOutput := fmt.Sprintf(` 196 Finding tools in .* 197 .*Fetching tools to generate hash: %s 198 .*Fetching tools to generate hash: %s 199 .*Writing tools/streams/v1/index\.json 200 .*Writing tools/streams/v1/com\.ubuntu\.juju:released:tools\.json 201 `[1:], regexp.QuoteMeta(versionStrings[0]), regexp.QuoteMeta(versionStrings[1])) 202 c.Assert(output, gc.Matches, expectedOutput) 203 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, false) 204 c.Assert(metadata, gc.HasLen, 2) 205 206 filename := fmt.Sprintf("juju-%s-precise-amd64.tgz", currentVersion) 207 size, sha256 := ttesting.SHA256sum(c, filepath.Join(metadataDir, "tools", "releases", filename)) 208 c.Assert(metadata[0], gc.DeepEquals, &tools.ToolsMetadata{ 209 Release: "precise", 210 Version: currentVersion.String(), 211 Arch: "amd64", 212 Size: size, 213 Path: "releases/" + filename, 214 FileType: "tar.gz", 215 SHA256: sha256, 216 }) 217 218 filename = fmt.Sprintf("juju-%s.1-precise-amd64.tgz", currentVersion) 219 size, sha256 = ttesting.SHA256sum(c, filepath.Join(metadataDir, "tools", "releases", filename)) 220 c.Assert(metadata[1], gc.DeepEquals, &tools.ToolsMetadata{ 221 Release: "precise", 222 Version: currentVersion.String() + ".1", 223 Arch: "amd64", 224 Size: size, 225 Path: "releases/" + filename, 226 FileType: "tar.gz", 227 SHA256: sha256, 228 }) 229 }