@@ -49,6 +49,7 @@ use utils::test_logger;
49
49
use secp256k1:: key:: { PublicKey , SecretKey } ;
50
50
use secp256k1:: Secp256k1 ;
51
51
52
+ use std:: mem;
52
53
use std:: cmp:: Ordering ;
53
54
use std:: collections:: HashSet ;
54
55
use std:: sync:: { Arc , Mutex } ;
@@ -286,8 +287,8 @@ pub fn do_test(data: &[u8]) {
286
287
287
288
let mut chan_a_disconnected = false ;
288
289
let mut chan_b_disconnected = false ;
289
- let mut chan_a_reconnecting = false ;
290
- let mut chan_b_reconnecting = false ;
290
+ let mut ba_events = Vec :: new ( ) ;
291
+ let mut bc_events = Vec :: new ( ) ;
291
292
292
293
macro_rules! test_err {
293
294
( $res: expr) => {
@@ -363,13 +364,18 @@ pub fn do_test(data: &[u8]) {
363
364
364
365
macro_rules! process_msg_events {
365
366
( $node: expr, $corrupt_forward: expr) => { {
366
- for event in nodes[ $node] . get_and_clear_pending_msg_events( ) {
367
+ let events = if $node == 1 {
368
+ let mut new_events = Vec :: new( ) ;
369
+ mem:: swap( & mut new_events, & mut ba_events) ;
370
+ new_events. extend_from_slice( & bc_events[ ..] ) ;
371
+ bc_events. clear( ) ;
372
+ new_events
373
+ } else { Vec :: new( ) } ;
374
+ for event in events. iter( ) . chain( nodes[ $node] . get_and_clear_pending_msg_events( ) . iter( ) ) {
367
375
match event {
368
376
events:: MessageSendEvent :: UpdateHTLCs { ref node_id, updates: CommitmentUpdate { ref update_add_htlcs, ref update_fail_htlcs, ref update_fulfill_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
369
- for ( idx, dest) in nodes. iter( ) . enumerate( ) {
370
- if dest. get_our_node_id( ) == * node_id &&
371
- ( ( $node != 0 && idx != 0 ) || !chan_a_disconnected) &&
372
- ( ( $node != 2 && idx != 2 ) || !chan_b_disconnected) {
377
+ for dest in nodes. iter( ) {
378
+ if dest. get_our_node_id( ) == * node_id {
373
379
assert!( update_fee. is_none( ) ) ;
374
380
for update_add in update_add_htlcs {
375
381
if !$corrupt_forward {
@@ -399,25 +405,16 @@ pub fn do_test(data: &[u8]) {
399
405
}
400
406
} ,
401
407
events:: MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
402
- for ( idx, dest) in nodes. iter( ) . enumerate( ) {
403
- if dest. get_our_node_id( ) == * node_id &&
404
- ( ( $node != 0 && idx != 0 ) || !chan_a_disconnected) &&
405
- ( ( $node != 2 && idx != 2 ) || !chan_b_disconnected) {
408
+ for dest in nodes. iter( ) {
409
+ if dest. get_our_node_id( ) == * node_id {
406
410
test_err!( dest. handle_revoke_and_ack( & nodes[ $node] . get_our_node_id( ) , msg) ) ;
407
411
}
408
412
}
409
413
} ,
410
414
events:: MessageSendEvent :: SendChannelReestablish { ref node_id, ref msg } => {
411
- for ( idx , dest) in nodes. iter( ) . enumerate ( ) {
415
+ for dest in nodes. iter( ) {
412
416
if dest. get_our_node_id( ) == * node_id {
413
417
test_err!( dest. handle_channel_reestablish( & nodes[ $node] . get_our_node_id( ) , msg) ) ;
414
- if $node == 0 || idx == 0 {
415
- chan_a_reconnecting = false ;
416
- chan_a_disconnected = false ;
417
- } else {
418
- chan_b_reconnecting = false ;
419
- chan_b_disconnected = false ;
420
- }
421
418
}
422
419
}
423
420
} ,
@@ -434,6 +431,56 @@ pub fn do_test(data: &[u8]) {
434
431
} }
435
432
}
436
433
434
+ macro_rules! drain_msg_events_on_disconnect {
435
+ ( $counterparty_id: expr) => { {
436
+ if $counterparty_id == 0 {
437
+ for event in nodes[ 0 ] . get_and_clear_pending_msg_events( ) {
438
+ match event {
439
+ events:: MessageSendEvent :: UpdateHTLCs { .. } => { } ,
440
+ events:: MessageSendEvent :: SendRevokeAndACK { .. } => { } ,
441
+ events:: MessageSendEvent :: SendChannelReestablish { .. } => { } ,
442
+ events:: MessageSendEvent :: SendFundingLocked { .. } => { } ,
443
+ events:: MessageSendEvent :: PaymentFailureNetworkUpdate { .. } => { } ,
444
+ _ => panic!( "Unhandled message event" ) ,
445
+ }
446
+ }
447
+ ba_events. clear( ) ;
448
+ } else {
449
+ for event in nodes[ 2 ] . get_and_clear_pending_msg_events( ) {
450
+ match event {
451
+ events:: MessageSendEvent :: UpdateHTLCs { .. } => { } ,
452
+ events:: MessageSendEvent :: SendRevokeAndACK { .. } => { } ,
453
+ events:: MessageSendEvent :: SendChannelReestablish { .. } => { } ,
454
+ events:: MessageSendEvent :: SendFundingLocked { .. } => { } ,
455
+ events:: MessageSendEvent :: PaymentFailureNetworkUpdate { .. } => { } ,
456
+ _ => panic!( "Unhandled message event" ) ,
457
+ }
458
+ }
459
+ bc_events. clear( ) ;
460
+ }
461
+ let mut events = nodes[ 1 ] . get_and_clear_pending_msg_events( ) ;
462
+ let drop_node_id = if $counterparty_id == 0 { nodes[ 0 ] . get_our_node_id( ) } else { nodes[ 2 ] . get_our_node_id( ) } ;
463
+ let msg_sink = if $counterparty_id == 0 { & mut bc_events } else { & mut ba_events } ;
464
+ for event in events. drain( ..) {
465
+ let push = match event {
466
+ events:: MessageSendEvent :: UpdateHTLCs { ref node_id, .. } => {
467
+ if * node_id != drop_node_id { true } else { false }
468
+ } ,
469
+ events:: MessageSendEvent :: SendRevokeAndACK { ref node_id, .. } => {
470
+ if * node_id != drop_node_id { true } else { false }
471
+ } ,
472
+ events:: MessageSendEvent :: SendChannelReestablish { ref node_id, .. } => {
473
+ if * node_id != drop_node_id { true } else { false }
474
+ } ,
475
+ events:: MessageSendEvent :: SendFundingLocked { .. } => false ,
476
+ events:: MessageSendEvent :: PaymentFailureNetworkUpdate { .. } => false ,
477
+ _ => panic!( "Unhandled message event" ) ,
478
+ } ;
479
+ if push { msg_sink. push( event) ; }
480
+ }
481
+ } }
482
+ }
483
+
437
484
macro_rules! process_events {
438
485
( $node: expr, $fail: expr) => { {
439
486
// In case we get 256 payments we may have a hash collision, resulting in the
@@ -500,27 +547,29 @@ pub fn do_test(data: &[u8]) {
500
547
nodes[ 0 ] . peer_disconnected ( & nodes[ 1 ] . get_our_node_id ( ) , false ) ;
501
548
nodes[ 1 ] . peer_disconnected ( & nodes[ 0 ] . get_our_node_id ( ) , false ) ;
502
549
chan_a_disconnected = true ;
550
+ drain_msg_events_on_disconnect ! ( 0 ) ;
503
551
}
504
552
} ,
505
553
0x10 => {
506
554
if !chan_b_disconnected {
507
555
nodes[ 1 ] . peer_disconnected ( & nodes[ 2 ] . get_our_node_id ( ) , false ) ;
508
556
nodes[ 2 ] . peer_disconnected ( & nodes[ 1 ] . get_our_node_id ( ) , false ) ;
509
557
chan_b_disconnected = true ;
558
+ drain_msg_events_on_disconnect ! ( 2 ) ;
510
559
}
511
560
} ,
512
561
0x11 => {
513
- if chan_a_disconnected && !chan_a_reconnecting {
562
+ if chan_a_disconnected {
514
563
nodes[ 0 ] . peer_connected ( & nodes[ 1 ] . get_our_node_id ( ) ) ;
515
564
nodes[ 1 ] . peer_connected ( & nodes[ 0 ] . get_our_node_id ( ) ) ;
516
- chan_a_reconnecting = true ;
565
+ chan_a_disconnected = false ;
517
566
}
518
567
} ,
519
568
0x12 => {
520
- if chan_b_disconnected && !chan_b_reconnecting {
569
+ if chan_b_disconnected {
521
570
nodes[ 1 ] . peer_connected ( & nodes[ 2 ] . get_our_node_id ( ) ) ;
522
571
nodes[ 2 ] . peer_connected ( & nodes[ 1 ] . get_our_node_id ( ) ) ;
523
- chan_b_reconnecting = true ;
572
+ chan_b_disconnected = false ;
524
573
}
525
574
} ,
526
575
0x13 => process_msg_events ! ( 0 , true ) ,
0 commit comments