@@ -35,9 +35,11 @@ import (
3535 "net"
3636 "reflect"
3737 "strings"
38+ "sync"
3839 "testing"
3940 "time"
4041
42+ "github.com/stretchr/testify/require"
4143 inf "gopkg.in/inf.v0"
4244)
4345
@@ -1028,3 +1030,87 @@ func TestSmallTimeoutNoPoolErrors(t *testing.T) {
10281030 errorCount , logOutput )
10291031 }
10301032}
1033+
1034+ // Emulates round-robin host selection policy and captures KeyspaceChanged events.
1035+ type capturingRRTestPolicy struct {
1036+ roundRobinHostPolicy
1037+
1038+ capturedEvents []KeyspaceUpdateEvent
1039+ mu sync.Mutex
1040+ }
1041+
1042+ func (c * capturingRRTestPolicy ) KeyspaceChanged (event KeyspaceUpdateEvent ) {
1043+ c .mu .Lock ()
1044+ defer c .mu .Unlock ()
1045+ c .capturedEvents = append (c .capturedEvents , event )
1046+ c .roundRobinHostPolicy .KeyspaceChanged (event )
1047+ }
1048+
1049+ func (c * capturingRRTestPolicy ) CapturedEvents () []KeyspaceUpdateEvent {
1050+ c .mu .Lock ()
1051+ defer c .mu .Unlock ()
1052+ return append ([]KeyspaceUpdateEvent {}, c .capturedEvents ... )
1053+ }
1054+
1055+ func (c * capturingRRTestPolicy ) ResetEvents () {
1056+ c .mu .Lock ()
1057+ defer c .mu .Unlock ()
1058+ c .capturedEvents = nil
1059+ }
1060+
1061+ func TestHostSelectionPolicyKeyspaceChangedEvents (t * testing.T ) {
1062+ cluster := createCluster ()
1063+ policy := capturingRRTestPolicy {}
1064+ cluster .Metadata .CacheMode = Full
1065+ cluster .PoolConfig .HostSelectionPolicy = & policy
1066+
1067+ session , err := cluster .CreateSession ()
1068+ require .NoError (t , err )
1069+ defer session .Close ()
1070+
1071+ // Regression test for CASSGO-132: KeyspaceChanged events are fired during session creation.
1072+ events := policy .CapturedEvents ()
1073+ require .Empty (t , events , "KeyspaceChanged events should not be fired during session creation" )
1074+
1075+ // Check keyspace events are fired
1076+
1077+ // CREATE
1078+ ksName := randomNameWithPrefix ("gocql_test_" )
1079+ err = session .Query (fmt .Sprintf ("CREATE KEYSPACE %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}" , ksName )).ExecContext (context .Background ())
1080+ require .NoError (t , err )
1081+
1082+ require .Eventually (t , func () bool {
1083+ events = policy .CapturedEvents ()
1084+ return len (events ) == 1
1085+ }, time .Second * 5 , time .Millisecond * 100 )
1086+
1087+ require .Len (t , events , 1 )
1088+ require .Equal (t , ksName , events [0 ].Keyspace )
1089+ require .Equal (t , SchemaChangeTypeCreated , events [0 ].Change )
1090+
1091+ // ALTER
1092+ policy .ResetEvents ()
1093+ err = session .Query (fmt .Sprintf ("ALTER KEYSPACE %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '2'}" , ksName )).ExecContext (context .Background ())
1094+ require .NoError (t , err )
1095+ require .Eventually (t , func () bool {
1096+ events = policy .CapturedEvents ()
1097+ return len (events ) == 1
1098+ }, time .Second * 5 , time .Millisecond * 100 )
1099+
1100+ require .Len (t , events , 1 )
1101+ require .Equal (t , ksName , events [0 ].Keyspace )
1102+ require .Equal (t , SchemaChangeTypeUpdated , events [0 ].Change )
1103+
1104+ // DROP
1105+ policy .ResetEvents ()
1106+ err = session .Query (fmt .Sprintf ("DROP KEYSPACE %s" , ksName )).ExecContext (context .Background ())
1107+ require .NoError (t , err )
1108+ require .Eventually (t , func () bool {
1109+ events = policy .CapturedEvents ()
1110+ return len (events ) == 1
1111+ }, time .Second * 5 , time .Millisecond * 100 )
1112+
1113+ require .Len (t , events , 1 )
1114+ require .Equal (t , ksName , events [0 ].Keyspace )
1115+ require .Equal (t , SchemaChangeTypeDropped , events [0 ].Change )
1116+ }
0 commit comments