Permalink
Switch branches/tags
Find file
Fetching contributors…
Cannot retrieve contributors at this time
162 lines (130 sloc) 4.37 KB
// Copyright 2014 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
// +build !windows
package mongo
import (
"errors"
"os"
"time"
jc "github.com/juju/testing/checkers"
gc "gopkg.in/check.v1"
coretesting "github.com/juju/juju/testing"
)
type MongoVersionSuite struct {
coretesting.BaseSuite
}
type MongoPathSuite struct {
coretesting.BaseSuite
}
var _ = gc.Suite(&MongoVersionSuite{})
var _ = gc.Suite(&MongoPathSuite{})
var (
version1 = Version{Major: 1, Minor: 0}
version1d1 = Version{Major: 1, Minor: 1}
version2 = Version{Major: 2, Minor: 0}
)
func (m *MongoVersionSuite) TestVersionNewerCompareMinors(c *gc.C) {
res := version1.NewerThan(version1d1)
c.Assert(res, gc.Equals, -1)
res = version1d1.NewerThan(version1)
c.Assert(res, gc.Equals, 1)
res = version1.NewerThan(version1)
c.Assert(res, gc.Equals, 0)
}
func (m *MongoVersionSuite) TestVersionNewerCompareMayors(c *gc.C) {
res := version1.NewerThan(version2)
c.Assert(res, gc.Equals, -1)
res = version2.NewerThan(version1)
c.Assert(res, gc.Equals, 1)
res = version2.NewerThan(version1d1)
c.Assert(res, gc.Equals, 1)
}
func (m *MongoVersionSuite) TestVersionNewerCompareSpecial(c *gc.C) {
res := MongoUpgrade.NewerThan(version2)
c.Assert(res, gc.Equals, 0)
res = version2.NewerThan(MongoUpgrade)
c.Assert(res, gc.Equals, 0)
}
func (m *MongoVersionSuite) TestString(c *gc.C) {
s := version1.String()
c.Assert(s, gc.Equals, "1.0")
s = version1d1.String()
c.Assert(s, gc.Equals, "1.1")
v := Version{Major: 1, Minor: 2, Patch: "something"}
s = v.String()
c.Assert(s, gc.Equals, "1.2.something")
v.StorageEngine = WiredTiger
s = v.String()
c.Assert(s, gc.Equals, "1.2.something/wiredTiger")
}
func (m *MongoPathSuite) TestMongodPath(c *gc.C) {
pathTests := map[Version]string{
Mongo26: "/usr/lib/juju/mongo2.6/bin/mongod",
Mongo32wt: "/usr/lib/juju/mongo3.2/bin/mongod",
}
for v, exp := range pathTests {
p := JujuMongodPath(v)
c.Assert(p, gc.Equals, exp)
}
}
type fakeFileInfo struct {
isDir bool
}
func (f fakeFileInfo) Name() string { return "" }
func (f fakeFileInfo) Size() int64 { return 0 }
func (f fakeFileInfo) Mode() os.FileMode { return 0 }
func (f fakeFileInfo) ModTime() time.Time { return time.Now() }
func (f fakeFileInfo) IsDir() bool { return f.isDir }
func (f fakeFileInfo) Sys() interface{} { return nil }
func assertStat(c *gc.C, v Version, result bool, stat error, called string) {
var statArg string
statFunc := func(p string) (os.FileInfo, error) {
statArg = p
return fakeFileInfo{}, stat
}
b := binariesAvailable(v, statFunc)
c.Assert(b, gc.Equals, result)
c.Assert(statArg, gc.Equals, called)
}
func (m *MongoPathSuite) TestBinaries(c *gc.C) {
errMissing := errors.New("missing")
assertStat(c, Mongo24, true, nil, JujuMongod24Path)
assertStat(c, Mongo24, false, errMissing, JujuMongod24Path)
assertStat(c, Mongo32wt, true, nil, "/usr/lib/juju/mongo3.2/bin/mongod")
assertStat(c, Mongo32wt, false, errMissing, "/usr/lib/juju/mongo3.2/bin/mongod")
assertStat(c, Version{Major: 4, Minor: 3}, true, nil, "/usr/lib/juju/mongo4.3/bin/mongod")
}
func assertStatLook(c *gc.C, v Version, statErr, lookErr error, errReg, path, statCall, lookCall string) {
var statCalled string
stat := func(p string) (os.FileInfo, error) {
statCalled = p
return fakeFileInfo{}, statErr
}
var lookCalled string
look := func(p string) (string, error) {
lookCalled = p
if lookErr != nil {
return "", lookErr
}
return "/a/false/path", nil
}
p, err := mongoPath(v, stat, look)
if errReg == "" {
c.Assert(err, jc.ErrorIsNil)
} else {
c.Assert(err, gc.ErrorMatches, errReg)
}
c.Assert(p, gc.Equals, path)
c.Assert(statCalled, gc.Equals, statCall)
c.Assert(lookCalled, gc.Equals, lookCall)
}
func (m *MongoPathSuite) TestPath(c *gc.C) {
errMissing := errors.New("missing")
errLookupFailed := errors.New("failed lookup")
assertStatLook(c, Mongo24, nil, nil, "", JujuMongod24Path, JujuMongod24Path, "")
assertStatLook(c, Mongo24, errMissing, nil, "", "/a/false/path", JujuMongod24Path, "mongod")
assertStatLook(c, Mongo24, errMissing, errLookupFailed, "*failed lookup", "", JujuMongod24Path, "mongod")
mongo32Path := "/usr/lib/juju/mongo3.2/bin/mongod"
assertStatLook(c, Mongo32wt, nil, nil, "", mongo32Path, mongo32Path, "")
assertStatLook(c, Mongo32wt, errMissing, nil, "no suitable binary for \"3.2/wiredTiger\"", "", mongo32Path, "")
}