+
+ let events = origin_node.get_and_clear_pending_events();
+ assert_eq!(events.len(), 1);
+ match events[0] {
+ Event::PaymentSent { payment_preimage } => {
+ assert_eq!(payment_preimage, our_payment_preimage);
+ },
+ _ => panic!("Unexpected event"),
+ }
+ }
+
+ fn send_failed_payment(origin_node: &ChannelManager, origin_router: &Router, expected_route: &[&ChannelManager]) {
+ let route = origin_router.get_route(&expected_route.last().unwrap().get_our_node_id(), &Vec::new(), 1000000, 142).unwrap();
+ assert_eq!(route.hops.len(), expected_route.len());
+ for (node, hop) in expected_route.iter().zip(route.hops.iter()) {
+ assert_eq!(hop.pubkey, node.get_our_node_id());
+ }
+ let our_payment_hash = send_along_route(origin_node, route, expected_route, 1000000).1;
+
+ assert!(expected_route.last().unwrap().fail_htlc_backwards(&our_payment_hash));
+
+ let mut expected_next_node = expected_route.last().unwrap().get_our_node_id();
+ let mut prev_node = expected_route.last().unwrap();
+ let mut next_msg = None;
+ for node in expected_route.iter().rev() {
+ assert_eq!(expected_next_node, node.get_our_node_id());
+ match next_msg {
+ Some(msg) => {
+ assert!(node.handle_update_fail_htlc(&prev_node.get_our_node_id(), &msg).unwrap().is_none());
+ }, None => {}
+ }
+
+ let events = node.get_and_clear_pending_events();
+ assert_eq!(events.len(), 1);
+ match events[0] {
+ Event::SendFailHTLC { ref node_id, ref msg } => {
+ expected_next_node = node_id.clone();
+ next_msg = Some(msg.clone());
+ },
+ _ => panic!("Unexpected event"),
+ };
+
+ prev_node = node;
+ }
+
+ assert_eq!(expected_next_node, origin_node.get_our_node_id());
+ assert!(origin_node.handle_update_fail_htlc(&expected_route.first().unwrap().get_our_node_id(), &next_msg.unwrap()).unwrap().is_none());
+
+ let events = origin_node.get_and_clear_pending_events();
+ assert_eq!(events.len(), 1);
+ match events[0] {
+ Event::PaymentFailed { payment_hash } => {
+ assert_eq!(payment_hash, our_payment_hash);
+ },
+ _ => panic!("Unexpected event"),
+ }