@@ -34,6 +34,8 @@ import com.mongodb.client.model.changestream.UpdateDescription
34
34
import com.mongodb.client.test.CollectionHelper
35
35
import com.mongodb.connection.AsyncConnection
36
36
import com.mongodb.connection.Connection
37
+ import com.mongodb.connection.ConnectionDescription
38
+ import com.mongodb.connection.ServerVersion
37
39
import com.mongodb.session.SessionContext
38
40
import org.bson.BsonArray
39
41
import org.bson.BsonBoolean
@@ -452,46 +454,78 @@ class ChangeStreamOperationSpecification extends OperationFunctionalSpecificatio
452
454
453
455
def ' should set the startAtOperationTime on the sync cursor' () {
454
456
given :
457
+ def changeStream
455
458
def binding = Stub (ReadBinding ) {
456
459
getSessionContext() >> Stub (SessionContext ) {
457
460
getReadConcern() >> ReadConcern . DEFAULT
458
- getOperationTime() >> new BsonTimestamp (42 , 1 )
461
+ getOperationTime() >> new BsonTimestamp ()
459
462
}
460
463
getReadConnectionSource() >> Stub (ConnectionSource ) {
461
464
getConnection() >> Stub (Connection ) {
462
- command(* _) >> new BsonDocument (' cursor' , new BsonDocument (' id' , new BsonInt64 (1 ))
463
- .append(' ns' , new BsonString (getNamespace(). getFullName()))
464
- .append(' firstBatch' , new BsonArrayWrapper ([])))
465
+ command(* _) >> {
466
+ changeStream = getChangeStream(it[1 ])
467
+ new BsonDocument (' cursor' , new BsonDocument (' id' , new BsonInt64 (1 ))
468
+ .append(' ns' , new BsonString (getNamespace(). getFullName()))
469
+ .append(' firstBatch' , new BsonArrayWrapper ([])))
470
+ }
471
+ getDescription() >> Stub (ConnectionDescription ) {
472
+ getServerVersion() >> new ServerVersion ([4 , 0 , 0 ])
473
+ }
465
474
}
466
475
}
467
476
}
468
477
469
478
when : ' Resume token'
470
- def operation = new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
479
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
471
480
.resumeAfter(new BsonDocument ())
472
- operation . execute(binding)
481
+ .execute(binding)
473
482
474
483
then :
475
- operation. getStartAtOperationTime() == null
484
+ changeStream. containsKey(' resumeAfter' )
485
+ ! changeStream. containsKey(' startAtOperationTime' )
476
486
477
- when : ' No token or time'
478
- operation = new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
479
- operation. execute(binding)
487
+ when : ' Set startAtOperationTime'
488
+ def startAtTime = new BsonTimestamp (42 )
489
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
490
+ .startAtOperationTime(startAtTime)
491
+ .execute(binding)
480
492
481
493
then :
482
- operation . getStartAtOperationTime( ) == new BsonTimestamp ( 42 , 1 )
494
+ changeStream . getTimestamp( ' startAtOperationTime ' ) == startAtTime
483
495
484
- when : ' Set time'
485
- def startAtTime = new BsonTimestamp (42 )
486
- operation = operation. startAtOperationTime(startAtTime)
487
- operation. execute(binding)
496
+ when : ' set startAtOperationTimeForResume'
497
+ def resumeStartAt = new BsonTimestamp (42 , 42 )
498
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
499
+ .startOperationTimeForResume(resumeStartAt)
500
+ .execute(binding)
501
+
502
+ then :
503
+ changeStream. getTimestamp(' startAtOperationTime' ) == resumeStartAt
504
+
505
+ when : ' set startAtOperationTime && startAtOperationTimeForResume'
506
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
507
+ .startAtOperationTime(startAtTime)
508
+ .startOperationTimeForResume(resumeStartAt)
509
+ .execute(binding)
510
+
511
+ then :
512
+ changeStream. getTimestamp(' startAtOperationTime' ) == startAtTime
513
+
514
+ when : ' set resumeToken && startAtOperationTime && startAtOperationTimeForResume'
515
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
516
+ .resumeAfter(new BsonDocument ())
517
+ .startAtOperationTime(startAtTime)
518
+ .startOperationTimeForResume(resumeStartAt)
519
+ .execute(binding)
488
520
489
521
then :
490
- operation. getStartAtOperationTime() == startAtTime
522
+ changeStream. containsKey(' resumeAfter' )
523
+ changeStream. getTimestamp(' startAtOperationTime' ) == startAtTime
491
524
}
492
525
493
526
def ' should set the startAtOperationTime on the async cursor' () {
494
527
given :
528
+ def changeStream
495
529
def binding = Stub (AsyncReadBinding ) {
496
530
getSessionContext() >> Stub (SessionContext ) {
497
531
getReadConcern() >> ReadConcern . DEFAULT
@@ -502,39 +536,66 @@ class ChangeStreamOperationSpecification extends OperationFunctionalSpecificatio
502
536
getConnection(_) >> {
503
537
it. last(). onResult(Stub (AsyncConnection ) {
504
538
commandAsync(* _) >> {
539
+ changeStream = getChangeStream(it[1 ])
505
540
it. last(). onResult(new BsonDocument (' cursor' , new BsonDocument (' id' , new BsonInt64 (1 ))
506
541
.append(' ns' , new BsonString (getNamespace(). getFullName()))
507
542
.append(' firstBatch' , new BsonArrayWrapper ([]))), null )
508
543
}
544
+ getDescription() >> Stub (ConnectionDescription ) {
545
+ getServerVersion() >> new ServerVersion ([4 , 0 , 0 ])
546
+ }
509
547
}, null )
510
548
}
511
549
}, null )
512
550
}
513
551
}
514
552
515
553
when : ' Resume Token'
516
- def operation = new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
554
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
517
555
.resumeAfter(new BsonDocument ())
556
+ .executeAsync(binding, Stub (SingleResultCallback ))
557
+
558
+ then :
559
+ changeStream. containsKey(' resumeAfter' )
560
+ ! changeStream. containsKey(' startAtOperationTime' )
518
561
519
- operation. executeAsync(binding, Stub (SingleResultCallback ))
562
+ when : ' Set startAtOperationTime'
563
+ def startAtTime = new BsonTimestamp (42 )
564
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
565
+ .startAtOperationTime(startAtTime)
566
+ .executeAsync(binding, Stub (SingleResultCallback ))
520
567
521
568
then :
522
- operation . getStartAtOperationTime( ) == null
569
+ changeStream . getTimestamp( ' startAtOperationTime ' ) == startAtTime
523
570
524
- when : ' No token or time'
525
- operation = new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
526
- operation. executeAsync(binding, Stub (SingleResultCallback ))
571
+ when : ' set startAtOperationTimeForResume'
572
+ def resumeStartAt = new BsonTimestamp (42 , 42 )
573
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
574
+ .startOperationTimeForResume(resumeStartAt)
575
+ .executeAsync(binding, Stub (SingleResultCallback ))
527
576
528
577
then :
529
- operation . getStartAtOperationTime( ) == new BsonTimestamp ()
578
+ changeStream . getTimestamp( ' startAtOperationTime ' ) == resumeStartAt
530
579
531
- when : ' set time'
532
- def startAtTime = new BsonTimestamp (42 )
533
- operation = operation. startAtOperationTime(startAtTime)
534
- operation. executeAsync(binding, Stub (SingleResultCallback ))
580
+ when : ' set startAtOperationTime && startAtOperationTimeForResume'
581
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
582
+ .startAtOperationTime(startAtTime)
583
+ .startOperationTimeForResume(resumeStartAt)
584
+ .executeAsync(binding, Stub (SingleResultCallback ))
585
+
586
+ then :
587
+ changeStream. getTimestamp(' startAtOperationTime' ) == startAtTime
588
+
589
+ when : ' set resumeToken && startAtOperationTime && startAtOperationTimeForResume'
590
+ new ChangeStreamOperation<BsonDocument > (helper. getNamespace(), FullDocument . DEFAULT , [], CODEC )
591
+ .resumeAfter(new BsonDocument ())
592
+ .startAtOperationTime(startAtTime)
593
+ .startOperationTimeForResume(resumeStartAt)
594
+ .executeAsync(binding, Stub (SingleResultCallback ))
535
595
536
596
then :
537
- operation. getStartAtOperationTime() == startAtTime
597
+ changeStream. containsKey(' resumeAfter' )
598
+ changeStream. getTimestamp(' startAtOperationTime' ) == startAtTime
538
599
}
539
600
540
601
private final static CODEC = new BsonDocumentCodec ()
@@ -573,4 +634,7 @@ class ChangeStreamOperationSpecification extends OperationFunctionalSpecificatio
573
634
}
574
635
}
575
636
637
+ def getChangeStream (BsonDocument command ) {
638
+ command. getArray(' pipeline' ). head(). getDocument(' $changeStream' )
639
+ }
576
640
}
0 commit comments