55 "testing"
66 "time"
77
8+ "github.com/10gen/migration-verifier/internal/util"
9+ "github.com/10gen/migration-verifier/mslices"
810 "github.com/pkg/errors"
911 "github.com/samber/lo"
1012 "github.com/stretchr/testify/require"
@@ -36,6 +38,12 @@ func TestChangeStreamFilter(t *testing.T) {
3638// terminates that verifier, updates the source cluster, starts a new
3739// verifier with change stream, and confirms that things look as they should.
3840func (suite * IntegrationTestSuite ) TestChangeStreamResumability () {
41+ suite .Require ().NoError (
42+ suite .srcMongoClient .
43+ Database (suite .DBNameForTest ()).
44+ CreateCollection (suite .Context (), "testColl" ),
45+ )
46+
3947 func () {
4048 verifier1 := suite .BuildVerifier ()
4149 ctx , cancel := context .WithCancel (context .Background ())
@@ -44,7 +52,7 @@ func (suite *IntegrationTestSuite) TestChangeStreamResumability() {
4452 suite .Require ().NoError (err )
4553 }()
4654
47- ctx , cancel := context .WithCancel (context . Background ())
55+ ctx , cancel := context .WithCancel (suite . Context ())
4856 defer cancel ()
4957
5058 _ , err := suite .srcMongoClient .
@@ -220,19 +228,26 @@ func (suite *IntegrationTestSuite) TestNoStartAtTime() {
220228}
221229
222230func (suite * IntegrationTestSuite ) TestWithChangeEventsBatching () {
223- verifier := suite .BuildVerifier ()
231+ ctx := suite .Context ()
224232
225- ctx , cancel := context .WithCancel (context .Background ())
226- defer cancel ()
233+ db := suite .srcMongoClient .Database (suite .DBNameForTest ())
234+ coll1 := db .Collection ("testColl1" )
235+ coll2 := db .Collection ("testColl2" )
236+
237+ for _ , coll := range mslices .Of (coll1 , coll2 ) {
238+ suite .Require ().NoError (db .CreateCollection (ctx , coll .Name ()))
239+ }
240+
241+ verifier := suite .BuildVerifier ()
227242
228243 suite .Require ().NoError (verifier .srcChangeStreamReader .StartChangeStream (ctx ))
229244
230- _ , err := suite . srcMongoClient . Database ( "testDb" ). Collection ( "testColl1" ) .InsertOne (ctx , bson.D {{"_id" , 1 }})
245+ _ , err := coll1 .InsertOne (ctx , bson.D {{"_id" , 1 }})
231246 suite .Require ().NoError (err )
232- _ , err = suite . srcMongoClient . Database ( "testDb" ). Collection ( "testColl1" ) .InsertOne (ctx , bson.D {{"_id" , 2 }})
247+ _ , err = coll1 .InsertOne (ctx , bson.D {{"_id" , 2 }})
233248 suite .Require ().NoError (err )
234249
235- _ , err = suite . srcMongoClient . Database ( "testDb" ). Collection ( "testColl2" ) .InsertOne (ctx , bson.D {{"_id" , 1 }})
250+ _ , err = coll2 .InsertOne (ctx , bson.D {{"_id" , 1 }})
236251 suite .Require ().NoError (err )
237252
238253 var rechecks []bson.M
@@ -246,6 +261,7 @@ func (suite *IntegrationTestSuite) TestWithChangeEventsBatching() {
246261 500 * time .Millisecond ,
247262 "the verifier should flush a recheck doc after a batch" ,
248263 )
264+
249265}
250266
251267func (suite * IntegrationTestSuite ) TestManyInsertsBeforeWritesOff () {
@@ -305,3 +321,40 @@ func (suite *IntegrationTestSuite) testInsertsBeforeWritesOff(docsCount int) {
305321
306322 suite .Assert ().Equal (docsCount , totalFailed , "all source docs should be missing" )
307323}
324+
325+ func (suite * IntegrationTestSuite ) TestCreateForbidden () {
326+ ctx := suite .Context ()
327+ buildInfo , err := util .GetBuildInfo (ctx , suite .srcMongoClient )
328+ suite .Require ().NoError (err )
329+
330+ if buildInfo .VersionArray [0 ] < 6 {
331+ suite .T ().Skipf ("This test requires server v6+. (Found: %v)" , buildInfo .VersionArray )
332+ }
333+
334+ verifier := suite .BuildVerifier ()
335+
336+ // start verifier
337+ verifierRunner := RunVerifierCheck (suite .Context (), suite .T (), verifier )
338+
339+ // wait for generation 0 to end
340+ verifierRunner .AwaitGenerationEnd ()
341+
342+ db := suite .srcMongoClient .Database (suite .DBNameForTest ())
343+ coll := db .Collection ("mycoll" )
344+ suite .Require ().NoError (
345+ db .CreateCollection (ctx , coll .Name ()),
346+ )
347+
348+ // The error from the create event will come either at WritesOff
349+ // or when we finalize the change stream.
350+ err = verifier .WritesOff (ctx )
351+ if err == nil {
352+ err = verifierRunner .Await ()
353+ }
354+
355+ suite .Require ().Error (err , "should detect forbidden create event" )
356+
357+ eventErr := UnknownEventError {}
358+ suite .Require ().ErrorAs (err , & eventErr )
359+ suite .Assert ().Equal ("create" , eventErr .Event .OpType )
360+ }
0 commit comments