@@ -413,6 +413,104 @@ fn test_1_conf_open() {
413
413
}
414
414
}
415
415
416
+ fn do_test_sanity_on_in_flight_opens ( steps : u8 ) {
417
+ // Previously, we had issues deserializing channels when we hadn't connected the first block
418
+ // after creation. To catch that and similar issues, we lean on the Node::drop impl to test
419
+ // serialization round-trips and simply do steps towards opening a channel and then drop the
420
+ // Node objects.
421
+
422
+ let node_cfgs = create_node_cfgs ( 2 ) ;
423
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
424
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
425
+
426
+ if steps & 0b1000_0000 != 0 {
427
+ let header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
428
+ nodes[ 0 ] . block_notifier . block_connected_checked ( & header, 1 , & Vec :: new ( ) , & [ 0 ; 0 ] ) ;
429
+ nodes[ 1 ] . block_notifier . block_connected_checked ( & header, 1 , & Vec :: new ( ) , & [ 0 ; 0 ] ) ;
430
+ }
431
+
432
+ if steps & 0x0f == 0 { return ; }
433
+ nodes[ 0 ] . node . create_channel ( nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 10001 , 42 ) . unwrap ( ) ;
434
+ let open_channel = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendOpenChannel , nodes[ 1 ] . node. get_our_node_id( ) ) ;
435
+
436
+ if steps & 0x0f == 1 { return ; }
437
+ nodes[ 1 ] . node . handle_open_channel ( & nodes[ 0 ] . node . get_our_node_id ( ) , InitFeatures :: supported ( ) , & open_channel) ;
438
+ let accept_channel = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendAcceptChannel , nodes[ 0 ] . node. get_our_node_id( ) ) ;
439
+
440
+ if steps & 0x0f == 2 { return ; }
441
+ nodes[ 0 ] . node . handle_accept_channel ( & nodes[ 1 ] . node . get_our_node_id ( ) , InitFeatures :: supported ( ) , & accept_channel) ;
442
+
443
+ let ( temporary_channel_id, tx, funding_output) = create_funding_transaction ( & nodes[ 0 ] , 100000 , 42 ) ;
444
+
445
+ if steps & 0x0f == 3 { return ; }
446
+ {
447
+ nodes[ 0 ] . node . funding_transaction_generated ( & temporary_channel_id, funding_output) ;
448
+ let mut added_monitors = nodes[ 0 ] . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
449
+ assert_eq ! ( added_monitors. len( ) , 1 ) ;
450
+ assert_eq ! ( added_monitors[ 0 ] . 0 , funding_output) ;
451
+ added_monitors. clear ( ) ;
452
+ }
453
+ let funding_created = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendFundingCreated , nodes[ 1 ] . node. get_our_node_id( ) ) ;
454
+
455
+ if steps & 0x0f == 4 { return ; }
456
+ nodes[ 1 ] . node . handle_funding_created ( & nodes[ 0 ] . node . get_our_node_id ( ) , & funding_created) ;
457
+ {
458
+ let mut added_monitors = nodes[ 1 ] . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
459
+ assert_eq ! ( added_monitors. len( ) , 1 ) ;
460
+ assert_eq ! ( added_monitors[ 0 ] . 0 , funding_output) ;
461
+ added_monitors. clear ( ) ;
462
+ }
463
+ let funding_signed = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendFundingSigned , nodes[ 0 ] . node. get_our_node_id( ) ) ;
464
+
465
+ if steps & 0x0f == 5 { return ; }
466
+ nodes[ 0 ] . node . handle_funding_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & funding_signed) ;
467
+ {
468
+ let mut added_monitors = nodes[ 0 ] . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
469
+ assert_eq ! ( added_monitors. len( ) , 1 ) ;
470
+ assert_eq ! ( added_monitors[ 0 ] . 0 , funding_output) ;
471
+ added_monitors. clear ( ) ;
472
+ }
473
+
474
+ let events_4 = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
475
+ assert_eq ! ( events_4. len( ) , 1 ) ;
476
+ match events_4[ 0 ] {
477
+ Event :: FundingBroadcastSafe { ref funding_txo, user_channel_id } => {
478
+ assert_eq ! ( user_channel_id, 42 ) ;
479
+ assert_eq ! ( * funding_txo, funding_output) ;
480
+ } ,
481
+ _ => panic ! ( "Unexpected event" ) ,
482
+ } ;
483
+
484
+ if steps & 0x0f == 6 { return ; }
485
+ create_chan_between_nodes_with_value_confirm_first ( & nodes[ 0 ] , & nodes[ 1 ] , & tx) ;
486
+
487
+ if steps & 0x0f == 7 { return ; }
488
+ confirm_transaction ( & nodes[ 0 ] . block_notifier , & nodes[ 0 ] . chain_monitor , & tx, tx. version ) ;
489
+ create_chan_between_nodes_with_value_confirm_second ( & nodes[ 1 ] , & nodes[ 0 ] ) ;
490
+ }
491
+
492
+ #[ test]
493
+ fn test_sanity_on_in_flight_opens ( ) {
494
+ do_test_sanity_on_in_flight_opens ( 0 ) ;
495
+ do_test_sanity_on_in_flight_opens ( 0 | 0b1000_0000 ) ;
496
+ do_test_sanity_on_in_flight_opens ( 1 ) ;
497
+ do_test_sanity_on_in_flight_opens ( 1 | 0b1000_0000 ) ;
498
+ do_test_sanity_on_in_flight_opens ( 2 ) ;
499
+ do_test_sanity_on_in_flight_opens ( 2 | 0b1000_0000 ) ;
500
+ do_test_sanity_on_in_flight_opens ( 3 ) ;
501
+ do_test_sanity_on_in_flight_opens ( 3 | 0b1000_0000 ) ;
502
+ do_test_sanity_on_in_flight_opens ( 4 ) ;
503
+ do_test_sanity_on_in_flight_opens ( 4 | 0b1000_0000 ) ;
504
+ do_test_sanity_on_in_flight_opens ( 5 ) ;
505
+ do_test_sanity_on_in_flight_opens ( 5 | 0b1000_0000 ) ;
506
+ do_test_sanity_on_in_flight_opens ( 6 ) ;
507
+ do_test_sanity_on_in_flight_opens ( 6 | 0b1000_0000 ) ;
508
+ do_test_sanity_on_in_flight_opens ( 7 ) ;
509
+ do_test_sanity_on_in_flight_opens ( 7 | 0b1000_0000 ) ;
510
+ do_test_sanity_on_in_flight_opens ( 8 ) ;
511
+ do_test_sanity_on_in_flight_opens ( 8 | 0b1000_0000 ) ;
512
+ }
513
+
416
514
#[ test]
417
515
fn test_update_fee_vanilla ( ) {
418
516
let node_cfgs = create_node_cfgs ( 2 ) ;
0 commit comments