launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/version/version_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package version_test 5 6 import ( 7 "encoding/json" 8 "labix.org/v2/mgo/bson" 9 "strings" 10 "testing" 11 12 gc "launchpad.net/gocheck" 13 "launchpad.net/juju-core/version" 14 ) 15 16 type suite struct{} 17 18 var _ = gc.Suite(suite{}) 19 20 func Test(t *testing.T) { 21 gc.TestingT(t) 22 } 23 24 // N.B. The FORCE-VERSION logic is tested in the environs package. 25 26 var cmpTests = []struct { 27 v1, v2 string 28 less bool 29 eq bool 30 }{ 31 {"1.0.0", "1.0.0", false, true}, 32 {"01.0.0", "1.0.0", false, true}, 33 {"10.0.0", "9.0.0", false, false}, 34 {"1.0.0", "1.0.1", true, false}, 35 {"1.0.1", "1.0.0", false, false}, 36 {"1.0.0", "1.1.0", true, false}, 37 {"1.1.0", "1.0.0", false, false}, 38 {"1.0.0", "2.0.0", true, false}, 39 {"2.0.0", "1.0.0", false, false}, 40 {"2.0.0.0", "2.0.0", false, true}, 41 {"2.0.0.0", "2.0.0.0", false, true}, 42 {"2.0.0.1", "2.0.0.0", false, false}, 43 {"2.0.1.10", "2.0.0.0", false, false}, 44 } 45 46 func (suite) TestLess(c *gc.C) { 47 for i, test := range cmpTests { 48 c.Logf("test %d", i) 49 v1, err := version.Parse(test.v1) 50 c.Assert(err, gc.IsNil) 51 v2, err := version.Parse(test.v2) 52 c.Assert(err, gc.IsNil) 53 less := v1.Less(v2) 54 gt := v2.Less(v1) 55 c.Check(less, gc.Equals, test.less) 56 if test.eq { 57 c.Check(gt, gc.Equals, false) 58 } else { 59 c.Check(gt, gc.Equals, !test.less) 60 } 61 } 62 } 63 64 func (suite) TestLessEqual(c *gc.C) { 65 for i, test := range cmpTests { 66 c.Logf("test %d", i) 67 v1, err := version.Parse(test.v1) 68 c.Assert(err, gc.IsNil) 69 v2, err := version.Parse(test.v2) 70 c.Assert(err, gc.IsNil) 71 lessEqual := v1.LessEqual(v2) 72 gt := v2.LessEqual(v1) 73 c.Check(lessEqual, gc.Equals, test.eq || test.less) 74 if test.eq { 75 c.Check(lessEqual, gc.Equals, true) 76 } else { 77 c.Check(gt, gc.Equals, !test.less) 78 } 79 } 80 } 81 82 var parseTests = []struct { 83 v string 84 err string 85 expect version.Number 86 dev bool 87 }{{ 88 v: "0.0.0", 89 }, { 90 v: "0.0.1", 91 expect: version.Number{0, 0, 1, 0}, 92 }, { 93 v: "0.0.2", 94 expect: version.Number{0, 0, 2, 0}, 95 }, { 96 v: "0.1.0", 97 expect: version.Number{0, 1, 0, 0}, 98 dev: true, 99 }, { 100 v: "0.2.3", 101 expect: version.Number{0, 2, 3, 0}, 102 }, { 103 v: "1.0.0", 104 expect: version.Number{1, 0, 0, 0}, 105 }, { 106 v: "10.234.3456", 107 expect: version.Number{10, 234, 3456, 0}, 108 }, { 109 v: "10.234.3456.1", 110 expect: version.Number{10, 234, 3456, 1}, 111 dev: true, 112 }, { 113 v: "10.234.3456.64", 114 expect: version.Number{10, 234, 3456, 64}, 115 dev: true, 116 }, { 117 v: "10.235.3456", 118 expect: version.Number{10, 235, 3456, 0}, 119 dev: true, 120 }, { 121 v: "1234567890.2.1", 122 err: "invalid version.*", 123 }, { 124 v: "0.2..1", 125 err: "invalid version.*", 126 }} 127 128 func (suite) TestParse(c *gc.C) { 129 for i, test := range parseTests { 130 c.Logf("test %d", i) 131 got, err := version.Parse(test.v) 132 if test.err != "" { 133 c.Assert(err, gc.ErrorMatches, test.err) 134 } else { 135 c.Assert(err, gc.IsNil) 136 c.Assert(got, gc.Equals, test.expect) 137 c.Check(got.IsDev(), gc.Equals, test.dev) 138 c.Check(got.String(), gc.Equals, test.v) 139 } 140 } 141 } 142 143 func binaryVersion(major, minor, patch, build int, series, arch string) version.Binary { 144 return version.Binary{ 145 Number: version.Number{ 146 Major: major, 147 Minor: minor, 148 Patch: patch, 149 Build: build, 150 }, 151 Series: series, 152 Arch: arch, 153 } 154 } 155 156 var parseBinaryTests = []struct { 157 v string 158 err string 159 expect version.Binary 160 }{{ 161 v: "1.2.3-a-b", 162 expect: binaryVersion(1, 2, 3, 0, "a", "b"), 163 }, { 164 v: "1.2.3.4-a-b", 165 expect: binaryVersion(1, 2, 3, 4, "a", "b"), 166 }, { 167 v: "1.2.3--b", 168 err: "invalid binary version.*", 169 }, { 170 v: "1.2.3-a-", 171 err: "invalid binary version.*", 172 }} 173 174 func (suite) TestParseBinary(c *gc.C) { 175 for i, test := range parseBinaryTests { 176 c.Logf("test 1: %d", i) 177 got, err := version.ParseBinary(test.v) 178 if test.err != "" { 179 c.Assert(err, gc.ErrorMatches, test.err) 180 } else { 181 c.Assert(err, gc.IsNil) 182 c.Assert(got, gc.Equals, test.expect) 183 } 184 } 185 186 for i, test := range parseTests { 187 c.Logf("test 2: %d", i) 188 v := test.v + "-a-b" 189 got, err := version.ParseBinary(v) 190 expect := version.Binary{ 191 Number: test.expect, 192 Series: "a", 193 Arch: "b", 194 } 195 if test.err != "" { 196 c.Assert(err, gc.ErrorMatches, strings.Replace(test.err, "version", "binary version", 1)) 197 } else { 198 c.Assert(err, gc.IsNil) 199 c.Assert(got, gc.Equals, expect) 200 c.Check(got.IsDev(), gc.Equals, test.dev) 201 } 202 } 203 } 204 205 var marshallers = []struct { 206 name string 207 marshal func(interface{}) ([]byte, error) 208 unmarshal func([]byte, interface{}) error 209 }{{ 210 "json", 211 json.Marshal, 212 json.Unmarshal, 213 }, { 214 "bson", 215 bson.Marshal, 216 bson.Unmarshal, 217 }} 218 219 func (suite) TestBinaryMarshalUnmarshal(c *gc.C) { 220 for _, m := range marshallers { 221 c.Logf("encoding %v", m.name) 222 type doc struct { 223 Version version.Binary 224 } 225 v := doc{version.MustParseBinary("1.2.3-foo-bar")} 226 data, err := m.marshal(v) 227 c.Assert(err, gc.IsNil) 228 var nv doc 229 err = m.unmarshal(data, &nv) 230 c.Assert(err, gc.IsNil) 231 c.Assert(v, gc.Equals, nv) 232 } 233 } 234 235 func (suite) TestNumberMarshalUnmarshal(c *gc.C) { 236 for _, m := range marshallers { 237 c.Logf("encoding %v", m.name) 238 type doc struct { 239 Version version.Number 240 } 241 v := doc{version.MustParse("1.2.3")} 242 data, err := m.marshal(&v) 243 c.Assert(err, gc.IsNil) 244 var nv doc 245 err = m.unmarshal(data, &nv) 246 c.Assert(err, gc.IsNil) 247 c.Assert(v, gc.Equals, nv) 248 } 249 } 250 251 var parseMajorMinorTests = []struct { 252 v string 253 err string 254 expectMajor int 255 expectMinor int 256 }{{ 257 v: "1.2", 258 expectMajor: 1, 259 expectMinor: 2, 260 }, { 261 v: "1", 262 expectMajor: 1, 263 expectMinor: -1, 264 }, { 265 v: "1.2.3", 266 err: "invalid major.minor version number 1.2.3", 267 }, { 268 v: "blah", 269 err: `invalid major version number blah: strconv.ParseInt: parsing "blah": invalid syntax`, 270 }} 271 272 func (suite) TestParseMajorMinor(c *gc.C) { 273 for i, test := range parseMajorMinorTests { 274 c.Logf("test %d", i) 275 major, minor, err := version.ParseMajorMinor(test.v) 276 if test.err != "" { 277 c.Check(err, gc.ErrorMatches, test.err) 278 } else { 279 c.Check(err, gc.IsNil) 280 c.Check(major, gc.Equals, test.expectMajor) 281 c.Check(minor, gc.Equals, test.expectMinor) 282 } 283 } 284 }