github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/version/osversion_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package version_test 5 6 import ( 7 "fmt" 8 "io/ioutil" 9 "path/filepath" 10 11 gc "launchpad.net/gocheck" 12 13 "github.com/juju/juju/testing" 14 "github.com/juju/juju/version" 15 ) 16 17 type readSeriesSuite struct { 18 testing.BaseSuite 19 } 20 21 var _ = gc.Suite(&readSeriesSuite{}) 22 23 type kernelVersionSuite struct { 24 testing.BaseSuite 25 } 26 27 var _ = gc.Suite(&kernelVersionSuite{}) 28 29 var readSeriesTests = []struct { 30 contents string 31 series string 32 }{{ 33 `DISTRIB_ID=Ubuntu 34 DISTRIB_RELEASE=12.04 35 DISTRIB_CODENAME=precise 36 DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"`, 37 "precise", 38 }, { 39 "DISTRIB_CODENAME= \tprecise\t", 40 "precise", 41 }, { 42 `DISTRIB_CODENAME="precise"`, 43 "precise", 44 }, { 45 "DISTRIB_CODENAME='precise'", 46 "precise", 47 }, { 48 `DISTRIB_ID=Ubuntu 49 DISTRIB_RELEASE=12.10 50 DISTRIB_CODENAME=quantal 51 DISTRIB_DESCRIPTION="Ubuntu 12.10"`, 52 "quantal", 53 }, { 54 "", 55 "unknown", 56 }, 57 } 58 59 func (*readSeriesSuite) TestReadSeries(c *gc.C) { 60 d := c.MkDir() 61 f := filepath.Join(d, "foo") 62 for i, t := range readSeriesTests { 63 c.Logf("test %d", i) 64 err := ioutil.WriteFile(f, []byte(t.contents), 0666) 65 c.Assert(err, gc.IsNil) 66 c.Assert(version.ReadSeries(f), gc.Equals, t.series) 67 } 68 } 69 70 func sysctlMacOS10dot9dot2() (string, error) { 71 // My 10.9.2 Mac gives "13.1.0" as the kernel version 72 return "13.1.0", nil 73 } 74 75 func sysctlError() (string, error) { 76 return "", fmt.Errorf("no such syscall") 77 } 78 79 func (*kernelVersionSuite) TestKernelToMajorVersion(c *gc.C) { 80 majorVersion, err := version.KernelToMajor(sysctlMacOS10dot9dot2) 81 c.Assert(err, gc.IsNil) 82 c.Check(majorVersion, gc.Equals, 13) 83 } 84 85 func (*kernelVersionSuite) TestKernelToMajorVersionError(c *gc.C) { 86 majorVersion, err := version.KernelToMajor(sysctlError) 87 c.Assert(err, gc.ErrorMatches, "no such syscall") 88 c.Check(majorVersion, gc.Equals, 0) 89 } 90 91 func (*kernelVersionSuite) TestKernelToMajorVersionNoDots(c *gc.C) { 92 majorVersion, err := version.KernelToMajor(func() (string, error) { 93 return "1234", nil 94 }) 95 c.Assert(err, gc.IsNil) 96 c.Check(majorVersion, gc.Equals, 1234) 97 } 98 99 func (*kernelVersionSuite) TestKernelToMajorVersionNotInt(c *gc.C) { 100 majorVersion, err := version.KernelToMajor(func() (string, error) { 101 return "a.b.c", nil 102 }) 103 c.Assert(err, gc.ErrorMatches, `strconv.ParseInt: parsing "a": invalid syntax`) 104 c.Check(majorVersion, gc.Equals, 0) 105 } 106 107 func (*kernelVersionSuite) TestKernelToMajorVersionEmpty(c *gc.C) { 108 majorVersion, err := version.KernelToMajor(func() (string, error) { 109 return "", nil 110 }) 111 c.Assert(err, gc.ErrorMatches, `strconv.ParseInt: parsing "": invalid syntax`) 112 c.Check(majorVersion, gc.Equals, 0) 113 } 114 115 func (*kernelVersionSuite) TestMacOSXSeriesFromKernelVersion(c *gc.C) { 116 c.Check(version.MacOSXSeriesFromKernelVersion(sysctlMacOS10dot9dot2), gc.Equals, "mavericks") 117 } 118 119 func (*kernelVersionSuite) TestMacOSXSeriesFromKernelVersionError(c *gc.C) { 120 // We suppress the actual error in favor of returning "unknown", but we 121 // do log the error 122 c.Check(version.MacOSXSeriesFromKernelVersion(sysctlError), gc.Equals, "unknown") 123 c.Check(c.GetTestLog(), gc.Matches, ".* juju.version unable to determine OS version: no such syscall\n") 124 } 125 126 func (*kernelVersionSuite) TestMacOSXSeries(c *gc.C) { 127 tests := []struct { 128 version int 129 series string 130 }{ 131 {13, "mavericks"}, 132 {12, "mountainlion"}, 133 {14, "unknown"}, 134 {4, "unknown"}, 135 {0, "unknown"}, 136 } 137 for _, test := range tests { 138 series := version.MacOSXSeriesFromMajorVersion(test.version) 139 c.Check(series, gc.Equals, test.series) 140 } 141 }