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 }