+ let persister = |_: &_| Err(std::io::Error::new(std::io::ErrorKind::Other, "test"));
+ let event_handler = |_| {};
+ let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
+ match bg_processor.join() {
+ Ok(_) => panic!("Expected error persisting manager"),
+ Err(e) => {
+ assert_eq!(e.kind(), std::io::ErrorKind::Other);
+ assert_eq!(e.get_ref().unwrap().to_string(), "test");
+ },
+ }
+ }
+
+ #[test]
+ fn test_background_event_handling() {
+ let mut nodes = create_nodes(2, "test_background_event_handling".to_string());
+ let channel_value = 100000;
+ let data_dir = nodes[0].persister.get_data_dir();
+ let persister = move |node: &_| FilesystemPersister::persist_manager(data_dir.clone(), node);
+
+ // Set up a background event handler for FundingGenerationReady events.
+ let (sender, receiver) = std::sync::mpsc::sync_channel(1);
+ let event_handler = move |event| {
+ sender.send(handle_funding_generation_ready!(event, channel_value)).unwrap();
+ };
+ let bg_processor = BackgroundProcessor::start(persister.clone(), event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
+
+ // Open a channel and check that the FundingGenerationReady event was handled.
+ begin_open_channel!(nodes[0], nodes[1], channel_value);
+ let (temporary_channel_id, funding_tx) = receiver
+ .recv_timeout(Duration::from_secs(EVENT_DEADLINE))
+ .expect("FundingGenerationReady not handled within deadline");
+ end_open_channel!(nodes[0], nodes[1], temporary_channel_id, funding_tx);
+
+ // Confirm the funding transaction.
+ confirm_transaction(&mut nodes[0], &funding_tx);
+ let as_funding = get_event_msg!(nodes[0], MessageSendEvent::SendFundingLocked, nodes[1].node.get_our_node_id());
+ confirm_transaction(&mut nodes[1], &funding_tx);
+ let bs_funding = get_event_msg!(nodes[1], MessageSendEvent::SendFundingLocked, nodes[0].node.get_our_node_id());
+ nodes[0].node.handle_funding_locked(&nodes[1].node.get_our_node_id(), &bs_funding);
+ let _as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
+ nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &as_funding);
+ let _bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
+
+ assert!(bg_processor.stop().is_ok());
+
+ // Set up a background event handler for SpendableOutputs events.
+ let (sender, receiver) = std::sync::mpsc::sync_channel(1);
+ let event_handler = move |event| sender.send(event).unwrap();
+ let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
+
+ // Force close the channel and check that the SpendableOutputs event was handled.
+ nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
+ let commitment_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
+ confirm_transaction_depth(&mut nodes[0], &commitment_tx, BREAKDOWN_TIMEOUT as u32);
+ let event = receiver
+ .recv_timeout(Duration::from_secs(EVENT_DEADLINE))
+ .expect("SpendableOutputs not handled within deadline");
+ match event {
+ Event::SpendableOutputs { .. } => {},
+ _ => panic!("Unexpected event: {:?}", event),
+ }
+
+ assert!(bg_processor.stop().is_ok());