@@ -1149,13 +1149,21 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
11491149
11501150#[ cfg( test) ]
11511151mod tests {
1152+ use secp256k1:: Signature ;
1153+ use bitcoin:: BitcoinHash ;
1154+ use bitcoin:: network:: constants:: Network ;
1155+ use bitcoin:: blockdata:: constants:: genesis_block;
1156+ use bitcoin_hashes:: sha256d:: Hash as Sha256dHash ;
1157+ use bitcoin_hashes:: Hash ;
11521158 use ln:: peer_handler:: { PeerManager , MessageHandler , SocketDescriptor } ;
11531159 use ln:: msgs;
1160+ use ln:: features:: ChannelFeatures ;
11541161 use util:: events;
11551162 use util:: test_utils;
11561163 use util:: logger:: Logger ;
1164+ use util:: ser:: Writeable ;
11571165
1158- use secp256k1:: Secp256k1 ;
1166+ use secp256k1:: { Secp256k1 , Message } ;
11591167 use secp256k1:: key:: { SecretKey , PublicKey } ;
11601168
11611169 use rand:: { thread_rng, Rng } ;
@@ -1199,7 +1207,7 @@ mod tests {
11991207 chan_handlers
12001208 }
12011209
1202- fn create_network < ' a > ( peer_count : usize , chan_handlers : & ' a Vec < test_utils:: TestChannelMessageHandler > ) -> Vec < PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler > > {
1210+ fn create_network < ' a > ( peer_count : usize , chan_handlers : & ' a Vec < test_utils:: TestChannelMessageHandler > , routing_handlers : Option < & ' a Vec < Arc < msgs :: RoutingMessageHandler > > > ) -> Vec < PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler > > {
12031211 let mut peers = Vec :: new ( ) ;
12041212 let mut rng = thread_rng ( ) ;
12051213 let logger : Arc < Logger > = Arc :: new ( test_utils:: TestLogger :: new ( ) ) ;
@@ -1208,12 +1216,15 @@ mod tests {
12081216
12091217 for i in 0 ..peer_count {
12101218 let router = test_utils:: TestRoutingMessageHandler :: new ( ) ;
1219+ let router = if let Some ( routers) = routing_handlers { routers[ i] . clone ( ) } else {
1220+ Arc :: new ( router)
1221+ } ;
12111222 let node_id = {
12121223 let mut key_slice = [ 0 ; 32 ] ;
12131224 rng. fill_bytes ( & mut key_slice) ;
12141225 SecretKey :: from_slice ( & key_slice) . unwrap ( )
12151226 } ;
1216- let msg_handler = MessageHandler { chan_handler : & chan_handlers[ i] , route_handler : Arc :: new ( router) } ;
1227+ let msg_handler = MessageHandler { chan_handler : & chan_handlers[ i] , route_handler : router } ;
12171228 let peer = PeerManager :: new ( msg_handler, node_id, & ephemeral_bytes, Arc :: clone ( & logger) ) ;
12181229 peers. push ( peer) ;
12191230 }
@@ -1239,7 +1250,7 @@ mod tests {
12391250 // push a DisconnectPeer event to remove the node flagged by id
12401251 let chan_handlers = create_chan_handlers ( 2 ) ;
12411252 let chan_handler = test_utils:: TestChannelMessageHandler :: new ( ) ;
1242- let mut peers = create_network ( 2 , & chan_handlers) ;
1253+ let mut peers = create_network ( 2 , & chan_handlers, None ) ;
12431254 establish_connection ( & peers[ 0 ] , & peers[ 1 ] ) ;
12441255 assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 1 ) ;
12451256
@@ -1256,11 +1267,12 @@ mod tests {
12561267 peers[ 0 ] . process_events ( ) ;
12571268 assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 0 ) ;
12581269 }
1270+
12591271 #[ test]
1260- fn test_timer_tick_occured ( ) {
1272+ fn test_timer_tick_occurred ( ) {
12611273 // Create peers, a vector of two peer managers, perform initial set up and check that peers[0] has one Peer.
12621274 let chan_handlers = create_chan_handlers ( 2 ) ;
1263- let peers = create_network ( 2 , & chan_handlers) ;
1275+ let peers = create_network ( 2 , & chan_handlers, None ) ;
12641276 establish_connection ( & peers[ 0 ] , & peers[ 1 ] ) ;
12651277 assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 1 ) ;
12661278
@@ -1272,4 +1284,124 @@ mod tests {
12721284 peers[ 0 ] . timer_tick_occured ( ) ;
12731285 assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 0 ) ;
12741286 }
1287+
1288+ pub struct TestRoutingMessageHandler { }
1289+
1290+ impl TestRoutingMessageHandler {
1291+ pub fn new ( ) -> Self {
1292+ TestRoutingMessageHandler { }
1293+ }
1294+
1295+ }
1296+ impl msgs:: RoutingMessageHandler for TestRoutingMessageHandler {
1297+ fn handle_node_announcement ( & self , _msg : & msgs:: NodeAnnouncement ) -> Result < bool , msgs:: LightningError > {
1298+ Err ( msgs:: LightningError { err : "" , action : msgs:: ErrorAction :: IgnoreError } )
1299+ }
1300+ fn handle_channel_announcement ( & self , _msg : & msgs:: ChannelAnnouncement ) -> Result < bool , msgs:: LightningError > {
1301+ Err ( msgs:: LightningError { err : "" , action : msgs:: ErrorAction :: IgnoreError } )
1302+ }
1303+ fn handle_channel_update ( & self , _msg : & msgs:: ChannelUpdate ) -> Result < bool , msgs:: LightningError > {
1304+ Err ( msgs:: LightningError { err : "" , action : msgs:: ErrorAction :: IgnoreError } )
1305+ }
1306+ fn handle_htlc_fail_channel_update ( & self , _update : & msgs:: HTLCFailChannelUpdate ) { }
1307+ fn get_next_channel_announcements ( & self , starting_point : u64 , batch_amount : u8 ) -> Vec < ( msgs:: ChannelAnnouncement , msgs:: ChannelUpdate , msgs:: ChannelUpdate ) > {
1308+ let mut chan_anns = Vec :: new ( ) ;
1309+ let end: u64 = if starting_point > 0 { 6 } else { batch_amount. into ( ) } ;
1310+ for j in starting_point..end {
1311+ let chan_upd_1 = get_dummy_channel_update ( j) ;
1312+ let chan_upd_2 = get_dummy_channel_update ( j) ;
1313+ let chan_ann = get_dummy_channel_announcement ( j) ;
1314+
1315+ chan_anns. push ( ( chan_ann, chan_upd_1, chan_upd_2) ) ;
1316+ }
1317+
1318+ chan_anns
1319+ }
1320+
1321+ fn get_next_node_announcements ( & self , _starting_point : Option < & PublicKey > , _batch_amount : u8 ) -> Vec < msgs:: NodeAnnouncement > {
1322+ Vec :: new ( )
1323+ }
1324+
1325+ fn should_request_full_sync ( & self , _node_id : & PublicKey ) -> bool {
1326+ true
1327+ }
1328+ }
1329+
1330+ fn get_dummy_channel_announcement ( short_chan_id : u64 ) -> msgs:: ChannelAnnouncement {
1331+ let secp_ctx = Secp256k1 :: new ( ) ;
1332+ let network = Network :: Testnet ;
1333+ let node_1_privkey = SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
1334+ let node_2_privkey = SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
1335+ let node_1_btckey = SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
1336+ let node_2_btckey = SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
1337+ let unsigned_ann = msgs:: UnsignedChannelAnnouncement {
1338+ features : ChannelFeatures :: supported ( ) ,
1339+ chain_hash : genesis_block ( network) . header . bitcoin_hash ( ) ,
1340+ short_channel_id : short_chan_id,
1341+ node_id_1 : PublicKey :: from_secret_key ( & secp_ctx, & node_1_privkey) ,
1342+ node_id_2 : PublicKey :: from_secret_key ( & secp_ctx, & node_2_privkey) ,
1343+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, & node_1_btckey) ,
1344+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, & node_2_btckey) ,
1345+ excess_data : Vec :: new ( ) ,
1346+ } ;
1347+
1348+ let msghash = Message :: from_slice ( & Sha256dHash :: hash ( & unsigned_ann. encode ( ) [ ..] ) [ ..] ) . unwrap ( ) ;
1349+ let node_1_sig = secp_ctx. sign ( & msghash, & node_1_privkey) ;
1350+ let node_2_sig = secp_ctx. sign ( & msghash, & node_2_privkey) ;
1351+ let bitcoin_1_sig = secp_ctx. sign ( & msghash, & node_1_btckey) ;
1352+ let bitcoin_2_sig = secp_ctx. sign ( & msghash, & node_2_btckey) ;
1353+
1354+ msgs:: ChannelAnnouncement {
1355+ node_signature_1 : node_1_sig,
1356+ node_signature_2 : node_2_sig,
1357+ bitcoin_signature_1 : bitcoin_1_sig,
1358+ bitcoin_signature_2 : bitcoin_2_sig,
1359+ contents : unsigned_ann,
1360+ }
1361+ }
1362+
1363+ fn get_dummy_channel_update ( short_chan_id : u64 ) -> msgs:: ChannelUpdate {
1364+ use secp256k1:: ffi:: Signature as FFISignature ;
1365+ let network = Network :: Testnet ;
1366+ msgs:: ChannelUpdate {
1367+ signature : Signature :: from ( FFISignature :: new ( ) ) ,
1368+ contents : msgs:: UnsignedChannelUpdate {
1369+ chain_hash : genesis_block ( network) . header . bitcoin_hash ( ) ,
1370+ short_channel_id : short_chan_id,
1371+ timestamp : 0 ,
1372+ flags : 0 ,
1373+ cltv_expiry_delta : 0 ,
1374+ htlc_minimum_msat : 0 ,
1375+ fee_base_msat : 0 ,
1376+ fee_proportional_millionths : 0 ,
1377+ excess_data : vec ! [ ] ,
1378+ }
1379+ }
1380+ }
1381+
1382+ #[ test]
1383+ fn test_do_attempt_write_data ( ) {
1384+ // Create 2 peers with custom TestRoutingMessageHandlers and connect them.
1385+ let chan_handlers = create_chan_handlers ( 2 ) ;
1386+ let mut routing_handlers: Vec < Arc < msgs:: RoutingMessageHandler > > = Vec :: new ( ) ;
1387+ for i in 0 ..2 {
1388+ let routing_handler_option1 = TestRoutingMessageHandler :: new ( ) ;
1389+ let routing_handler_option2 = TestRoutingMessageHandler :: new ( ) ;
1390+ if i == 0 {
1391+ routing_handlers. push ( Arc :: new ( routing_handler_option1) ) ;
1392+ } else {
1393+ routing_handlers. push ( Arc :: new ( routing_handler_option2) ) ;
1394+ }
1395+ }
1396+ let peers = create_network ( 2 , & chan_handlers, Some ( & routing_handlers) ) ;
1397+
1398+ // By calling establish_connect, we trigger do_attempt_write_data between
1399+ // the peers. Previously this function would mistakenly enter an infinite loop
1400+ // when there were more channel messages available than could fit into a peer's
1401+ // buffer. This issue would now be detected by this test (because we use custom
1402+ // RoutingMessageHandlers that intentionally return more channel messages
1403+ // than can fit into a peer's buffer).
1404+ establish_connection ( & peers[ 0 ] , & peers[ 1 ] ) ;
1405+ assert_eq ! ( peers[ 0 ] . peers. lock( ) . unwrap( ) . peers. len( ) , 1 ) ;
1406+ }
12751407}
0 commit comments