diff options
Diffstat (limited to 'src/mongo/gotools/mongooplog/mongooplog_test.go')
-rw-r--r-- | src/mongo/gotools/mongooplog/mongooplog_test.go | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/mongo/gotools/mongooplog/mongooplog_test.go b/src/mongo/gotools/mongooplog/mongooplog_test.go new file mode 100644 index 00000000000..de825b2117f --- /dev/null +++ b/src/mongo/gotools/mongooplog/mongooplog_test.go @@ -0,0 +1,135 @@ +package mongooplog + +import ( + "github.com/mongodb/mongo-tools/common/db" + "github.com/mongodb/mongo-tools/common/options" + "github.com/mongodb/mongo-tools/common/testutil" + . "github.com/smartystreets/goconvey/convey" + "gopkg.in/mgo.v2" + "gopkg.in/mgo.v2/bson" + "testing" +) + +func TestBasicOps(t *testing.T) { + testutil.VerifyTestType(t, testutil.IntegrationTestType) + + var opts *options.ToolOptions + var sourceOpts *SourceOptions + + Convey("When replicating operations", t, func() { + ssl := testutil.GetSSLOptions() + auth := testutil.GetAuthOptions() + + // specify localhost:33333 as the destination host + opts = &options.ToolOptions{ + Namespace: &options.Namespace{}, + SSL: &ssl, + Auth: &auth, + Kerberos: &options.Kerberos{}, + Connection: &options.Connection{ + Host: "localhost", + Port: db.DefaultTestPort, + }, + } + + // specify localhost:33333 as the source host + sourceOpts = &SourceOptions{ + Seconds: 84600, // the default + OplogNS: "local.oplog.rs", // the default + } + + Convey("all operations should be applied correctly, without"+ + " error", func() { + + // set the "oplog" we will use + sourceOpts.OplogNS = "mongooplog_test.oplog" + + // initialize a session provider for the source + sourceSP, err := db.NewSessionProvider(*opts) + So(err, ShouldBeNil) + + // initialize a session provider for the destination + destSP, err := db.NewSessionProvider(*opts) + So(err, ShouldBeNil) + + // clear out the oplog + sess, err := sourceSP.GetSession() + So(err, ShouldBeNil) + defer sess.Close() + oplogColl := sess.DB("mongooplog_test").C("oplog") + oplogColl.DropCollection() + + // create the oplog as a capped collection, so it can be tailed + So(sess.DB("mongooplog_test").Run( + bson.D{{"create", "oplog"}, {"capped", true}, + {"size", 10000}}, + bson.M{}), + ShouldBeNil) + + // create the collection we are testing against (ignore errors) + sess.DB("mongooplog_test").C("data").Create(&mgo.CollectionInfo{}) + + // clear out the collection we'll use for testing + testColl := sess.DB("mongooplog_test").C("data") + _, err = testColl.RemoveAll(bson.M{}) + So(err, ShouldBeNil) + + // insert some "ops" into the oplog to be found and applied + obj1 := bson.D{{"_id", 3}} + op1 := &db.Oplog{ + Timestamp: bson.MongoTimestamp(1<<63 - 1), // years in the future + HistoryID: 100, + Version: 2, + Operation: "i", + Namespace: "mongooplog_test.data", + Object: obj1, + } + So(oplogColl.Insert(op1), ShouldBeNil) + obj2 := bson.D{{"_id", 4}} + op2 := &db.Oplog{ + Timestamp: bson.MongoTimestamp(1<<63 - 1), // years in the future + HistoryID: 200, + Version: 2, + Operation: "i", + Namespace: "mongooplog_test.data", + Object: obj2, + } + So(oplogColl.Insert(op2), ShouldBeNil) + + // this one should be filtered out, since it occurred before the + // threshold + obj3 := bson.D{{"_id", 3}} + op3 := &db.Oplog{ + Timestamp: bson.MongoTimestamp(1<<62 - 1), // more than 1 day in the past + HistoryID: 300, + Version: 2, + Operation: "i", + Namespace: "mongooplog_test.data", + Object: obj3, + } + So(oplogColl.Insert(op3), ShouldBeNil) + + // initialize the mongooplog + oplog := MongoOplog{ + ToolOptions: opts, + SourceOptions: sourceOpts, + SessionProviderFrom: sourceSP, + SessionProviderTo: destSP, + } + + // run it + So(oplog.Run(), ShouldBeNil) + + // the operations should have been applied + var inserted []bson.M + So(testColl.Find(bson.M{}).Sort("_id").All(&inserted), + ShouldBeNil) + So(len(inserted), ShouldEqual, 2) + So(inserted[0]["_id"], ShouldEqual, 3) + So(inserted[1]["_id"], ShouldEqual, 4) + + }) + + }) + +} |