@@ -13,10 +13,12 @@ import (
1313 "fmt"
1414 "reflect"
1515 "sync"
16+ "sync/atomic"
1617 "testing"
1718 "time"
1819
1920 "go.mongodb.org/mongo-driver/v2/bson"
21+ "go.mongodb.org/mongo-driver/v2/event"
2022 "go.mongodb.org/mongo-driver/v2/internal/assert"
2123 "go.mongodb.org/mongo-driver/v2/internal/integration/mtest"
2224 "go.mongodb.org/mongo-driver/v2/internal/mongoutil"
@@ -508,6 +510,72 @@ func TestSessionsProse(t *testing.T) {
508510 assert .True (mt , limitedSessionUse , limitedSessMsg , len (ops ))
509511
510512 })
513+
514+ mt .ResetClient (options .Client ())
515+ client := mt .Client
516+ heartbeatStarted := make (chan struct {})
517+ heartbeatSucceeded := make (chan struct {})
518+ var clusterTimeAdvanced uint32
519+ serverMonitor := & event.ServerMonitor {
520+ ServerHeartbeatStarted : func (e * event.ServerHeartbeatStartedEvent ) {
521+ fmt .Println ("Server heartbeat started:" , e .ConnectionID )
522+ if atomic .LoadUint32 (& clusterTimeAdvanced ) == 1 {
523+ fmt .Println ("ServerHeartbeatStartedEvent: cluster time advanced" )
524+ select {
525+ case heartbeatStarted <- struct {}{}:
526+ // NOOP
527+ default :
528+ // NOOP
529+ }
530+ }
531+ },
532+ ServerHeartbeatSucceeded : func (e * event.ServerHeartbeatSucceededEvent ) {
533+ fmt .Println ("Server heartbeat succeeded:" , e .ConnectionID , e .Duration , e .Reply )
534+ if atomic .LoadUint32 (& clusterTimeAdvanced ) == 1 {
535+ fmt .Println ("ServerHeartbeatSucceededEvent: cluster time advanced" )
536+ select {
537+ case heartbeatSucceeded <- struct {}{}:
538+ // NOOP
539+ default :
540+ // NOOP
541+ }
542+ }
543+ },
544+ }
545+ pingOpts := mtest .NewOptions ().
546+ CreateCollection (false ).
547+ ClientOptions (options .Client ().
548+ SetServerMonitor (serverMonitor ).
549+ SetHeartbeatInterval (500 * time .Millisecond ). // Minimum interval
550+ SetDirect (true )).
551+ ClientType (mtest .Pinned )
552+ mt .RunOpts ("20 Drivers do not gossip $clusterTime on SDAM commands" , pingOpts , func (mt * mtest.T ) {
553+ err := mt .Client .Ping (context .Background (), readpref .Primary ())
554+ assert .NoError (mt , err , "expected no error, got: %v" , err )
555+
556+ _ , err = client .Database ("test" ).Collection ("test" ).InsertOne (context .Background (), bson.D {{"advance" , "$clusterTime" }})
557+ require .NoError (mt , err , "expected no error inserting document, got: %v" , err )
558+
559+ atomic .StoreUint32 (& clusterTimeAdvanced , 1 )
560+ <- heartbeatStarted
561+ <- heartbeatSucceeded
562+
563+ err = mt .Client .Ping (context .Background (), readpref .Primary ())
564+ require .NoError (mt , err , "expected no error, got: %v" , err )
565+
566+ succeededEvents := mt .GetAllSucceededEvents ()
567+ require .Len (mt , succeededEvents , 2 , "expected 2 succeeded events, got: %v" , len (succeededEvents ))
568+ require .Equal (mt , "ping" , succeededEvents [0 ].CommandName , "expected first command to be ping, got: %v" , succeededEvents [0 ].CommandName )
569+ initialClusterTime , err := succeededEvents [0 ].Reply .LookupErr ("$clusterTime" )
570+ require .NoError (mt , err , "$clusterTime not found in response" )
571+
572+ startedEvents := mt .GetAllStartedEvents ()
573+ require .Len (mt , startedEvents , 2 , "expected 2 started events, got: %v" , len (startedEvents ))
574+ require .Equal (mt , "ping" , startedEvents [1 ].CommandName , "expected second command to be ping, got: %v" , startedEvents [1 ].CommandName )
575+ currentClusterTime , err := startedEvents [1 ].Command .LookupErr ("$clusterTime" )
576+ require .NoError (mt , err , "$clusterTime not found in commane" )
577+ assert .Equal (mt , initialClusterTime , currentClusterTime , "expected same cluster time, got %v and %v" , initialClusterTime , currentClusterTime )
578+ })
511579}
512580
513581type sessionFunction struct {
0 commit comments