@@ -927,6 +927,7 @@ mod tests {
927
927
}
928
928
929
929
struct TestSession {
930
+ description : & ' static str ,
930
931
inputs_a : Vec < ( TxIn , TransactionU16LenLimited ) > ,
931
932
outputs_a : Vec < TxOut > ,
932
933
inputs_b : Vec < ( TxIn , TransactionU16LenLimited ) > ,
@@ -1016,7 +1017,12 @@ mod tests {
1016
1017
} ,
1017
1018
_ => ErrorCulprit :: NodeA ,
1018
1019
} ;
1019
- assert_eq ! ( Some ( ( abort_reason, error_culprit) ) , session. expect_error) ;
1020
+ assert_eq ! (
1021
+ Some ( ( abort_reason, error_culprit) ) ,
1022
+ session. expect_error,
1023
+ "Test: {}" ,
1024
+ session. description
1025
+ ) ;
1020
1026
assert ! ( message_send_b. is_none( ) ) ;
1021
1027
return ;
1022
1028
} ,
@@ -1035,7 +1041,12 @@ mod tests {
1035
1041
} ,
1036
1042
_ => ErrorCulprit :: NodeB ,
1037
1043
} ;
1038
- assert_eq ! ( Some ( ( abort_reason, error_culprit) ) , session. expect_error) ;
1044
+ assert_eq ! (
1045
+ Some ( ( abort_reason, error_culprit) ) ,
1046
+ session. expect_error,
1047
+ "Test: {}" ,
1048
+ session. description
1049
+ ) ;
1039
1050
assert ! ( message_send_a. is_none( ) ) ;
1040
1051
return ;
1041
1052
} ,
@@ -1154,56 +1165,55 @@ mod tests {
1154
1165
1155
1166
#[ test]
1156
1167
fn test_interactive_tx_constructor ( ) {
1157
- // No contributions.
1158
1168
do_test_interactive_tx_constructor ( TestSession {
1169
+ description : "No contributions" ,
1159
1170
inputs_a : vec ! [ ] ,
1160
1171
outputs_a : vec ! [ ] ,
1161
1172
inputs_b : vec ! [ ] ,
1162
1173
outputs_b : vec ! [ ] ,
1163
1174
expect_error : Some ( ( AbortReason :: InsufficientFees , ErrorCulprit :: NodeA ) ) ,
1164
1175
} ) ;
1165
- // Single contribution, no initiator inputs.
1166
1176
do_test_interactive_tx_constructor ( TestSession {
1177
+ description : "Single contribution, no initiator inputs" ,
1167
1178
inputs_a : vec ! [ ] ,
1168
1179
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1169
1180
inputs_b : vec ! [ ] ,
1170
1181
outputs_b : vec ! [ ] ,
1171
1182
expect_error : Some ( ( AbortReason :: OutputsValueExceedsInputsValue , ErrorCulprit :: NodeA ) ) ,
1172
1183
} ) ;
1173
- // Single contribution, no initiator outputs.
1174
1184
do_test_interactive_tx_constructor ( TestSession {
1185
+ description : "Single contribution, no initiator outputs" ,
1175
1186
inputs_a : generate_inputs ( & [ 1_000_000 ] ) ,
1176
1187
outputs_a : vec ! [ ] ,
1177
1188
inputs_b : vec ! [ ] ,
1178
1189
outputs_b : vec ! [ ] ,
1179
1190
expect_error : None ,
1180
1191
} ) ;
1181
- // Single contribution, insufficient fees.
1182
1192
do_test_interactive_tx_constructor ( TestSession {
1193
+ description : "Single contribution, insufficient fees" ,
1183
1194
inputs_a : generate_inputs ( & [ 1_000_000 ] ) ,
1184
1195
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1185
1196
inputs_b : vec ! [ ] ,
1186
1197
outputs_b : vec ! [ ] ,
1187
1198
expect_error : Some ( ( AbortReason :: InsufficientFees , ErrorCulprit :: NodeA ) ) ,
1188
1199
} ) ;
1189
- // Initiator contributes sufficient fees, but non-initiator does not.
1190
1200
do_test_interactive_tx_constructor ( TestSession {
1201
+ description : "Initiator contributes sufficient fees, but non-initiator does not" ,
1191
1202
inputs_a : generate_inputs ( & [ 1_000_000 ] ) ,
1192
1203
outputs_a : vec ! [ ] ,
1193
1204
inputs_b : generate_inputs ( & [ 100_000 ] ) ,
1194
1205
outputs_b : generate_outputs ( & [ 100_000 ] ) ,
1195
1206
expect_error : Some ( ( AbortReason :: InsufficientFees , ErrorCulprit :: NodeB ) ) ,
1196
1207
} ) ;
1197
- // Multi-input-output contributions from both sides.
1198
1208
do_test_interactive_tx_constructor ( TestSession {
1209
+ description : "Multi-input-output contributions from both sides" ,
1199
1210
inputs_a : generate_inputs ( & [ 1_000_000 , 1_000_000 ] ) ,
1200
1211
outputs_a : generate_outputs ( & [ 1_000_000 , 200_000 ] ) ,
1201
1212
inputs_b : generate_inputs ( & [ 1_000_000 , 500_000 ] ) ,
1202
1213
outputs_b : generate_outputs ( & [ 1_000_000 , 400_000 ] ) ,
1203
1214
expect_error : None ,
1204
1215
} ) ;
1205
1216
1206
- // Prevout from initiator is not a witness program
1207
1217
let non_segwit_output_tx = {
1208
1218
let mut tx = generate_tx ( & [ 1_000_000 ] ) ;
1209
1219
tx. output . push ( TxOut {
@@ -1225,64 +1235,65 @@ mod tests {
1225
1235
..Default :: default ( )
1226
1236
} ;
1227
1237
do_test_interactive_tx_constructor ( TestSession {
1238
+ description : "Prevout from initiator is not a witness program" ,
1228
1239
inputs_a : vec ! [ ( non_segwit_input, non_segwit_output_tx) ] ,
1229
1240
outputs_a : vec ! [ ] ,
1230
1241
inputs_b : vec ! [ ] ,
1231
1242
outputs_b : vec ! [ ] ,
1232
1243
expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeA ) ) ,
1233
1244
} ) ;
1234
1245
1235
- // Invalid input sequence from initiator.
1236
1246
let tx = TransactionU16LenLimited :: new ( generate_tx ( & [ 1_000_000 ] ) ) . unwrap ( ) ;
1237
1247
let invalid_sequence_input = TxIn {
1238
1248
previous_output : OutPoint { txid : tx. as_transaction ( ) . txid ( ) , vout : 0 } ,
1239
1249
..Default :: default ( )
1240
1250
} ;
1241
1251
do_test_interactive_tx_constructor ( TestSession {
1252
+ description : "Invalid input sequence from initiator" ,
1242
1253
inputs_a : vec ! [ ( invalid_sequence_input, tx. clone( ) ) ] ,
1243
1254
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1244
1255
inputs_b : vec ! [ ] ,
1245
1256
outputs_b : vec ! [ ] ,
1246
1257
expect_error : Some ( ( AbortReason :: IncorrectInputSequenceValue , ErrorCulprit :: NodeA ) ) ,
1247
1258
} ) ;
1248
- // Duplicate prevout from initiator.
1249
1259
let duplicate_input = TxIn {
1250
1260
previous_output : OutPoint { txid : tx. as_transaction ( ) . txid ( ) , vout : 0 } ,
1251
1261
sequence : Sequence :: ENABLE_RBF_NO_LOCKTIME ,
1252
1262
..Default :: default ( )
1253
1263
} ;
1254
1264
do_test_interactive_tx_constructor ( TestSession {
1265
+ description : "Duplicate prevout from initiator" ,
1255
1266
inputs_a : vec ! [ ( duplicate_input. clone( ) , tx. clone( ) ) , ( duplicate_input, tx. clone( ) ) ] ,
1256
1267
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1257
1268
inputs_b : vec ! [ ] ,
1258
1269
outputs_b : vec ! [ ] ,
1259
1270
expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeB ) ) ,
1260
1271
} ) ;
1261
- // Non-initiator uses same prevout as initiator.
1262
1272
let duplicate_input = TxIn {
1263
1273
previous_output : OutPoint { txid : tx. as_transaction ( ) . txid ( ) , vout : 0 } ,
1264
1274
sequence : Sequence :: ENABLE_RBF_NO_LOCKTIME ,
1265
1275
..Default :: default ( )
1266
1276
} ;
1267
1277
do_test_interactive_tx_constructor ( TestSession {
1278
+ description : "Non-initiator uses same prevout as initiator" ,
1268
1279
inputs_a : vec ! [ ( duplicate_input. clone( ) , tx. clone( ) ) ] ,
1269
1280
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1270
1281
inputs_b : vec ! [ ( duplicate_input. clone( ) , tx. clone( ) ) ] ,
1271
1282
outputs_b : vec ! [ ] ,
1272
1283
expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeA ) ) ,
1273
1284
} ) ;
1274
- // Initiator sends too many TxAddInputs
1275
1285
do_test_interactive_tx_constructor ( TestSession {
1286
+ description : "Initiator sends too many TxAddInputs" ,
1276
1287
inputs_a : generate_fixed_number_of_inputs ( MAX_RECEIVED_TX_ADD_INPUT_COUNT + 1 ) ,
1277
1288
outputs_a : vec ! [ ] ,
1278
1289
inputs_b : vec ! [ ] ,
1279
1290
outputs_b : vec ! [ ] ,
1280
1291
expect_error : Some ( ( AbortReason :: ReceivedTooManyTxAddInputs , ErrorCulprit :: NodeA ) ) ,
1281
1292
} ) ;
1282
- // Attempt to queue up two inputs with duplicate serial ids. We use a deliberately bad
1283
- // entropy source, `DuplicateEntropySource` to simulate this.
1284
1293
do_test_interactive_tx_constructor_with_entropy_source (
1285
1294
TestSession {
1295
+ // We use a deliberately bad entropy source, `DuplicateEntropySource` to simulate this.
1296
+ description : "Attempt to queue up two inputs with duplicate serial ids" ,
1286
1297
inputs_a : generate_fixed_number_of_inputs ( 2 ) ,
1287
1298
outputs_a : vec ! [ ] ,
1288
1299
inputs_b : vec ! [ ] ,
@@ -1291,42 +1302,42 @@ mod tests {
1291
1302
} ,
1292
1303
& DuplicateEntropySource ,
1293
1304
) ;
1294
- // Initiator sends too many TxAddOutputs.
1295
1305
do_test_interactive_tx_constructor ( TestSession {
1306
+ description : "Initiator sends too many TxAddOutputs" ,
1296
1307
inputs_a : vec ! [ ] ,
1297
1308
outputs_a : generate_fixed_number_of_outputs ( MAX_RECEIVED_TX_ADD_OUTPUT_COUNT + 1 ) ,
1298
1309
inputs_b : vec ! [ ] ,
1299
1310
outputs_b : vec ! [ ] ,
1300
1311
expect_error : Some ( ( AbortReason :: ReceivedTooManyTxAddOutputs , ErrorCulprit :: NodeA ) ) ,
1301
1312
} ) ;
1302
- // Initiator sends an output below dust value.
1303
1313
do_test_interactive_tx_constructor ( TestSession {
1314
+ description : "Initiator sends an output below dust value" ,
1304
1315
inputs_a : vec ! [ ] ,
1305
1316
outputs_a : generate_outputs ( & [ 1 ] ) ,
1306
1317
inputs_b : vec ! [ ] ,
1307
1318
outputs_b : vec ! [ ] ,
1308
1319
expect_error : Some ( ( AbortReason :: BelowDustLimit , ErrorCulprit :: NodeA ) ) ,
1309
1320
} ) ;
1310
- // Initiator sends an output above maximum sats allowed.
1311
1321
do_test_interactive_tx_constructor ( TestSession {
1322
+ description : "Initiator sends an output above maximum sats allowed" ,
1312
1323
inputs_a : vec ! [ ] ,
1313
1324
outputs_a : generate_outputs ( & [ TOTAL_BITCOIN_SUPPLY_SATOSHIS + 1 ] ) ,
1314
1325
inputs_b : vec ! [ ] ,
1315
1326
outputs_b : vec ! [ ] ,
1316
1327
expect_error : Some ( ( AbortReason :: ExceededMaximumSatsAllowed , ErrorCulprit :: NodeA ) ) ,
1317
1328
} ) ;
1318
- // Initiator sends an output without a witness program.
1319
1329
do_test_interactive_tx_constructor ( TestSession {
1330
+ description : "Initiator sends an output without a witness program" ,
1320
1331
inputs_a : vec ! [ ] ,
1321
1332
outputs_a : vec ! [ generate_non_witness_output( 1_000_000 ) ] ,
1322
1333
inputs_b : vec ! [ ] ,
1323
1334
outputs_b : vec ! [ ] ,
1324
1335
expect_error : Some ( ( AbortReason :: InvalidOutputScript , ErrorCulprit :: NodeA ) ) ,
1325
1336
} ) ;
1326
- // Attempt to queue up two outputs with duplicate serial ids. We use a deliberately bad
1327
- // entropy source, `DuplicateEntropySource` to simulate this.
1328
1337
do_test_interactive_tx_constructor_with_entropy_source (
1329
1338
TestSession {
1339
+ // We use a deliberately bad entropy source, `DuplicateEntropySource` to simulate this.
1340
+ description : "Attempt to queue up two outputs with duplicate serial ids" ,
1330
1341
inputs_a : vec ! [ ] ,
1331
1342
outputs_a : generate_fixed_number_of_outputs ( 2 ) ,
1332
1343
inputs_b : vec ! [ ] ,
@@ -1336,17 +1347,17 @@ mod tests {
1336
1347
& DuplicateEntropySource ,
1337
1348
) ;
1338
1349
1339
- // Peer contributed more output value than inputs
1340
1350
do_test_interactive_tx_constructor ( TestSession {
1351
+ description : "Peer contributed more output value than inputs" ,
1341
1352
inputs_a : generate_inputs ( & [ 100_000 ] ) ,
1342
1353
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1343
1354
inputs_b : vec ! [ ] ,
1344
1355
outputs_b : vec ! [ ] ,
1345
1356
expect_error : Some ( ( AbortReason :: OutputsValueExceedsInputsValue , ErrorCulprit :: NodeA ) ) ,
1346
1357
} ) ;
1347
1358
1348
- // Peer contributed more than allowed number of inputs.
1349
1359
do_test_interactive_tx_constructor ( TestSession {
1360
+ description : "Peer contributed more than allowed number of inputs" ,
1350
1361
inputs_a : generate_fixed_number_of_inputs ( MAX_INPUTS_OUTPUTS_COUNT as u16 + 1 ) ,
1351
1362
outputs_a : vec ! [ ] ,
1352
1363
inputs_b : vec ! [ ] ,
@@ -1356,8 +1367,8 @@ mod tests {
1356
1367
ErrorCulprit :: Indeterminate ,
1357
1368
) ) ,
1358
1369
} ) ;
1359
- // Peer contributed more than allowed number of outputs.
1360
1370
do_test_interactive_tx_constructor ( TestSession {
1371
+ description : "Peer contributed more than allowed number of outputs" ,
1361
1372
inputs_a : generate_inputs ( & [ TOTAL_BITCOIN_SUPPLY_SATOSHIS ] ) ,
1362
1373
outputs_a : generate_fixed_number_of_outputs ( MAX_INPUTS_OUTPUTS_COUNT as u16 + 1 ) ,
1363
1374
inputs_b : vec ! [ ] ,
0 commit comments