1
// Copyright 2012, 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"
12
"gopkg.in/mgo.v2/bson"
13
goyaml "gopkg.in/yaml.v2"
15
"github.com/juju/version"
20
var _ = gc.Suite(&suite{})
22
func (*suite) TestCompare(c *gc.C) {
23
cmpTests := []struct {
27
{"1.0.0", "1.0.0", 0},
28
{"01.0.0", "1.0.0", 0},
29
{"10.0.0", "9.0.0", 1},
30
{"1.0.0", "1.0.1", -1},
31
{"1.0.1", "1.0.0", 1},
32
{"1.0.0", "1.1.0", -1},
33
{"1.1.0", "1.0.0", 1},
34
{"1.0.0", "2.0.0", -1},
35
{"1.2-alpha1", "1.2.0", -1},
36
{"1.2-alpha2", "1.2-alpha1", 1},
37
{"1.2-alpha2.1", "1.2-alpha2", 1},
38
{"1.2-alpha2.2", "1.2-alpha2.1", 1},
39
{"1.2-beta1", "1.2-alpha1", 1},
40
{"1.2-beta1", "1.2-alpha2.1", 1},
41
{"1.2-beta1", "1.2.0", -1},
42
{"1.2.1", "1.2.0", 1},
43
{"2.0.0", "1.0.0", 1},
44
{"2.0.0.0", "2.0.0", 0},
45
{"2.0.0.0", "2.0.0.0", 0},
46
{"2.0.0.1", "2.0.0.0", 1},
47
{"2.0.1.10", "2.0.0.0", 1},
48
{"2.0-_0", "2.0-00", 1},
49
{"2.0-_0", "2.0.0", -1},
50
{"2.0-_0", "2.0-alpha1.0", -1},
51
{"2.0-_0", "1.999.0", 1},
54
for i, test := range cmpTests {
56
v1, err := version.Parse(test.v1)
57
c.Assert(err, jc.ErrorIsNil)
58
v2, err := version.Parse(test.v2)
59
c.Assert(err, jc.ErrorIsNil)
60
compare := v1.Compare(v2)
61
c.Check(compare, gc.Equals, test.compare)
62
// Check that reversing the operands has
63
// the expected result.
64
compare = v2.Compare(v1)
65
c.Check(compare, gc.Equals, -test.compare)
69
var parseTests = []struct {
77
expect: version.Number{Major: 0, Minor: 0, Patch: 1},
80
expect: version.Number{Major: 0, Minor: 0, Patch: 2},
83
expect: version.Number{Major: 0, Minor: 1, Patch: 0},
86
expect: version.Number{Major: 0, Minor: 2, Patch: 3},
89
expect: version.Number{Major: 1, Minor: 0, Patch: 0},
92
expect: version.Number{Major: 10, Minor: 234, Patch: 3456},
95
expect: version.Number{Major: 10, Minor: 234, Patch: 3456, Build: 1},
98
expect: version.Number{Major: 10, Minor: 234, Patch: 3456, Build: 64},
101
expect: version.Number{Major: 10, Minor: 235, Patch: 3456},
104
expect: version.Number{Major: 1, Minor: 21, Patch: 1, Tag: "alpha"},
107
expect: version.Number{Major: 1, Minor: 21, Patch: 1, Tag: "alpha", Build: 1},
110
expect: version.Number{Major: 1, Minor: 21},
113
err: "invalid version.*",
116
err: "invalid version.*",
119
err: "invalid version.*",
122
err: "invalid version.*",
124
v: "1.21-alpha1beta",
125
err: "invalid version.*",
128
err: "invalid version.*",
131
func (*suite) TestParse(c *gc.C) {
132
for i, test := range parseTests {
134
got, err := version.Parse(test.v)
136
c.Assert(err, gc.ErrorMatches, test.err)
138
c.Assert(err, jc.ErrorIsNil)
139
c.Assert(got, gc.Equals, test.expect)
140
c.Check(got.String(), gc.Equals, test.v)
145
func binaryVersion(major, minor, patch, build int, tag, series, arch string) version.Binary {
146
return version.Binary{
147
Number: version.Number{
159
func (*suite) TestParseBinary(c *gc.C) {
160
parseBinaryTests := []struct {
163
expect version.Binary
165
v: "1.2.3-trusty-amd64",
166
expect: binaryVersion(1, 2, 3, 0, "", "trusty", "amd64"),
168
v: "1.2.3.4-trusty-amd64",
169
expect: binaryVersion(1, 2, 3, 4, "", "trusty", "amd64"),
171
v: "1.2-alpha3-trusty-amd64",
172
expect: binaryVersion(1, 2, 3, 0, "alpha", "trusty", "amd64"),
174
v: "1.2-alpha3.4-trusty-amd64",
175
expect: binaryVersion(1, 2, 3, 4, "alpha", "trusty", "amd64"),
178
err: "invalid binary version.*",
181
err: "invalid binary version.*",
184
err: "invalid binary version.*",
187
err: "invalid binary version.*",
190
for i, test := range parseBinaryTests {
191
c.Logf("test 1: %d", i)
192
got, err := version.ParseBinary(test.v)
194
c.Assert(err, gc.ErrorMatches, test.err)
196
c.Assert(err, jc.ErrorIsNil)
197
c.Assert(got, gc.Equals, test.expect)
201
for i, test := range parseTests {
202
c.Logf("test 2: %d", i)
203
v := test.v + "-trusty-amd64"
204
got, err := version.ParseBinary(v)
205
expect := version.Binary{
211
c.Assert(err, gc.ErrorMatches, strings.Replace(test.err, "version", "binary version", 1))
213
c.Assert(err, jc.ErrorIsNil)
214
c.Assert(got, gc.Equals, expect)
219
var marshallers = []struct {
221
marshal func(interface{}) ([]byte, error)
222
unmarshal func([]byte, interface{}) error
237
func (*suite) TestBinaryMarshalUnmarshal(c *gc.C) {
238
for _, m := range marshallers {
239
c.Logf("encoding %v", m.name)
241
Version *version.Binary
243
// Work around goyaml bug #1096149
244
// SetYAML is not called for non-pointer fields.
245
bp := version.MustParseBinary("1.2.3-trusty-amd64")
247
data, err := m.marshal(&v)
248
c.Assert(err, jc.ErrorIsNil)
250
err = m.unmarshal(data, &bv)
251
c.Assert(err, jc.ErrorIsNil)
252
c.Assert(bv, gc.DeepEquals, v)
256
func (*suite) TestNumberMarshalUnmarshal(c *gc.C) {
257
for _, m := range marshallers {
258
c.Logf("encoding %v", m.name)
260
Version *version.Number
262
// Work around goyaml bug #1096149
263
// SetYAML is not called for non-pointer fields.
264
np := version.MustParse("1.2.3")
266
data, err := m.marshal(&v)
267
c.Assert(err, jc.ErrorIsNil)
269
err = m.unmarshal(data, &nv)
270
c.Assert(err, jc.ErrorIsNil)
271
c.Assert(nv, gc.DeepEquals, v)
275
func (*suite) TestParseMajorMinor(c *gc.C) {
276
parseMajorMinorTests := []struct {
291
err: "invalid major.minor version number 1.2.3",
294
err: `invalid major version number blah: strconv.ParseInt: parsing "blah": invalid syntax`,
297
for i, test := range parseMajorMinorTests {
299
major, minor, err := version.ParseMajorMinor(test.v)
301
c.Check(err, gc.ErrorMatches, test.err)
303
c.Check(err, jc.ErrorIsNil)
304
c.Check(major, gc.Equals, test.expectMajor)
305
c.Check(minor, gc.Equals, test.expectMinor)