@@ -182,7 +182,7 @@ mod tests {
182
182
use std:: path:: PathBuf ;
183
183
use std:: sync:: { Arc , Mutex } ;
184
184
use std:: time:: Duration ;
185
- use super :: BackgroundProcessor ;
185
+ use super :: { BackgroundProcessor , FRESHNESS_TIMER } ;
186
186
187
187
#[ derive( Clone , Eq , Hash , PartialEq ) ]
188
188
struct TestDescriptor { }
@@ -246,13 +246,27 @@ mod tests {
246
246
}
247
247
248
248
macro_rules! open_channel {
249
+ ( $node_a: expr, $node_b: expr, $channel_value: expr) => { {
250
+ begin_open_channel!( $node_a, $node_b, $channel_value) ;
251
+ let events = $node_a. node. get_and_clear_pending_events( ) ;
252
+ assert_eq!( events. len( ) , 1 ) ;
253
+ let ( temporary_channel_id, tx) = handle_funding_generation_ready!( events[ 0 ] , $channel_value) ;
254
+ end_open_channel!( $node_a, $node_b, temporary_channel_id, tx) ;
255
+ tx
256
+ } }
257
+ }
258
+
259
+ macro_rules! begin_open_channel {
249
260
( $node_a: expr, $node_b: expr, $channel_value: expr) => { {
250
261
$node_a. node. create_channel( $node_b. node. get_our_node_id( ) , $channel_value, 100 , 42 , None ) . unwrap( ) ;
251
262
$node_b. node. handle_open_channel( & $node_a. node. get_our_node_id( ) , InitFeatures :: known( ) , & get_event_msg!( $node_a, MessageSendEvent :: SendOpenChannel , $node_b. node. get_our_node_id( ) ) ) ;
252
263
$node_a. node. handle_accept_channel( & $node_b. node. get_our_node_id( ) , InitFeatures :: known( ) , & get_event_msg!( $node_b, MessageSendEvent :: SendAcceptChannel , $node_a. node. get_our_node_id( ) ) ) ;
253
- let events = $node_a. node. get_and_clear_pending_events( ) ;
254
- assert_eq!( events. len( ) , 1 ) ;
255
- let ( temporary_channel_id, tx) = match events[ 0 ] {
264
+ } }
265
+ }
266
+
267
+ macro_rules! handle_funding_generation_ready {
268
+ ( $event: expr, $channel_value: expr) => { {
269
+ match $event {
256
270
Event :: FundingGenerationReady { ref temporary_channel_id, ref channel_value_satoshis, ref output_script, user_channel_id } => {
257
271
assert_eq!( * channel_value_satoshis, $channel_value) ;
258
272
assert_eq!( user_channel_id, 42 ) ;
@@ -263,12 +277,15 @@ mod tests {
263
277
( * temporary_channel_id, tx)
264
278
} ,
265
279
_ => panic!( "Unexpected event" ) ,
266
- } ;
280
+ }
281
+ } }
282
+ }
267
283
268
- $node_a. node. funding_transaction_generated( & temporary_channel_id, tx. clone( ) ) . unwrap( ) ;
284
+ macro_rules! end_open_channel {
285
+ ( $node_a: expr, $node_b: expr, $temporary_channel_id: expr, $tx: expr) => { {
286
+ $node_a. node. funding_transaction_generated( & $temporary_channel_id, $tx. clone( ) ) . unwrap( ) ;
269
287
$node_b. node. handle_funding_created( & $node_a. node. get_our_node_id( ) , & get_event_msg!( $node_a, MessageSendEvent :: SendFundingCreated , $node_b. node. get_our_node_id( ) ) ) ;
270
288
$node_a. node. handle_funding_signed( & $node_b. node. get_our_node_id( ) , & get_event_msg!( $node_b, MessageSendEvent :: SendFundingSigned , $node_a. node. get_our_node_id( ) ) ) ;
271
- tx
272
289
} }
273
290
}
274
291
@@ -362,4 +379,29 @@ mod tests {
362
379
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
363
380
let _ = bg_processor. thread_handle . join ( ) . unwrap ( ) . expect_err ( "Errored persisting manager: test" ) ;
364
381
}
382
+
383
+ #[ test]
384
+ fn test_background_event_handling ( ) {
385
+ let nodes = create_nodes ( 2 , "test_background_event_handling" . to_string ( ) ) ;
386
+ let channel_value = 100000 ;
387
+ let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
388
+ let persister = move |node : & _ | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
389
+
390
+ // Set up a background event handler for FundingGenerationReady events.
391
+ let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
392
+ let event_handler = move |event| {
393
+ sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
394
+ } ;
395
+ let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
396
+
397
+ // Open a channel and check that the FundingGenerationReady event was handled.
398
+ begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
399
+ let timeout = Duration :: from_secs ( 5 * FRESHNESS_TIMER ) ;
400
+ let ( temporary_channel_id, tx) = receiver
401
+ . recv_timeout ( timeout)
402
+ . expect ( "FundingGenerationReady not handled within deadline" ) ;
403
+ end_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , temporary_channel_id, tx) ;
404
+
405
+ assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
406
+ }
365
407
}
0 commit comments