+ { // Disable channels 4 and 12 by requiring unknown feature bits
+ let mut network = router.network_map.write().unwrap();
+ network.channels.get_mut(&NetworkMap::get_key(4, zero_hash.clone())).unwrap().features.set_require_unknown_bits();
+ network.channels.get_mut(&NetworkMap::get_key(12, zero_hash.clone())).unwrap().features.set_require_unknown_bits();
+ }
+
+ { // If all the channels require some features we don't understand, route should fail
+ if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = router.get_route(&node3, None, &Vec::new(), 100, 42) {
+ assert_eq!(err, "Failed to find a path to the given destination");
+ } else { panic!(); }
+ }
+
+ { // If we specify a channel to node8, that overrides our local channel view and that gets used
+ let our_chans = vec![channelmanager::ChannelDetails {
+ channel_id: [0; 32],
+ short_channel_id: Some(42),
+ remote_network_id: node8.clone(),
+ channel_value_satoshis: 0,
+ user_id: 0,
+ outbound_capacity_msat: 0,
+ inbound_capacity_msat: 0,
+ is_live: true,
+ }];
+ let route = router.get_route(&node3, Some(&our_chans), &Vec::new(), 100, 42).unwrap();
+ assert_eq!(route.hops.len(), 2);
+
+ assert_eq!(route.hops[0].pubkey, node8);
+ assert_eq!(route.hops[0].short_channel_id, 42);
+ assert_eq!(route.hops[0].fee_msat, 200);
+ assert_eq!(route.hops[0].cltv_expiry_delta, (13 << 8) | 1);
+
+ assert_eq!(route.hops[1].pubkey, node3);
+ assert_eq!(route.hops[1].short_channel_id, 13);
+ assert_eq!(route.hops[1].fee_msat, 100);
+ assert_eq!(route.hops[1].cltv_expiry_delta, 42);
+ }
+
+ { // Re-enable channels 4 and 12 by wiping the unknown feature bits
+ let mut network = router.network_map.write().unwrap();
+ network.channels.get_mut(&NetworkMap::get_key(4, zero_hash.clone())).unwrap().features.clear_require_unknown_bits();
+ network.channels.get_mut(&NetworkMap::get_key(12, zero_hash.clone())).unwrap().features.clear_require_unknown_bits();
+ }
+
+ { // Disable nodes 1, 2, and 8 by requiring unknown feature bits
+ let mut network = router.network_map.write().unwrap();
+ network.nodes.get_mut(&node1).unwrap().features.set_require_unknown_bits();
+ network.nodes.get_mut(&node2).unwrap().features.set_require_unknown_bits();
+ network.nodes.get_mut(&node8).unwrap().features.set_require_unknown_bits();
+ }
+
+ { // If all nodes require some features we don't understand, route should fail
+ if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = router.get_route(&node3, None, &Vec::new(), 100, 42) {
+ assert_eq!(err, "Failed to find a path to the given destination");
+ } else { panic!(); }
+ }
+
+ { // If we specify a channel to node8, that overrides our local channel view and that gets used
+ let our_chans = vec![channelmanager::ChannelDetails {
+ channel_id: [0; 32],
+ short_channel_id: Some(42),
+ remote_network_id: node8.clone(),
+ channel_value_satoshis: 0,
+ user_id: 0,
+ outbound_capacity_msat: 0,
+ inbound_capacity_msat: 0,
+ is_live: true,
+ }];
+ let route = router.get_route(&node3, Some(&our_chans), &Vec::new(), 100, 42).unwrap();
+ assert_eq!(route.hops.len(), 2);
+
+ assert_eq!(route.hops[0].pubkey, node8);
+ assert_eq!(route.hops[0].short_channel_id, 42);
+ assert_eq!(route.hops[0].fee_msat, 200);
+ assert_eq!(route.hops[0].cltv_expiry_delta, (13 << 8) | 1);
+
+ assert_eq!(route.hops[1].pubkey, node3);
+ assert_eq!(route.hops[1].short_channel_id, 13);
+ assert_eq!(route.hops[1].fee_msat, 100);
+ assert_eq!(route.hops[1].cltv_expiry_delta, 42);
+ }
+
+ { // Re-enable nodes 1, 2, and 8
+ let mut network = router.network_map.write().unwrap();
+ network.nodes.get_mut(&node1).unwrap().features.clear_require_unknown_bits();
+ network.nodes.get_mut(&node2).unwrap().features.clear_require_unknown_bits();
+ network.nodes.get_mut(&node8).unwrap().features.clear_require_unknown_bits();
+ }
+
+ // Note that we don't test disabling node 3 and failing to route to it, as we (somewhat
+ // naively) assume that the user checked the feature bits on the invoice, which override
+ // the node_announcement.
+