+ self.keys_manager.get_node_id(Recipient::Node).unwrap()
+ }
+}
+
+struct TestMessageRouter {}
+
+impl MessageRouter for TestMessageRouter {
+ fn find_path(
+ &self, _sender: PublicKey, _peers: Vec<PublicKey>, destination: Destination
+ ) -> Result<OnionMessagePath, ()> {
+ Ok(OnionMessagePath {
+ intermediate_nodes: vec![],
+ destination,
+ })
+ }
+}
+
+struct TestOffersMessageHandler {}
+
+impl OffersMessageHandler for TestOffersMessageHandler {
+ fn handle_message(&self, _message: OffersMessage) -> Option<OffersMessage> {
+ None
+ }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+enum TestCustomMessage {
+ Request,
+ Response,
+}
+
+const CUSTOM_REQUEST_MESSAGE_TYPE: u64 = 4242;
+const CUSTOM_RESPONSE_MESSAGE_TYPE: u64 = 4343;
+const CUSTOM_REQUEST_MESSAGE_CONTENTS: [u8; 32] = [42; 32];
+const CUSTOM_RESPONSE_MESSAGE_CONTENTS: [u8; 32] = [43; 32];
+
+impl CustomOnionMessageContents for TestCustomMessage {
+ fn tlv_type(&self) -> u64 {
+ match self {
+ TestCustomMessage::Request => CUSTOM_REQUEST_MESSAGE_TYPE,
+ TestCustomMessage::Response => CUSTOM_RESPONSE_MESSAGE_TYPE,
+ }
+ }
+}
+
+impl Writeable for TestCustomMessage {
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+ match self {
+ TestCustomMessage::Request => Ok(CUSTOM_REQUEST_MESSAGE_CONTENTS.write(w)?),
+ TestCustomMessage::Response => Ok(CUSTOM_RESPONSE_MESSAGE_CONTENTS.write(w)?),
+ }
+ }
+}
+
+struct TestCustomMessageHandler {
+ expected_messages: Mutex<VecDeque<TestCustomMessage>>,
+}
+
+impl TestCustomMessageHandler {
+ fn new() -> Self {
+ Self { expected_messages: Mutex::new(VecDeque::new()) }
+ }
+
+ fn expect_message(&self, message: TestCustomMessage) {
+ self.expected_messages.lock().unwrap().push_back(message);
+ }
+}
+
+impl Drop for TestCustomMessageHandler {
+ fn drop(&mut self) {
+ #[cfg(feature = "std")] {
+ if std::thread::panicking() {
+ return;
+ }
+ }
+ assert!(self.expected_messages.lock().unwrap().is_empty());
+ }
+}
+
+impl CustomOnionMessageHandler for TestCustomMessageHandler {
+ type CustomMessage = TestCustomMessage;
+ fn handle_custom_message(&self, msg: Self::CustomMessage) -> Option<Self::CustomMessage> {
+ match self.expected_messages.lock().unwrap().pop_front() {
+ Some(expected_msg) => assert_eq!(expected_msg, msg),
+ None => panic!("Unexpected message: {:?}", msg),
+ }
+
+ match msg {
+ TestCustomMessage::Request => Some(TestCustomMessage::Response),
+ TestCustomMessage::Response => None,
+ }
+ }
+ fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, DecodeError> where Self: Sized {
+ match message_type {
+ CUSTOM_REQUEST_MESSAGE_TYPE => {
+ let buf = read_to_end(buffer)?;
+ assert_eq!(buf, CUSTOM_REQUEST_MESSAGE_CONTENTS);
+ Ok(Some(TestCustomMessage::Request))
+ },
+ CUSTOM_RESPONSE_MESSAGE_TYPE => {
+ let buf = read_to_end(buffer)?;
+ assert_eq!(buf, CUSTOM_RESPONSE_MESSAGE_CONTENTS);
+ Ok(Some(TestCustomMessage::Response))
+ },
+ _ => Ok(None),
+ }