+
+ #[test]
+ fn calling_sync_routing_table() {
+ let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler();
+ let node_privkey_1 = &SecretKey::from_slice(&[42; 32]).unwrap();
+ let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_privkey_1);
+
+ let chain_hash = genesis_block(Network::Testnet).header.block_hash();
+ let first_blocknum = 0;
+ let number_of_blocks = 0xffff_ffff;
+
+ // It should ignore if gossip_queries feature is not enabled
+ {
+ let init_msg = Init { features: InitFeatures::known().clear_gossip_queries() };
+ net_graph_msg_handler.sync_routing_table(&node_id_1, &init_msg);
+ let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
+ assert_eq!(events.len(), 0);
+ }
+
+ // It should send a query_channel_message with the correct information
+ {
+ let init_msg = Init { features: InitFeatures::known() };
+ net_graph_msg_handler.sync_routing_table(&node_id_1, &init_msg);
+ let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
+ assert_eq!(events.len(), 1);
+ match &events[0] {
+ MessageSendEvent::SendChannelRangeQuery{ node_id, msg } => {
+ assert_eq!(node_id, &node_id_1);
+ assert_eq!(msg.chain_hash, chain_hash);
+ assert_eq!(msg.first_blocknum, first_blocknum);
+ assert_eq!(msg.number_of_blocks, number_of_blocks);
+ },
+ _ => panic!("Expected MessageSendEvent::SendChannelRangeQuery")
+ };
+ }
+
+ // It should not enqueue a query when should_request_full_sync return false.
+ // The initial implementation allows syncing with the first 5 peers after
+ // which should_request_full_sync will return false
+ {
+ let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler();
+ let init_msg = Init { features: InitFeatures::known() };
+ for n in 1..7 {
+ let node_privkey = &SecretKey::from_slice(&[n; 32]).unwrap();
+ let node_id = PublicKey::from_secret_key(&secp_ctx, node_privkey);
+ net_graph_msg_handler.sync_routing_table(&node_id, &init_msg);
+ let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
+ if n <= 5 {
+ assert_eq!(events.len(), 1);
+ } else {
+ assert_eq!(events.len(), 0);
+ }
+
+ }
+ }
+ }
+
+ #[test]
+ fn handling_reply_channel_range() {
+ let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler();
+ let node_privkey_1 = &SecretKey::from_slice(&[42; 32]).unwrap();
+ let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_privkey_1);
+
+ let chain_hash = genesis_block(Network::Testnet).header.block_hash();
+
+ // Test receipt of a single reply that should enqueue an SCID query
+ // matching the SCIDs in the reply
+ {
+ let result = net_graph_msg_handler.handle_reply_channel_range(&node_id_1, ReplyChannelRange {
+ chain_hash,
+ sync_complete: true,
+ first_blocknum: 0,
+ number_of_blocks: 2000,
+ short_channel_ids: vec![
+ 0x0003e0_000000_0000, // 992x0x0
+ 0x0003e8_000000_0000, // 1000x0x0
+ 0x0003e9_000000_0000, // 1001x0x0
+ 0x0003f0_000000_0000, // 1008x0x0
+ 0x00044c_000000_0000, // 1100x0x0
+ 0x0006e0_000000_0000, // 1760x0x0
+ ],
+ });
+ assert!(result.is_ok());
+
+ // We expect to emit a query_short_channel_ids message with the received scids
+ let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
+ assert_eq!(events.len(), 1);
+ match &events[0] {
+ MessageSendEvent::SendShortIdsQuery { node_id, msg } => {
+ assert_eq!(node_id, &node_id_1);
+ assert_eq!(msg.chain_hash, chain_hash);
+ assert_eq!(msg.short_channel_ids, vec![
+ 0x0003e0_000000_0000, // 992x0x0
+ 0x0003e8_000000_0000, // 1000x0x0
+ 0x0003e9_000000_0000, // 1001x0x0
+ 0x0003f0_000000_0000, // 1008x0x0
+ 0x00044c_000000_0000, // 1100x0x0
+ 0x0006e0_000000_0000, // 1760x0x0
+ ]);
+ },
+ _ => panic!("expected MessageSendEvent::SendShortIdsQuery"),
+ }
+ }
+ }
+
+ #[test]
+ fn handling_reply_short_channel_ids() {
+ let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler();
+ let node_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
+ let node_id = PublicKey::from_secret_key(&secp_ctx, node_privkey);
+
+ let chain_hash = genesis_block(Network::Testnet).header.block_hash();
+
+ // Test receipt of a successful reply
+ {
+ let result = net_graph_msg_handler.handle_reply_short_channel_ids_end(&node_id, ReplyShortChannelIdsEnd {
+ chain_hash,
+ full_information: true,
+ });
+ assert!(result.is_ok());
+ }
+
+ // Test receipt of a reply that indicates the peer does not maintain up-to-date information
+ // for the chain_hash requested in the query.
+ {
+ let result = net_graph_msg_handler.handle_reply_short_channel_ids_end(&node_id, ReplyShortChannelIdsEnd {
+ chain_hash,
+ full_information: false,
+ });
+ assert!(result.is_err());
+ assert_eq!(result.err().unwrap().err, "Received reply_short_channel_ids_end with no information");
+ }
+ }
+
+ #[test]
+ fn handling_query_channel_range() {
+ let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler();
+ let node_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
+ let node_id = PublicKey::from_secret_key(&secp_ctx, node_privkey);
+
+ let chain_hash = genesis_block(Network::Testnet).header.block_hash();
+
+ let result = net_graph_msg_handler.handle_query_channel_range(&node_id, QueryChannelRange {
+ chain_hash,
+ first_blocknum: 0,
+ number_of_blocks: 0xffff_ffff,
+ });
+ assert!(result.is_err());
+ }
+
+ #[test]
+ fn handling_query_short_channel_ids() {
+ let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler();
+ let node_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
+ let node_id = PublicKey::from_secret_key(&secp_ctx, node_privkey);
+
+ let chain_hash = genesis_block(Network::Testnet).header.block_hash();
+
+ let result = net_graph_msg_handler.handle_query_short_channel_ids(&node_id, QueryShortChannelIds {
+ chain_hash,
+ short_channel_ids: vec![0x0003e8_000000_0000],
+ });
+ assert!(result.is_err());
+ }