@@ -1041,7 +1041,7 @@ macro_rules! expect_payment_failed_with_update {
1041
1041
let events = $node. node. get_and_clear_pending_events( ) ;
1042
1042
assert_eq!( events. len( ) , 1 ) ;
1043
1043
match events[ 0 ] {
1044
- Event :: PaymentFailed { ref payment_hash, rejected_by_dest, ref network_update, ref error_code, ref error_data } => {
1044
+ Event :: PaymentFailed { ref payment_hash, rejected_by_dest, ref network_update, ref error_code, ref error_data, .. } => {
1045
1045
assert_eq!( * payment_hash, $expected_payment_hash, "unexpected payment_hash" ) ;
1046
1046
assert_eq!( rejected_by_dest, $rejected_by_dest, "unexpected rejected_by_dest value" ) ;
1047
1047
assert!( error_code. is_some( ) , "expected error_code.is_some() = true" ) ;
@@ -1070,7 +1070,7 @@ macro_rules! expect_payment_failed {
1070
1070
let events = $node. node. get_and_clear_pending_events( ) ;
1071
1071
assert_eq!( events. len( ) , 1 ) ;
1072
1072
match events[ 0 ] {
1073
- Event :: PaymentFailed { ref payment_hash, rejected_by_dest, network_update: _, ref error_code, ref error_data } => {
1073
+ Event :: PaymentFailed { ref payment_hash, rejected_by_dest, network_update: _, ref error_code, ref error_data, .. } => {
1074
1074
assert_eq!( * payment_hash, $expected_payment_hash, "unexpected payment_hash" ) ;
1075
1075
assert_eq!( rejected_by_dest, $rejected_by_dest, "unexpected rejected_by_dest value" ) ;
1076
1076
assert!( error_code. is_some( ) , "expected error_code.is_some() = true" ) ;
@@ -1242,9 +1242,11 @@ pub fn claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, exp
1242
1242
1243
1243
if !skip_last {
1244
1244
last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
1245
- expect_payment_sent ! ( origin_node, our_payment_preimage) ;
1246
1245
}
1247
1246
}
1247
+ if !skip_last {
1248
+ expect_payment_sent ! ( origin_node, our_payment_preimage) ;
1249
+ }
1248
1250
}
1249
1251
1250
1252
pub fn claim_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , our_payment_preimage : PaymentPreimage ) {
@@ -1287,77 +1289,97 @@ pub fn send_payment<'a, 'b, 'c>(origin: &Node<'a, 'b, 'c>, expected_route: &[&No
1287
1289
claim_payment ( & origin, expected_route, our_payment_preimage) ;
1288
1290
}
1289
1291
1290
- pub fn fail_payment_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , skip_last : bool , our_payment_hash : PaymentHash ) {
1291
- assert ! ( expected_route. last( ) . unwrap( ) . node. fail_htlc_backwards( & our_payment_hash) ) ;
1292
- expect_pending_htlcs_forwardable ! ( expected_route. last( ) . unwrap( ) ) ;
1293
- check_added_monitors ! ( expected_route. last( ) . unwrap( ) , 1 ) ;
1292
+ pub fn fail_payment_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_paths_slice : & [ & [ & Node < ' a , ' b , ' c > ] ] , skip_last : bool , our_payment_hash : PaymentHash ) {
1293
+ let mut expected_paths: Vec < _ > = expected_paths_slice. iter ( ) . collect ( ) ;
1294
+ for path in expected_paths. iter ( ) {
1295
+ assert_eq ! ( path. last( ) . unwrap( ) . node. get_our_node_id( ) , expected_paths[ 0 ] . last( ) . unwrap( ) . node. get_our_node_id( ) ) ;
1296
+ }
1297
+ assert ! ( expected_paths[ 0 ] . last( ) . unwrap( ) . node. fail_htlc_backwards( & our_payment_hash) ) ;
1298
+ expect_pending_htlcs_forwardable ! ( expected_paths[ 0 ] . last( ) . unwrap( ) ) ;
1299
+ check_added_monitors ! ( expected_paths[ 0 ] . last( ) . unwrap( ) , expected_paths. len( ) ) ;
1294
1300
1295
- let mut next_msgs: Option < ( msgs:: UpdateFailHTLC , msgs:: CommitmentSigned ) > = None ;
1296
- macro_rules! update_fail_dance {
1297
- ( $node: expr, $prev_node: expr, $last_node: expr) => {
1298
- {
1299
- $node. node. handle_update_fail_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
1300
- commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , !$last_node) ;
1301
- if skip_last && $last_node {
1302
- expect_pending_htlcs_forwardable!( $node) ;
1301
+ let mut per_path_msgs: Vec < ( ( msgs:: UpdateFailHTLC , msgs:: CommitmentSigned ) , PublicKey ) > = Vec :: with_capacity ( expected_paths. len ( ) ) ;
1302
+ let events = expected_paths[ 0 ] . last ( ) . unwrap ( ) . node . get_and_clear_pending_msg_events ( ) ;
1303
+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
1304
+ for ev in events. iter ( ) {
1305
+ let ( update_fail, commitment_signed, node_id) = match ev {
1306
+ & MessageSendEvent :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
1307
+ assert ! ( update_add_htlcs. is_empty( ) ) ;
1308
+ assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
1309
+ assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
1310
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
1311
+ assert ! ( update_fee. is_none( ) ) ;
1312
+ ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) , node_id. clone ( ) )
1313
+ } ,
1314
+ _ => panic ! ( "Unexpected event" ) ,
1315
+ } ;
1316
+ per_path_msgs. push ( ( ( update_fail, commitment_signed) , node_id) ) ;
1317
+ }
1318
+ per_path_msgs. sort_unstable_by ( |( _, node_id_a) , ( _, node_id_b) | node_id_a. cmp ( node_id_b) ) ;
1319
+ expected_paths. sort_unstable_by ( |path_a, path_b| path_a[ path_a. len ( ) - 2 ] . node . get_our_node_id ( ) . cmp ( & path_b[ path_b. len ( ) - 2 ] . node . get_our_node_id ( ) ) ) ;
1320
+
1321
+ for ( i, ( expected_route, ( path_msgs, next_hop) ) ) in expected_paths. iter ( ) . zip ( per_path_msgs. drain ( ..) ) . enumerate ( ) {
1322
+ let mut next_msgs = Some ( path_msgs) ;
1323
+ let mut expected_next_node = next_hop;
1324
+ let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
1325
+
1326
+ for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) . skip ( 1 ) {
1327
+ assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
1328
+ let update_next_node = !skip_last || idx != expected_route. len ( ) - 1 ;
1329
+ if next_msgs. is_some ( ) {
1330
+ node. node . handle_update_fail_htlc ( & prev_node. node . get_our_node_id ( ) , & next_msgs. as_ref ( ) . unwrap ( ) . 0 ) ;
1331
+ commitment_signed_dance ! ( node, prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , update_next_node) ;
1332
+ if !update_next_node {
1333
+ expect_pending_htlcs_forwardable ! ( node) ;
1303
1334
}
1304
1335
}
1305
- }
1306
- }
1336
+ let events = node. node . get_and_clear_pending_msg_events ( ) ;
1337
+ if update_next_node {
1338
+ assert_eq ! ( events. len( ) , 1 ) ;
1339
+ match events[ 0 ] {
1340
+ MessageSendEvent :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
1341
+ assert ! ( update_add_htlcs. is_empty( ) ) ;
1342
+ assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
1343
+ assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
1344
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
1345
+ assert ! ( update_fee. is_none( ) ) ;
1346
+ expected_next_node = node_id. clone ( ) ;
1347
+ next_msgs = Some ( ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
1348
+ } ,
1349
+ _ => panic ! ( "Unexpected event" ) ,
1350
+ }
1351
+ } else {
1352
+ assert ! ( events. is_empty( ) ) ;
1353
+ }
1354
+ if !skip_last && idx == expected_route. len ( ) - 1 {
1355
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
1356
+ }
1307
1357
1308
- let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
1309
- let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
1310
- for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
1311
- assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
1312
- if next_msgs. is_some ( ) {
1313
- // We may be the "last node" for the purpose of the commitment dance if we're
1314
- // skipping the last node (implying it is disconnected) and we're the
1315
- // second-to-last node!
1316
- update_fail_dance ! ( node, prev_node, skip_last && idx == expected_route. len( ) - 1 ) ;
1358
+ prev_node = node;
1317
1359
}
1318
1360
1319
- let events = node. node . get_and_clear_pending_msg_events ( ) ;
1320
- if !skip_last || idx != expected_route. len ( ) - 1 {
1361
+ if !skip_last {
1362
+ let prev_node = expected_route. first ( ) . unwrap ( ) ;
1363
+ origin_node. node . handle_update_fail_htlc ( & prev_node. node . get_our_node_id ( ) , & next_msgs. as_ref ( ) . unwrap ( ) . 0 ) ;
1364
+ check_added_monitors ! ( origin_node, 0 ) ;
1365
+ assert ! ( origin_node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
1366
+ commitment_signed_dance ! ( origin_node, prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
1367
+ let events = origin_node. node . get_and_clear_pending_events ( ) ;
1321
1368
assert_eq ! ( events. len( ) , 1 ) ;
1322
1369
match events[ 0 ] {
1323
- MessageSendEvent :: UpdateHTLCs { ref node_id, updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
1324
- assert ! ( update_add_htlcs. is_empty( ) ) ;
1325
- assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
1326
- assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
1327
- assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
1328
- assert ! ( update_fee. is_none( ) ) ;
1329
- expected_next_node = node_id. clone ( ) ;
1330
- next_msgs = Some ( ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) ) ) ;
1370
+ Event :: PaymentFailed { payment_hash, rejected_by_dest, all_paths_failed, .. } => {
1371
+ assert_eq ! ( payment_hash, our_payment_hash) ;
1372
+ assert ! ( rejected_by_dest) ;
1373
+ assert_eq ! ( all_paths_failed, i == expected_paths. len( ) - 1 ) ;
1331
1374
} ,
1332
1375
_ => panic ! ( "Unexpected event" ) ,
1333
1376
}
1334
- } else {
1335
- assert ! ( events. is_empty( ) ) ;
1336
- }
1337
- if !skip_last && idx == expected_route. len ( ) - 1 {
1338
- assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
1339
- }
1340
-
1341
- prev_node = node;
1342
- }
1343
-
1344
- if !skip_last {
1345
- update_fail_dance ! ( origin_node, expected_route. first( ) . unwrap( ) , true ) ;
1346
-
1347
- let events = origin_node. node . get_and_clear_pending_events ( ) ;
1348
- assert_eq ! ( events. len( ) , 1 ) ;
1349
- match events[ 0 ] {
1350
- Event :: PaymentFailed { payment_hash, rejected_by_dest, .. } => {
1351
- assert_eq ! ( payment_hash, our_payment_hash) ;
1352
- assert ! ( rejected_by_dest) ;
1353
- } ,
1354
- _ => panic ! ( "Unexpected event" ) ,
1355
1377
}
1356
1378
}
1357
1379
}
1358
1380
1359
- pub fn fail_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , our_payment_hash : PaymentHash ) {
1360
- fail_payment_along_route ( origin_node, expected_route , false , our_payment_hash) ;
1381
+ pub fn fail_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_path : & [ & Node < ' a , ' b , ' c > ] , our_payment_hash : PaymentHash ) {
1382
+ fail_payment_along_route ( origin_node, & [ & expected_path [ .. ] ] , false , our_payment_hash) ;
1361
1383
}
1362
1384
1363
1385
pub fn create_chanmon_cfgs ( node_count : usize ) -> Vec < TestChanMonCfg > {
0 commit comments