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