@@ -812,6 +812,104 @@ final class Tests: XCTestCase {
812812 }
813813 }
814814
815+ func testSerialConsistency( ) {
816+ let env = ProcessInfo . processInfo. environment
817+ let keyspace = env [ " CASSANDRA_KEYSPACE " ] ?? " test "
818+
819+ var serialConfig = CassandraClient . Configuration (
820+ contactPointsProvider: { callback in
821+ callback ( . success( [ env [ " CASSANDRA_HOST " ] ?? " 127.0.0.1 " ] ) )
822+ } ,
823+ port: env [ " CASSANDRA_CQL_PORT " ] . flatMap ( Int32 . init) ?? 9042 ,
824+ protocolVersion: . v3
825+ )
826+ serialConfig. username = env [ " CASSANDRA_USER " ]
827+ serialConfig. password = env [ " CASSANDRA_PASSWORD " ]
828+ serialConfig. keyspace = keyspace
829+ serialConfig. requestTimeoutMillis = UInt32 ( 24_000 )
830+ serialConfig. connectTimeoutMillis = UInt32 ( 10_000 )
831+ serialConfig. serialConsistency = . serial
832+
833+ var logger = Logger ( label: " test " )
834+ logger. logLevel = . debug
835+
836+ let serialClient = CassandraClient ( configuration: serialConfig, logger: logger)
837+ defer { XCTAssertNoThrow ( try serialClient. shutdown ( ) ) }
838+
839+ XCTAssertNoThrow (
840+ try serialClient. withSession ( keyspace: . none) { session in
841+ try session. run (
842+ " create keyspace if not exists \( keyspace) with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } "
843+ ) . wait ( )
844+ }
845+ )
846+
847+ let serialSession = serialClient. makeSession ( keyspace: keyspace)
848+ defer { XCTAssertNoThrow ( try serialSession. shutdown ( ) ) }
849+
850+ let tableName = " test_serial_ \( DispatchTime . now ( ) . uptimeNanoseconds) "
851+ XCTAssertNoThrow ( try serialSession. run ( " create table \( tableName) (id int primary key, value int); " ) . wait ( ) )
852+ XCTAssertNoThrow ( try serialSession. run ( " insert into \( tableName) (id, value) values (1, 100); " ) . wait ( ) )
853+
854+ let lwtQuery = " update \( tableName) set value = 200 where id = 1 if value = 100; "
855+ var serialResult : CassandraClient . Rows ?
856+ XCTAssertNoThrow ( serialResult = try serialSession. query ( lwtQuery) . wait ( ) )
857+ XCTAssertNotNil ( serialResult, " Serial consistency LWT should succeed " )
858+
859+ let serialRows = Array ( serialResult!)
860+ XCTAssertFalse ( serialRows. isEmpty, " Serial LWT query should return at least one row " )
861+ if let firstRow = serialRows. first {
862+ XCTAssertNotNil ( firstRow. column ( " [applied] " ) ? . bool, " Serial LWT result should contain [applied] column " )
863+ }
864+
865+ var localSerialConfig = serialConfig
866+ localSerialConfig. serialConsistency = . localSerial
867+
868+ let localSerialClient = CassandraClient ( configuration: localSerialConfig, logger: logger)
869+ defer { XCTAssertNoThrow ( try localSerialClient. shutdown ( ) ) }
870+
871+ let localSerialSession = localSerialClient. makeSession ( keyspace: keyspace)
872+ defer { XCTAssertNoThrow ( try localSerialSession. shutdown ( ) ) }
873+
874+ let tableName2 = " test_local_serial_ \( DispatchTime . now ( ) . uptimeNanoseconds) "
875+ XCTAssertNoThrow (
876+ try localSerialSession. run ( " create table \( tableName2) (id int primary key, value int); " ) . wait ( )
877+ )
878+ XCTAssertNoThrow ( try localSerialSession. run ( " insert into \( tableName2) (id, value) values (1, 300); " ) . wait ( ) )
879+
880+ let localLwtQuery = " update \( tableName2) set value = 400 where id = 1 if value = 300; "
881+ var localSerialResult : CassandraClient . Rows ?
882+ XCTAssertNoThrow ( localSerialResult = try localSerialSession. query ( localLwtQuery) . wait ( ) )
883+ XCTAssertNotNil ( localSerialResult, " Local serial consistency LWT should succeed " )
884+
885+ let localSerialRows = Array ( localSerialResult!)
886+ XCTAssertFalse ( localSerialRows. isEmpty, " Local serial LWT query should return at least one row " )
887+ if let firstRow = localSerialRows. first {
888+ XCTAssertNotNil (
889+ firstRow. column ( " [applied] " ) ? . bool,
890+ " Local serial LWT result should contain [applied] column "
891+ )
892+ }
893+
894+ var nilSerialConfig = serialConfig
895+ nilSerialConfig. serialConsistency = nil
896+
897+ let nilSerialClient = CassandraClient ( configuration: nilSerialConfig, logger: logger)
898+ defer { XCTAssertNoThrow ( try nilSerialClient. shutdown ( ) ) }
899+
900+ let nilSerialSession = nilSerialClient. makeSession ( keyspace: keyspace)
901+ defer { XCTAssertNoThrow ( try nilSerialSession. shutdown ( ) ) }
902+
903+ let tableName3 = " test_nil_serial_ \( DispatchTime . now ( ) . uptimeNanoseconds) "
904+ XCTAssertNoThrow ( try nilSerialSession. run ( " create table \( tableName3) (id int primary key, value int); " ) . wait ( ) )
905+ XCTAssertNoThrow ( try nilSerialSession. run ( " insert into \( tableName3) (id, value) values (1, 500); " ) . wait ( ) )
906+
907+ let nilLwtQuery = " update \( tableName3) set value = 600 where id = 1 if value = 500; "
908+ var nilSerialResult : CassandraClient . Rows ?
909+ XCTAssertNoThrow ( nilSerialResult = try nilSerialSession. query ( nilLwtQuery) . wait ( ) )
910+ XCTAssertNotNil ( nilSerialResult, " Default serial consistency LWT should succeed " )
911+ }
912+
815913 // meh, but nothing cross platform available
816914 func randomBytes( size: Int ) -> [ UInt8 ] {
817915 var buffer = [ UInt8] ( )
0 commit comments