1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
10
jc "github.com/juju/testing/checkers"
11
gc "gopkg.in/check.v1"
13
"github.com/juju/juju/environs/tools"
16
var _ = gc.Suite(&marshalSuite{})
18
type marshalSuite struct {
19
streamMetadata map[string][]*tools.ToolsMetadata
22
func (s *marshalSuite) SetUpTest(c *gc.C) {
23
s.streamMetadata = map[string][]*tools.ToolsMetadata{
24
"released": releasedToolMetadataForTesting,
25
"proposed": proposedToolMetadataForTesting,
29
func (s *marshalSuite) TestLargeNumber(c *gc.C) {
30
metadata := map[string][]*tools.ToolsMetadata{
36
Size: 9223372036854775807,
37
Path: "/somewhere/over/the/rainbow.tar.gz",
41
_, _, products, err := tools.MarshalToolsMetadataJSON(metadata, time.Now())
42
c.Assert(err, jc.ErrorIsNil)
43
c.Assert(string(products["released"]), jc.Contains, `"size": 9223372036854775807`)
46
var expectedIndex = `{
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",
54
"com.ubuntu.juju:14.04:arm64",
55
"com.ubuntu.juju:14.10:ppc64el"
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",
64
"com.ubuntu.juju:12.04:amd64",
65
"com.ubuntu.juju:12.04:arm",
66
"com.ubuntu.juju:13.10:arm"
70
"updated": "Thu, 01 Jan 1970 00:00:00 +0000",
74
var expectedLegacyIndex = `{
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",
82
"com.ubuntu.juju:12.04:amd64",
83
"com.ubuntu.juju:12.04:arm",
84
"com.ubuntu.juju:13.10:arm"
88
"updated": "Thu, 01 Jan 1970 00:00:00 +0000",
92
var expectedReleasedProducts = `{
94
"com.ubuntu.juju:12.04:amd64": {
100
"4.3.2.1-precise-amd64": {
101
"release": "precise",
102
"version": "4.3.2.1",
105
"path": "whatever.tar.gz",
107
"sha256": "afb14e65c794464e378def12cbad6a96f9186d69"
113
"com.ubuntu.juju:12.04:arm": {
114
"version": "1.2.3.4",
119
"1.2.3.4-precise-arm": {
120
"release": "precise",
121
"version": "1.2.3.4",
124
"path": "toenlightenment.tar.gz",
132
"com.ubuntu.juju:13.10:arm": {
133
"version": "1.2.3.4",
138
"1.2.3.4-saucy-arm": {
140
"version": "1.2.3.4",
142
"size": 9223372036854775807,
143
"path": "/somewhere/over/the/rainbow.tar.gz",
152
"updated": "Thu, 01 Jan 1970 00:00:00 +0000",
153
"format": "products:1.0",
154
"content_id": "com.ubuntu.juju:released:tools"
157
var expectedProposedProducts = `{
159
"com.ubuntu.juju:14.04:arm64": {
160
"version": "1.2-beta1",
165
"1.2-beta1-trusty-arm64": {
167
"version": "1.2-beta1",
170
"path": "gotham.tar.gz",
178
"com.ubuntu.juju:14.10:ppc64el": {
179
"version": "1.2-alpha1",
184
"1.2-alpha1-utopic-ppc64el": {
186
"version": "1.2-alpha1",
188
"size": 9223372036854775807,
189
"path": "/funkytown.tar.gz",
198
"updated": "Thu, 01 Jan 1970 00:00:00 +0000",
199
"format": "products:1.0",
200
"content_id": "com.ubuntu.juju:proposed:tools"
203
var releasedToolMetadataForTesting = []*tools.ToolsMetadata{
208
Size: 9223372036854775807,
209
Path: "/somewhere/over/the/rainbow.tar.gz",
217
Path: "toenlightenment.tar.gz",
224
Path: "whatever.tar.gz",
226
SHA256: "afb14e65c794464e378def12cbad6a96f9186d69",
229
Release: "xuanhuaceratops",
233
Path: "dinodance.tar.gz",
237
Release: "xuanhanosaurus",
241
Path: "dinodisco.tar.gz",
246
var proposedToolMetadataForTesting = []*tools.ToolsMetadata{
249
Version: "1.2-alpha1",
251
Size: 9223372036854775807,
252
Path: "/funkytown.tar.gz",
257
Version: "1.2-beta1",
260
Path: "gotham.tar.gz",
264
Release: "xuanhuaceratops",
268
Path: "dinodance.tar.gz",
272
Release: "xuanhanosaurus",
276
Path: "dinodisco.tar.gz",
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)
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)
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)
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)
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)
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)