@@ -93,6 +93,10 @@ impl kvapi::TestSuite {
9393 self . kv_mget ( & builder. build ( ) . await ) . await ?;
9494 self . kv_txn_absent_seq_0 ( & builder. build ( ) . await ) . await ?;
9595 self . kv_transaction ( & builder. build ( ) . await ) . await ?;
96+ self . kv_transaction_fetch_add_u64 ( & builder. build ( ) . await )
97+ . await ?;
98+ self . kv_transaction_fetch_add_u64_match_seq ( & builder. build ( ) . await )
99+ . await ?;
96100 self . kv_transaction_with_ttl ( & builder. build ( ) . await ) . await ?;
97101 self . kv_transaction_delete_match_seq_none ( & builder. build ( ) . await )
98102 . await ?;
@@ -1074,7 +1078,7 @@ impl kvapi::TestSuite {
10741078 }
10751079 ) ;
10761080 assert_eq ! (
1077- resp. responses[ 2 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1081+ resp. responses[ 1 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
10781082 & FetchAddU64Response {
10791083 key: "k2" . to_string( ) ,
10801084 before_seq: 0 ,
@@ -1105,7 +1109,7 @@ impl kvapi::TestSuite {
11051109 }
11061110 ) ;
11071111 assert_eq ! (
1108- resp. responses[ 2 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1112+ resp. responses[ 1 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
11091113 & FetchAddU64Response {
11101114 key: "k2" . to_string( ) ,
11111115 before_seq: 2 ,
@@ -1137,11 +1141,21 @@ impl kvapi::TestSuite {
11371141 }
11381142 ) ;
11391143 assert_eq ! (
1140- resp. responses[ 2 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1144+ resp. responses[ 1 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
11411145 & FetchAddU64Response {
11421146 key: "k2" . to_string( ) ,
11431147 before_seq: 4 ,
11441148 before: 6 ,
1149+ after_seq: 6 ,
1150+ after: u64 :: MAX / 2 + 6 ,
1151+ }
1152+ ) ;
1153+ assert_eq ! (
1154+ resp. responses[ 2 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1155+ & FetchAddU64Response {
1156+ key: "k2" . to_string( ) ,
1157+ before_seq: 6 ,
1158+ before: u64 :: MAX / 2 + 6 ,
11451159 after_seq: 7 ,
11461160 after: u64 :: MAX ,
11471161 }
@@ -1151,6 +1165,114 @@ impl kvapi::TestSuite {
11511165 Ok ( ( ) )
11521166 }
11531167
1168+ /// Tests match_seq must match the record seq to take place the operation.
1169+ #[ fastrace:: trace]
1170+ pub async fn kv_transaction_fetch_add_u64_match_seq < KV : kvapi:: KVApi > (
1171+ & self ,
1172+ kv : & KV ,
1173+ ) -> anyhow:: Result < ( ) > {
1174+ // - Add a record via transaction with ttl
1175+
1176+ info ! ( "--- {}" , func_path!( ) ) ;
1177+
1178+ info ! ( "--- match_seq zero" ) ;
1179+ {
1180+ let txn = TxnRequest :: new ( vec ! [ ] , vec ! [
1181+ TxnOp :: fetch_add_u64( "k1" , 2 ) . match_seq( Some ( 0 ) ) ,
1182+ TxnOp :: fetch_add_u64( "k1" , 3 ) . match_seq( Some ( 0 ) ) ,
1183+ TxnOp :: fetch_add_u64( "k1" , 4 ) ,
1184+ TxnOp :: fetch_add_u64( "k2" , 5 ) ,
1185+ ] ) ;
1186+
1187+ let resp = kv. transaction ( txn) . await ?;
1188+
1189+ assert_eq ! (
1190+ resp. responses[ 0 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1191+ & FetchAddU64Response {
1192+ key: "k1" . to_string( ) ,
1193+ before_seq: 0 ,
1194+ before: 0 ,
1195+ after_seq: 1 ,
1196+ after: 2 ,
1197+ }
1198+ ) ;
1199+ assert_eq ! (
1200+ resp. responses[ 1 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1201+ & FetchAddU64Response {
1202+ key: "k1" . to_string( ) ,
1203+ before_seq: 1 ,
1204+ before: 2 ,
1205+ after_seq: 1 ,
1206+ after: 2 ,
1207+ }
1208+ ) ;
1209+ assert_eq ! (
1210+ resp. responses[ 2 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1211+ & FetchAddU64Response {
1212+ key: "k1" . to_string( ) ,
1213+ before_seq: 1 ,
1214+ before: 2 ,
1215+ after_seq: 2 ,
1216+ after: 6 ,
1217+ }
1218+ ) ;
1219+ assert_eq ! (
1220+ resp. responses[ 3 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1221+ & FetchAddU64Response {
1222+ key: "k2" . to_string( ) ,
1223+ before_seq: 0 ,
1224+ before: 0 ,
1225+ after_seq: 3 ,
1226+ after: 5 ,
1227+ }
1228+ ) ;
1229+ }
1230+
1231+ info ! ( "--- match_seq non zero" ) ;
1232+ {
1233+ let txn = TxnRequest :: new ( vec ! [ ] , vec ! [
1234+ TxnOp :: fetch_add_u64( "k1" , 2 ) . match_seq( Some ( 2 ) ) ,
1235+ TxnOp :: fetch_add_u64( "k1" , 3 ) . match_seq( Some ( 2 ) ) ,
1236+ TxnOp :: fetch_add_u64( "k1" , 4 ) ,
1237+ ] ) ;
1238+
1239+ let resp = kv. transaction ( txn) . await ?;
1240+
1241+ assert_eq ! (
1242+ resp. responses[ 0 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1243+ & FetchAddU64Response {
1244+ key: "k1" . to_string( ) ,
1245+ before_seq: 2 ,
1246+ before: 6 ,
1247+ after_seq: 4 ,
1248+ after: 8 ,
1249+ }
1250+ ) ;
1251+ assert_eq ! (
1252+ resp. responses[ 1 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1253+ & FetchAddU64Response {
1254+ key: "k1" . to_string( ) ,
1255+ before_seq: 4 ,
1256+ before: 8 ,
1257+ after_seq: 4 ,
1258+ after: 8 ,
1259+ }
1260+ ) ;
1261+ assert_eq ! (
1262+ resp. responses[ 2 ] . try_as_fetch_add_u64( ) . unwrap( ) ,
1263+ & FetchAddU64Response {
1264+ key: "k1" . to_string( ) ,
1265+ before_seq: 4 ,
1266+ before: 8 ,
1267+ after_seq: 5 ,
1268+ after: 12 ,
1269+ }
1270+ ) ;
1271+ }
1272+
1273+ Ok ( ( ) )
1274+ }
1275+
11541276 #[ fastrace:: trace]
11551277 pub async fn kv_transaction_with_ttl < KV : kvapi:: KVApi > ( & self , kv : & KV ) -> anyhow:: Result < ( ) > {
11561278 // - Add a record via transaction with ttl
0 commit comments