github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/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="Ubuntu" 66 VERSION="14.04.1 LTS, Trusty Tahr" 67 ID=ubuntu 68 ID_LIKE=debian 69 PRETTY_NAME="Ubuntu 14.04.1 LTS" 70 VERSION_ID="14.04" 71 HOME_URL="http://www.ubuntu.com/" 72 SUPPORT_URL="http://help.ubuntu.com/" 73 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" 74 `, 75 "trusty", 76 "", 77 }, { 78 "", 79 "unknown", 80 "OS release file is missing ID", 81 }, { 82 `NAME="CentOS Linux" 83 ID="centos" 84 `, 85 "unknown", 86 "OS release file is missing VERSION_ID", 87 }, { 88 `NAME="SuSE Linux" 89 ID="SuSE" 90 VERSION_ID="12" 91 `, 92 "unknown", 93 "", 94 }, 95 } 96 97 func (s *readSeriesSuite) TestReadSeries(c *gc.C) { 98 d := c.MkDir() 99 f := filepath.Join(d, "foo") 100 s.PatchValue(version.OSReleaseFile, f) 101 for i, t := range readSeriesTests { 102 c.Logf("test %d", i) 103 err := ioutil.WriteFile(f, []byte(t.contents), 0666) 104 c.Assert(err, jc.ErrorIsNil) 105 series, err := version.ReadSeries() 106 if t.err == "" { 107 c.Assert(err, jc.ErrorIsNil) 108 } else { 109 c.Assert(err, gc.ErrorMatches, t.err) 110 } 111 112 c.Assert(series, gc.Equals, t.series) 113 } 114 } 115 116 func sysctlMacOS10dot9dot2() (string, error) { 117 // My 10.9.2 Mac gives "13.1.0" as the kernel version 118 return "13.1.0", nil 119 } 120 121 func sysctlError() (string, error) { 122 return "", fmt.Errorf("no such syscall") 123 } 124 125 func (*kernelVersionSuite) TestKernelToMajorVersion(c *gc.C) { 126 majorVersion, err := version.KernelToMajor(sysctlMacOS10dot9dot2) 127 c.Assert(err, jc.ErrorIsNil) 128 c.Check(majorVersion, gc.Equals, 13) 129 } 130 131 func (*kernelVersionSuite) TestKernelToMajorVersionError(c *gc.C) { 132 majorVersion, err := version.KernelToMajor(sysctlError) 133 c.Assert(err, gc.ErrorMatches, "no such syscall") 134 c.Check(majorVersion, gc.Equals, 0) 135 } 136 137 func (*kernelVersionSuite) TestKernelToMajorVersionNoDots(c *gc.C) { 138 majorVersion, err := version.KernelToMajor(func() (string, error) { 139 return "1234", nil 140 }) 141 c.Assert(err, jc.ErrorIsNil) 142 c.Check(majorVersion, gc.Equals, 1234) 143 } 144 145 func (*kernelVersionSuite) TestKernelToMajorVersionNotInt(c *gc.C) { 146 majorVersion, err := version.KernelToMajor(func() (string, error) { 147 return "a.b.c", nil 148 }) 149 c.Assert(err, gc.ErrorMatches, `strconv.ParseInt: parsing "a": invalid syntax`) 150 c.Check(majorVersion, gc.Equals, 0) 151 } 152 153 func (*kernelVersionSuite) TestKernelToMajorVersionEmpty(c *gc.C) { 154 majorVersion, err := version.KernelToMajor(func() (string, error) { 155 return "", nil 156 }) 157 c.Assert(err, gc.ErrorMatches, `strconv.ParseInt: parsing "": invalid syntax`) 158 c.Check(majorVersion, gc.Equals, 0) 159 } 160 161 func (*kernelVersionSuite) TestMacOSXSeriesFromKernelVersion(c *gc.C) { 162 series, err := version.MacOSXSeriesFromKernelVersion(sysctlMacOS10dot9dot2) 163 c.Assert(err, jc.ErrorIsNil) 164 c.Check(series, gc.Equals, "mavericks") 165 } 166 167 func (*kernelVersionSuite) TestMacOSXSeriesFromKernelVersionError(c *gc.C) { 168 // We suppress the actual error in favor of returning "unknown", but we 169 // do log the error 170 series, err := version.MacOSXSeriesFromKernelVersion(sysctlError) 171 c.Assert(err, gc.ErrorMatches, "no such syscall") 172 c.Assert(series, gc.Equals, "unknown") 173 c.Check(c.GetTestLog(), gc.Matches, ".* juju.version unable to determine OS version: no such syscall\n") 174 } 175 176 func (*kernelVersionSuite) TestMacOSXSeries(c *gc.C) { 177 tests := []struct { 178 version int 179 series string 180 err string 181 }{ 182 {version: 13, series: "mavericks"}, 183 {version: 12, series: "mountainlion"}, 184 {version: 14, series: "yosemite"}, 185 {version: 15, series: "unknown", err: `unknown series ""`}, 186 {version: 4, series: "unknown", err: `unknown series ""`}, 187 {version: 0, series: "unknown", err: `unknown series ""`}, 188 } 189 for _, test := range tests { 190 series, err := version.MacOSXSeriesFromMajorVersion(test.version) 191 if test.err != "" { 192 c.Assert(err, gc.ErrorMatches, test.err) 193 } else { 194 c.Assert(err, jc.ErrorIsNil) 195 } 196 c.Check(series, gc.Equals, test.series) 197 } 198 }