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  }