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  }