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