|
| 1 | +use crate::utils::test_logger; |
| 2 | + |
| 3 | +use bitcoin::blockdata::constants::genesis_block; |
| 4 | +use bitcoin::hashes::{sha256, Hash}; |
| 5 | +use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey}; |
| 6 | +use bitcoin::Network; |
| 7 | + |
| 8 | +use lightning::chain::Filter; |
| 9 | +use lightning::chain::{chainmonitor, BestBlock}; |
| 10 | +use lightning::ln::channelmanager::{ChainParameters, ChannelManager}; |
| 11 | +use lightning::ln::peer_handler::CustomMessageHandler; |
| 12 | +use lightning::ln::wire::CustomMessageReader; |
| 13 | +use lightning::onion_message::messenger::DefaultMessageRouter; |
| 14 | +use lightning::routing::gossip::NetworkGraph; |
| 15 | +use lightning::routing::router::DefaultRouter; |
| 16 | +use lightning::sign::KeysManager; |
| 17 | +use lightning::sign::NodeSigner; |
| 18 | +use lightning::util::config::UserConfig; |
| 19 | +use lightning::util::test_utils::{ |
| 20 | + TestBroadcaster, TestChainSource, TestFeeEstimator, TestLogger, TestScorer, TestStore, |
| 21 | +}; |
| 22 | + |
| 23 | +use lightning_liquidity::lsps0::ser::LSPS_MESSAGE_TYPE_ID; |
| 24 | +use lightning_liquidity::LiquidityManager; |
| 25 | + |
| 26 | +use core::time::Duration; |
| 27 | + |
| 28 | +type LockingWrapper<T> = std::sync::Mutex<T>; |
| 29 | + |
| 30 | +use std::sync::Arc; |
| 31 | + |
| 32 | +pub fn do_test(data: &[u8]) { |
| 33 | + let network = Network::Bitcoin; |
| 34 | + let tx_broadcaster = Arc::new(TestBroadcaster::new(network)); |
| 35 | + let fee_estimator = Arc::new(TestFeeEstimator::new(253)); |
| 36 | + let logger = Arc::new(TestLogger::with_id("node".into())); |
| 37 | + let genesis_block = genesis_block(network); |
| 38 | + let network_graph = Arc::new(NetworkGraph::new(network, Arc::clone(&logger))); |
| 39 | + let scorer = Arc::new(LockingWrapper::new(TestScorer::new())); |
| 40 | + let now = Duration::from_secs(genesis_block.header.time as u64); |
| 41 | + let seed = sha256::Hash::hash(b"lsps-message-seed").to_byte_array(); |
| 42 | + let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos())); |
| 43 | + let router = Arc::new(DefaultRouter::new( |
| 44 | + Arc::clone(&network_graph), |
| 45 | + Arc::clone(&logger), |
| 46 | + Arc::clone(&keys_manager), |
| 47 | + Arc::clone(&scorer), |
| 48 | + Default::default(), |
| 49 | + )); |
| 50 | + let msg_router = |
| 51 | + Arc::new(DefaultMessageRouter::new(Arc::clone(&network_graph), Arc::clone(&keys_manager))); |
| 52 | + let chain_source = Arc::new(TestChainSource::new(Network::Bitcoin)); |
| 53 | + let kv_store = Arc::new(TestStore::new(false)); |
| 54 | + let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new( |
| 55 | + Some(Arc::clone(&chain_source)), |
| 56 | + Arc::clone(&tx_broadcaster), |
| 57 | + Arc::clone(&logger), |
| 58 | + Arc::clone(&fee_estimator), |
| 59 | + Arc::clone(&kv_store), |
| 60 | + Arc::clone(&keys_manager), |
| 61 | + keys_manager.get_peer_storage_key(), |
| 62 | + )); |
| 63 | + let best_block = BestBlock::from_network(network); |
| 64 | + let params = ChainParameters { network, best_block }; |
| 65 | + let manager = Arc::new(ChannelManager::new( |
| 66 | + Arc::clone(&fee_estimator), |
| 67 | + Arc::clone(&chain_monitor), |
| 68 | + Arc::clone(&tx_broadcaster), |
| 69 | + Arc::clone(&router), |
| 70 | + Arc::clone(&msg_router), |
| 71 | + Arc::clone(&logger), |
| 72 | + Arc::clone(&keys_manager), |
| 73 | + Arc::clone(&keys_manager), |
| 74 | + Arc::clone(&keys_manager), |
| 75 | + UserConfig::default(), |
| 76 | + params, |
| 77 | + genesis_block.header.time, |
| 78 | + )); |
| 79 | + |
| 80 | + let liquidity_manager = Arc::new(LiquidityManager::new( |
| 81 | + Arc::clone(&keys_manager), |
| 82 | + Arc::clone(&manager), |
| 83 | + None::<Arc<dyn Filter + Send + Sync>>, |
| 84 | + None, |
| 85 | + None, |
| 86 | + None, |
| 87 | + )); |
| 88 | + let mut reader = data; |
| 89 | + if let Ok(Some(msg)) = liquidity_manager.read(LSPS_MESSAGE_TYPE_ID, &mut reader) { |
| 90 | + let secp = Secp256k1::signing_only(); |
| 91 | + let sender_node_id = |
| 92 | + PublicKey::from_secret_key(&secp, &SecretKey::from_slice(&[1; 32]).unwrap()); |
| 93 | + let _ = liquidity_manager.handle_custom_message(msg, sender_node_id); |
| 94 | + } |
| 95 | +} |
| 96 | + |
| 97 | +pub fn lsps_message_test<Out: test_logger::Output>(data: &[u8], _out: Out) { |
| 98 | + do_test(data); |
| 99 | +} |
| 100 | + |
| 101 | +#[no_mangle] |
| 102 | +pub extern "C" fn lsps_message_run(data: *const u8, datalen: usize) { |
| 103 | + do_test(unsafe { core::slice::from_raw_parts(data, datalen) }); |
| 104 | +} |
0 commit comments