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  }