github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/mongo/internal_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // +build !windows
     5  
     6  package mongo
     7  
     8  import (
     9  	"errors"
    10  	"os"
    11  	"time"
    12  
    13  	coretesting "github.com/juju/juju/testing"
    14  
    15  	jc "github.com/juju/testing/checkers"
    16  	gc "gopkg.in/check.v1"
    17  )
    18  
    19  type MongoVersionSuite struct {
    20  	coretesting.BaseSuite
    21  }
    22  
    23  type MongoPathSuite struct {
    24  	coretesting.BaseSuite
    25  }
    26  
    27  var _ = gc.Suite(&MongoVersionSuite{})
    28  var _ = gc.Suite(&MongoPathSuite{})
    29  
    30  var (
    31  	version1   = Version{Major: 1, Minor: 0}
    32  	version1d1 = Version{Major: 1, Minor: 1}
    33  	version2   = Version{Major: 2, Minor: 0}
    34  )
    35  
    36  func (m *MongoVersionSuite) TestVersionNewerCompareMinors(c *gc.C) {
    37  	res := version1.NewerThan(version1d1)
    38  	c.Assert(res, gc.Equals, -1)
    39  	res = version1d1.NewerThan(version1)
    40  	c.Assert(res, gc.Equals, 1)
    41  	res = version1.NewerThan(version1)
    42  	c.Assert(res, gc.Equals, 0)
    43  }
    44  
    45  func (m *MongoVersionSuite) TestVersionNewerCompareMayors(c *gc.C) {
    46  	res := version1.NewerThan(version2)
    47  	c.Assert(res, gc.Equals, -1)
    48  	res = version2.NewerThan(version1)
    49  	c.Assert(res, gc.Equals, 1)
    50  	res = version2.NewerThan(version1d1)
    51  	c.Assert(res, gc.Equals, 1)
    52  }
    53  
    54  func (m *MongoVersionSuite) TestVersionNewerCompareSpecial(c *gc.C) {
    55  	res := MongoUpgrade.NewerThan(version2)
    56  	c.Assert(res, gc.Equals, 0)
    57  	res = version2.NewerThan(MongoUpgrade)
    58  	c.Assert(res, gc.Equals, 0)
    59  }
    60  
    61  func (m *MongoVersionSuite) TestString(c *gc.C) {
    62  	s := version1.String()
    63  	c.Assert(s, gc.Equals, "1.0")
    64  	s = version1d1.String()
    65  	c.Assert(s, gc.Equals, "1.1")
    66  	v := Version{Major: 1, Minor: 2, Patch: "something"}
    67  	s = v.String()
    68  	c.Assert(s, gc.Equals, "1.2.something")
    69  	v.StorageEngine = WiredTiger
    70  	s = v.String()
    71  	c.Assert(s, gc.Equals, "1.2.something/wiredTiger")
    72  }
    73  
    74  func (m *MongoPathSuite) TestMongodPath(c *gc.C) {
    75  	pathTests := map[Version]string{
    76  		Mongo26:   "/usr/lib/juju/mongo2.6/bin/mongod",
    77  		Mongo32wt: "/usr/lib/juju/mongo3.2/bin/mongod",
    78  	}
    79  	for v, exp := range pathTests {
    80  		p := JujuMongodPath(v)
    81  		c.Assert(p, gc.Equals, exp)
    82  	}
    83  }
    84  
    85  type fakeFileInfo struct {
    86  	isDir bool
    87  }
    88  
    89  func (f fakeFileInfo) Name() string       { return "" }
    90  func (f fakeFileInfo) Size() int64        { return 0 }
    91  func (f fakeFileInfo) Mode() os.FileMode  { return 0 }
    92  func (f fakeFileInfo) ModTime() time.Time { return time.Now() }
    93  func (f fakeFileInfo) IsDir() bool        { return f.isDir }
    94  func (f fakeFileInfo) Sys() interface{}   { return nil }
    95  
    96  func assertStat(c *gc.C, v Version, result bool, stat error, called string) {
    97  	var statArg string
    98  	statFunc := func(p string) (os.FileInfo, error) {
    99  		statArg = p
   100  		return fakeFileInfo{}, stat
   101  	}
   102  
   103  	b := binariesAvailable(v, statFunc)
   104  	c.Assert(b, gc.Equals, result)
   105  	c.Assert(statArg, gc.Equals, called)
   106  }
   107  
   108  func (m *MongoPathSuite) TestBinaries(c *gc.C) {
   109  	errMissing := errors.New("missing")
   110  
   111  	assertStat(c, Mongo24, true, nil, JujuMongod24Path)
   112  
   113  	assertStat(c, Mongo24, false, errMissing, JujuMongod24Path)
   114  
   115  	assertStat(c, Mongo32wt, true, nil, "/usr/lib/juju/mongo3.2/bin/mongod")
   116  
   117  	assertStat(c, Mongo32wt, false, errMissing, "/usr/lib/juju/mongo3.2/bin/mongod")
   118  
   119  	assertStat(c, Version{Major: 4, Minor: 3}, true, nil, "/usr/lib/juju/mongo4.3/bin/mongod")
   120  }
   121  
   122  func assertStatLook(c *gc.C, v Version, statErr, lookErr error, errReg, path, statCall, lookCall string) {
   123  	var statCalled string
   124  	stat := func(p string) (os.FileInfo, error) {
   125  		statCalled = p
   126  		return fakeFileInfo{}, statErr
   127  	}
   128  	var lookCalled string
   129  	look := func(p string) (string, error) {
   130  		lookCalled = p
   131  		if lookErr != nil {
   132  			return "", lookErr
   133  		}
   134  		return "/a/false/path", nil
   135  	}
   136  	p, err := mongoPath(v, stat, look)
   137  	if errReg == "" {
   138  		c.Assert(err, jc.ErrorIsNil)
   139  	} else {
   140  		c.Assert(err, gc.ErrorMatches, errReg)
   141  	}
   142  
   143  	c.Assert(p, gc.Equals, path)
   144  	c.Assert(statCalled, gc.Equals, statCall)
   145  	c.Assert(lookCalled, gc.Equals, lookCall)
   146  }
   147  
   148  func (m *MongoPathSuite) TestPath(c *gc.C) {
   149  	errMissing := errors.New("missing")
   150  	errLookupFailed := errors.New("failed lookup")
   151  	assertStatLook(c, Mongo24, nil, nil, "", JujuMongod24Path, JujuMongod24Path, "")
   152  
   153  	assertStatLook(c, Mongo24, errMissing, nil, "", "/a/false/path", JujuMongod24Path, "mongod")
   154  
   155  	assertStatLook(c, Mongo24, errMissing, errLookupFailed, "*failed lookup", "", JujuMongod24Path, "mongod")
   156  
   157  	mongo32Path := "/usr/lib/juju/mongo3.2/bin/mongod"
   158  	assertStatLook(c, Mongo32wt, nil, nil, "", mongo32Path, mongo32Path, "")
   159  
   160  	assertStatLook(c, Mongo32wt, errMissing, nil, "no suitable binary for \"3.2/wiredTiger\"", "", mongo32Path, "")
   161  }