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  }