github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/environs/tools/marshal_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package tools_test 5 6 import ( 7 "encoding/json" 8 "time" 9 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/environs/tools" 14 ) 15 16 var _ = gc.Suite(&marshalSuite{}) 17 18 type marshalSuite struct { 19 streamMetadata map[string][]*tools.ToolsMetadata 20 } 21 22 func (s *marshalSuite) SetUpTest(c *gc.C) { 23 s.streamMetadata = map[string][]*tools.ToolsMetadata{ 24 "released": releasedToolMetadataForTesting, 25 "proposed": proposedToolMetadataForTesting, 26 } 27 } 28 29 func (s *marshalSuite) TestLargeNumber(c *gc.C) { 30 metadata := map[string][]*tools.ToolsMetadata{ 31 "released": { 32 { 33 Release: "saucy", 34 Version: "1.2.3.4", 35 Arch: "arm", 36 Size: 9223372036854775807, 37 Path: "/somewhere/over/the/rainbow.tar.gz", 38 FileType: "tar.gz", 39 }}, 40 } 41 _, _, products, err := tools.MarshalToolsMetadataJSON(metadata, time.Now()) 42 c.Assert(err, jc.ErrorIsNil) 43 c.Assert(string(products["released"]), jc.Contains, `"size": 9223372036854775807`) 44 } 45 46 var expectedIndex = `{ 47 "index": { 48 "com.ubuntu.juju:proposed:tools": { 49 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 50 "format": "products:1.0", 51 "datatype": "content-download", 52 "path": "streams/v1/com.ubuntu.juju-proposed-tools.json", 53 "products": [ 54 "com.ubuntu.juju:14.04:arm64", 55 "com.ubuntu.juju:14.10:ppc64el" 56 ] 57 }, 58 "com.ubuntu.juju:released:tools": { 59 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 60 "format": "products:1.0", 61 "datatype": "content-download", 62 "path": "streams/v1/com.ubuntu.juju-released-tools.json", 63 "products": [ 64 "com.ubuntu.juju:12.04:amd64", 65 "com.ubuntu.juju:12.04:arm", 66 "com.ubuntu.juju:13.10:arm" 67 ] 68 } 69 }, 70 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 71 "format": "index:1.0" 72 }` 73 74 var expectedLegacyIndex = `{ 75 "index": { 76 "com.ubuntu.juju:released:tools": { 77 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 78 "format": "products:1.0", 79 "datatype": "content-download", 80 "path": "streams/v1/com.ubuntu.juju-released-tools.json", 81 "products": [ 82 "com.ubuntu.juju:12.04:amd64", 83 "com.ubuntu.juju:12.04:arm", 84 "com.ubuntu.juju:13.10:arm" 85 ] 86 } 87 }, 88 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 89 "format": "index:1.0" 90 }` 91 92 var expectedReleasedProducts = `{ 93 "products": { 94 "com.ubuntu.juju:12.04:amd64": { 95 "version": "4.3.2.1", 96 "arch": "amd64", 97 "versions": { 98 "19700101": { 99 "items": { 100 "4.3.2.1-precise-amd64": { 101 "release": "precise", 102 "version": "4.3.2.1", 103 "arch": "amd64", 104 "size": 0, 105 "path": "whatever.tar.gz", 106 "ftype": "tar.gz", 107 "sha256": "afb14e65c794464e378def12cbad6a96f9186d69" 108 } 109 } 110 } 111 } 112 }, 113 "com.ubuntu.juju:12.04:arm": { 114 "version": "1.2.3.4", 115 "arch": "arm", 116 "versions": { 117 "19700101": { 118 "items": { 119 "1.2.3.4-precise-arm": { 120 "release": "precise", 121 "version": "1.2.3.4", 122 "arch": "arm", 123 "size": 42, 124 "path": "toenlightenment.tar.gz", 125 "ftype": "tar.gz", 126 "sha256": "" 127 } 128 } 129 } 130 } 131 }, 132 "com.ubuntu.juju:13.10:arm": { 133 "version": "1.2.3.4", 134 "arch": "arm", 135 "versions": { 136 "19700101": { 137 "items": { 138 "1.2.3.4-saucy-arm": { 139 "release": "saucy", 140 "version": "1.2.3.4", 141 "arch": "arm", 142 "size": 9223372036854775807, 143 "path": "/somewhere/over/the/rainbow.tar.gz", 144 "ftype": "tar.gz", 145 "sha256": "" 146 } 147 } 148 } 149 } 150 } 151 }, 152 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 153 "format": "products:1.0", 154 "content_id": "com.ubuntu.juju:released:tools" 155 }` 156 157 var expectedProposedProducts = `{ 158 "products": { 159 "com.ubuntu.juju:14.04:arm64": { 160 "version": "1.2-beta1", 161 "arch": "arm64", 162 "versions": { 163 "19700101": { 164 "items": { 165 "1.2-beta1-trusty-arm64": { 166 "release": "trusty", 167 "version": "1.2-beta1", 168 "arch": "arm64", 169 "size": 42, 170 "path": "gotham.tar.gz", 171 "ftype": "tar.gz", 172 "sha256": "" 173 } 174 } 175 } 176 } 177 }, 178 "com.ubuntu.juju:14.10:ppc64el": { 179 "version": "1.2-alpha1", 180 "arch": "ppc64el", 181 "versions": { 182 "19700101": { 183 "items": { 184 "1.2-alpha1-utopic-ppc64el": { 185 "release": "utopic", 186 "version": "1.2-alpha1", 187 "arch": "ppc64el", 188 "size": 9223372036854775807, 189 "path": "/funkytown.tar.gz", 190 "ftype": "tar.gz", 191 "sha256": "" 192 } 193 } 194 } 195 } 196 } 197 }, 198 "updated": "Thu, 01 Jan 1970 00:00:00 +0000", 199 "format": "products:1.0", 200 "content_id": "com.ubuntu.juju:proposed:tools" 201 }` 202 203 var releasedToolMetadataForTesting = []*tools.ToolsMetadata{ 204 { 205 Release: "saucy", 206 Version: "1.2.3.4", 207 Arch: "arm", 208 Size: 9223372036854775807, 209 Path: "/somewhere/over/the/rainbow.tar.gz", 210 FileType: "tar.gz", 211 }, 212 { 213 Release: "precise", 214 Version: "1.2.3.4", 215 Arch: "arm", 216 Size: 42, 217 Path: "toenlightenment.tar.gz", 218 FileType: "tar.gz", 219 }, 220 { 221 Release: "precise", 222 Version: "4.3.2.1", 223 Arch: "amd64", 224 Path: "whatever.tar.gz", 225 FileType: "tar.gz", 226 SHA256: "afb14e65c794464e378def12cbad6a96f9186d69", 227 }, 228 { 229 Release: "xuanhuaceratops", 230 Version: "4.3.2.1", 231 Arch: "amd64", 232 Size: 42, 233 Path: "dinodance.tar.gz", 234 FileType: "tar.gz", 235 }, 236 { 237 Release: "xuanhanosaurus", 238 Version: "5.4.3.2", 239 Arch: "amd64", 240 Size: 42, 241 Path: "dinodisco.tar.gz", 242 FileType: "tar.gz", 243 }, 244 } 245 246 var proposedToolMetadataForTesting = []*tools.ToolsMetadata{ 247 { 248 Release: "utopic", 249 Version: "1.2-alpha1", 250 Arch: "ppc64el", 251 Size: 9223372036854775807, 252 Path: "/funkytown.tar.gz", 253 FileType: "tar.gz", 254 }, 255 { 256 Release: "trusty", 257 Version: "1.2-beta1", 258 Arch: "arm64", 259 Size: 42, 260 Path: "gotham.tar.gz", 261 FileType: "tar.gz", 262 }, 263 { 264 Release: "xuanhuaceratops", 265 Version: "4.3.2.1", 266 Arch: "amd64", 267 Size: 42, 268 Path: "dinodance.tar.gz", 269 FileType: "tar.gz", 270 }, 271 { 272 Release: "xuanhanosaurus", 273 Version: "5.4.3.2", 274 Arch: "amd64", 275 Size: 42, 276 Path: "dinodisco.tar.gz", 277 FileType: "tar.gz", 278 }, 279 } 280 281 func (s *marshalSuite) TestMarshalIndex(c *gc.C) { 282 index, legacyIndex, err := tools.MarshalToolsMetadataIndexJSON(s.streamMetadata, time.Unix(0, 0).UTC()) 283 c.Assert(err, jc.ErrorIsNil) 284 assertIndex(c, index, expectedIndex) 285 assertIndex(c, legacyIndex, expectedLegacyIndex) 286 } 287 288 func assertIndex(c *gc.C, obtainedIndex []byte, expectedIndex string) { 289 // Unmarshall into objects so an order independent comparison can be done. 290 var obtained interface{} 291 err := json.Unmarshal(obtainedIndex, &obtained) 292 var expected interface{} 293 err = json.Unmarshal([]byte(expectedIndex), &expected) 294 c.Assert(err, jc.ErrorIsNil) 295 c.Assert(obtained, jc.DeepEquals, expected) 296 } 297 298 func (s *marshalSuite) TestMarshalProducts(c *gc.C) { 299 products, err := tools.MarshalToolsMetadataProductsJSON(s.streamMetadata, time.Unix(0, 0).UTC()) 300 c.Assert(err, jc.ErrorIsNil) 301 assertProducts(c, products) 302 } 303 304 func assertProducts(c *gc.C, obtainedProducts map[string][]byte) { 305 c.Assert(obtainedProducts, gc.HasLen, 2) 306 c.Assert(string(obtainedProducts["released"]), gc.Equals, expectedReleasedProducts) 307 c.Assert(string(obtainedProducts["proposed"]), gc.Equals, expectedProposedProducts) 308 } 309 310 func (s *marshalSuite) TestMarshal(c *gc.C) { 311 index, legacyIndex, products, err := tools.MarshalToolsMetadataJSON(s.streamMetadata, time.Unix(0, 0).UTC()) 312 c.Assert(err, jc.ErrorIsNil) 313 assertIndex(c, index, expectedIndex) 314 assertIndex(c, legacyIndex, expectedLegacyIndex) 315 assertProducts(c, products) 316 } 317 318 func (s *marshalSuite) TestMarshalNoReleaseStream(c *gc.C) { 319 metadata := s.streamMetadata 320 delete(metadata, "released") 321 index, legacyIndex, products, err := tools.MarshalToolsMetadataJSON(s.streamMetadata, time.Unix(0, 0).UTC()) 322 c.Assert(err, jc.ErrorIsNil) 323 c.Assert(legacyIndex, gc.IsNil) 324 c.Assert(index, gc.NotNil) 325 c.Assert(products, gc.NotNil) 326 }