github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/testing" 15 "github.com/juju/juju/version" 16 ) 17 18 type readSeriesSuite struct { 19 testing.BaseSuite 20 } 21 22 var _ = gc.Suite(&readSeriesSuite{}) 23 24 type kernelVersionSuite struct { 25 testing.BaseSuite 26 } 27 28 var _ = gc.Suite(&kernelVersionSuite{}) 29 30 var readSeriesTests = []struct { 31 contents string 32 series string 33 err string 34 }{{ 35 `NAME="Ubuntu" 36 VERSION="12.04.5 LTS, Precise Pangolin" 37 ID=ubuntu 38 ID_LIKE=debian 39 PRETTY_NAME="Ubuntu precise (12.04.5 LTS)" 40 VERSION_ID="12.04" 41 `, 42 "precise", 43 "", 44 }, { 45 `NAME="Ubuntu" 46 ID=ubuntu 47 VERSION_ID= "12.04" `, 48 "precise", 49 "", 50 }, { 51 `NAME='Ubuntu' 52 ID='ubuntu' 53 VERSION_ID='12.04' 54 `, 55 "precise", 56 "", 57 }, { 58 `NAME="CentOS Linux" 59 ID="centos" 60 VERSION_ID="7" 61 `, 62 "centos7", 63 "", 64 }, { 65 `NAME="Arch Linux" 66 ID=arch 67 PRETTY_NAME="Arch Linux" 68 ANSI_COLOR="0;36" 69 HOME_URL="https://www.archlinux.org/" 70 SUPPORT_URL="https://bbs.archlinux.org/" 71 BUG_REPORT_URL="https://bugs.archlinux.org/" 72 `, 73 "arch", 74 "", 75 }, { 76 `NAME="Ubuntu" 77 VERSION="14.04.1 LTS, Trusty Tahr" 78 ID=ubuntu 79 ID_LIKE=debian 80 PRETTY_NAME="Ubuntu 14.04.1 LTS" 81 VERSION_ID="14.04" 82 HOME_URL="http://www.ubuntu.com/" 83 SUPPORT_URL="http://help.ubuntu.com/" 84 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" 85 `, 86 "trusty", 87 "", 88 }, { 89 "", 90 "unknown", 91 "OS release file is missing ID", 92 }, { 93 `NAME="CentOS Linux" 94 ID="centos" 95 `, 96 "unknown", 97 "OS release file is missing VERSION_ID", 98 }, { 99 `NAME="SuSE Linux" 100 ID="SuSE" 101 VERSION_ID="12" 102 `, 103 "unknown", 104 "", 105 }, 106 } 107 108 func (s *readSeriesSuite) TestReadSeries(c *gc.C) { 109 d := c.MkDir() 110 f := filepath.Join(d, "foo") 111 s.PatchValue(version.OSReleaseFile, f) 112 for i, t := range readSeriesTests { 113 c.Logf("test %d", i) 114 err := ioutil.WriteFile(f, []byte(t.contents), 0666) 115 c.Assert(err, jc.ErrorIsNil) 116 series, err := version.ReadSeries() 117 if t.err == "" { 118 c.Assert(err, jc.ErrorIsNil) 119 } else { 120 c.Assert(err, gc.ErrorMatches, t.err) 121 } 122 123 c.Assert(series, gc.Equals, t.series) 124 } 125 } 126 127 func sysctlMacOS10dot9dot2() (string, error) { 128 // My 10.9.2 Mac gives "13.1.0" as the kernel version 129 return "13.1.0", nil 130 } 131 132 func sysctlError() (string, error) { 133 return "", fmt.Errorf("no such syscall") 134 } 135 136 func (*kernelVersionSuite) TestKernelToMajorVersion(c *gc.C) { 137 majorVersion, err := version.KernelToMajor(sysctlMacOS10dot9dot2) 138 c.Assert(err, jc.ErrorIsNil) 139 c.Check(majorVersion, gc.Equals, 13) 140 } 141 142 func (*kernelVersionSuite) TestKernelToMajorVersionError(c *gc.C) { 143 majorVersion, err := version.KernelToMajor(sysctlError) 144 c.Assert(err, gc.ErrorMatches, "no such syscall") 145 c.Check(majorVersion, gc.Equals, 0) 146 } 147 148 func (*kernelVersionSuite) TestKernelToMajorVersionNoDots(c *gc.C) { 149 majorVersion, err := version.KernelToMajor(func() (string, error) { 150 return "1234", nil 151 }) 152 c.Assert(err, jc.ErrorIsNil) 153 c.Check(majorVersion, gc.Equals, 1234) 154 } 155 156 func (*kernelVersionSuite) TestKernelToMajorVersionNotInt(c *gc.C) { 157 majorVersion, err := version.KernelToMajor(func() (string, error) { 158 return "a.b.c", nil 159 }) 160 c.Assert(err, gc.ErrorMatches, `strconv.ParseInt: parsing "a": invalid syntax`) 161 c.Check(majorVersion, gc.Equals, 0) 162 } 163 164 func (*kernelVersionSuite) TestKernelToMajorVersionEmpty(c *gc.C) { 165 majorVersion, err := version.KernelToMajor(func() (string, error) { 166 return "", nil 167 }) 168 c.Assert(err, gc.ErrorMatches, `strconv.ParseInt: parsing "": invalid syntax`) 169 c.Check(majorVersion, gc.Equals, 0) 170 } 171 172 func (*kernelVersionSuite) TestMacOSXSeriesFromKernelVersion(c *gc.C) { 173 series, err := version.MacOSXSeriesFromKernelVersion(sysctlMacOS10dot9dot2) 174 c.Assert(err, jc.ErrorIsNil) 175 c.Check(series, gc.Equals, "mavericks") 176 } 177 178 func (*kernelVersionSuite) TestMacOSXSeriesFromKernelVersionError(c *gc.C) { 179 // We suppress the actual error in favor of returning "unknown", but we 180 // do log the error 181 series, err := version.MacOSXSeriesFromKernelVersion(sysctlError) 182 c.Assert(err, gc.ErrorMatches, "no such syscall") 183 c.Assert(series, gc.Equals, "unknown") 184 c.Check(c.GetTestLog(), gc.Matches, ".* juju.version unable to determine OS version: no such syscall\n") 185 } 186 187 func (*kernelVersionSuite) TestMacOSXSeries(c *gc.C) { 188 tests := []struct { 189 version int 190 series string 191 err string 192 }{ 193 {version: 13, series: "mavericks"}, 194 {version: 12, series: "mountainlion"}, 195 {version: 14, series: "yosemite"}, 196 {version: 15, series: "elcapitan"}, 197 {version: 16, series: "unknown", err: `unknown series ""`}, 198 {version: 4, series: "unknown", err: `unknown series ""`}, 199 {version: 0, series: "unknown", err: `unknown series ""`}, 200 } 201 for _, test := range tests { 202 series, err := version.MacOSXSeriesFromMajorVersion(test.version) 203 if test.err != "" { 204 c.Assert(err, gc.ErrorMatches, test.err) 205 } else { 206 c.Assert(err, jc.ErrorIsNil) 207 } 208 c.Check(series, gc.Equals, test.series) 209 } 210 }