Skip to content

Commit 2b2c292

Browse files
committed
Use the newly introduced variants to allow respond_with_reply_path test
1. Add a new test for ResponseInstruction::WithReplyPath, verifying both successful and unsuccessful reply_path creation.
1 parent 42b1768 commit 2b2c292

File tree

1 file changed

+70
-9
lines changed

1 file changed

+70
-9
lines changed

lightning/src/onion_message/functional_tests.rs

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,16 +185,21 @@ impl CustomOnionMessageHandler for TestCustomMessageHandler {
185185
Some(expected_msg) => assert_eq!(expected_msg, msg),
186186
None => panic!("Unexpected message: {:?}", msg),
187187
}
188-
let response_option = match msg {
189-
TestCustomMessage::Request => Some(TestCustomMessage::Response),
190-
TestCustomMessage::Response => None,
191-
TestCustomMessage::ResponseA => Some(TestCustomMessage::ResponseB),
192-
TestCustomMessage::ResponseB => Some(TestCustomMessage::ResponseA),
188+
let (response_option, add_reply_path) = match msg {
189+
TestCustomMessage::Request => (Some(TestCustomMessage::Response), false),
190+
TestCustomMessage::Response => (None, false),
191+
TestCustomMessage::ResponseA => (Some(TestCustomMessage::ResponseB), true),
192+
TestCustomMessage::ResponseB => (Some(TestCustomMessage::ResponseA), true),
193193
};
194-
if let (Some(response), Some(responder)) = (response_option, responder) {
195-
responder.respond(response)
196-
} else {
197-
ResponseInstruction::NoResponse
194+
match (response_option, responder) {
195+
(Some(response), Some(responder)) => {
196+
if add_reply_path {
197+
responder.respond_with_reply_path(response)
198+
} else {
199+
responder.respond(response)
200+
}
201+
}
202+
_ => ResponseInstruction::NoResponse,
198203
}
199204
}
200205
fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, DecodeError> where Self: Sized {
@@ -456,6 +461,62 @@ fn async_response_over_one_blinded_hop() {
456461
pass_along_path(&nodes);
457462
}
458463

464+
fn do_test_async_response_with_reply_path_over_one_blinded_hop(reply_path_succeed: bool) {
465+
// Simulate an asynchronous interaction between two nodes, Alice and Bob.
466+
467+
let mut nodes = create_nodes(2);
468+
let alice = &nodes[0];
469+
let bob = &nodes[1];
470+
471+
// Alice receives a message from Bob with a reply path
472+
let message = TestCustomMessage::ResponseA;
473+
let path_id = Some([2; 32]);
474+
475+
let secp_ctx = Secp256k1::new();
476+
let reply_path = BlindedPath::new_for_message(&[bob.node_id], &*bob.entropy_source, &secp_ctx).unwrap();
477+
478+
if reply_path_succeed {
479+
// Add a channel so that nodes are announced to each other.
480+
// This will allow creating the reply path by Alice to include in the response.
481+
add_channel_to_graph(alice, bob, &secp_ctx, 24);
482+
}
483+
484+
let responder = Some(Responder::new(reply_path, path_id));
485+
alice.custom_message_handler.expect_message(message.clone());
486+
487+
// Alice handles the message reponse, and creates the appropriate ResponseInstruction for it.
488+
let response_instruction = alice.custom_message_handler.handle_custom_message(message, responder);
489+
490+
if !reply_path_succeed {
491+
// Simulate Alice attempting to asynchronously respond back to Bob
492+
// but failing to create a reply path.
493+
assert_eq!(
494+
alice.messenger.handle_onion_message_response(response_instruction),
495+
Err(SendError::PathNotFound),
496+
);
497+
} else {
498+
// Simulate Alice asynchronously responding back to Bob with a response.
499+
assert_eq!(
500+
alice.messenger.handle_onion_message_response(response_instruction),
501+
Ok(Some(SendSuccess::Buffered)),
502+
);
503+
504+
bob.custom_message_handler.expect_message(TestCustomMessage::ResponseB);
505+
pass_along_path(&nodes);
506+
507+
// Simulate Bob responding back to Alice through the reply path created by her.
508+
alice.custom_message_handler.expect_message(TestCustomMessage::ResponseA);
509+
nodes.reverse();
510+
pass_along_path(&nodes);
511+
}
512+
}
513+
514+
#[test]
515+
fn async_response_with_reply_path_over_one_blinded_hop() {
516+
do_test_async_response_with_reply_path_over_one_blinded_hop(true);
517+
do_test_async_response_with_reply_path_over_one_blinded_hop(false);
518+
}
519+
459520
#[test]
460521
fn too_big_packet_error() {
461522
// Make sure we error as expected if a packet is too big to send.

0 commit comments

Comments
 (0)