+ self.keys_manager.get_node_id(Recipient::Node).unwrap()
+ }
+}
+
+#[derive(Clone)]
+struct TestCustomMessage {}
+
+const CUSTOM_MESSAGE_TYPE: u64 = 4242;
+const CUSTOM_MESSAGE_CONTENTS: [u8; 32] = [42; 32];
+
+impl CustomOnionMessageContents for TestCustomMessage {
+ fn tlv_type(&self) -> u64 {
+ CUSTOM_MESSAGE_TYPE
+ }
+}
+
+impl Writeable for TestCustomMessage {
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+ Ok(CUSTOM_MESSAGE_CONTENTS.write(w)?)
+ }
+}
+
+struct TestCustomMessageHandler {
+ num_messages_expected: AtomicU16,
+}
+
+impl TestCustomMessageHandler {
+ fn new() -> Self {
+ Self { num_messages_expected: AtomicU16::new(0) }
+ }
+}
+
+impl Drop for TestCustomMessageHandler {
+ fn drop(&mut self) {
+ #[cfg(feature = "std")] {
+ if std::thread::panicking() {
+ return;
+ }
+ }
+ assert_eq!(self.num_messages_expected.load(Ordering::SeqCst), 0);
+ }
+}
+
+impl CustomOnionMessageHandler for TestCustomMessageHandler {
+ type CustomMessage = TestCustomMessage;
+ fn handle_custom_message(&self, _msg: Self::CustomMessage) {
+ self.num_messages_expected.fetch_sub(1, Ordering::SeqCst);
+ }
+ fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, DecodeError> where Self: Sized {
+ if message_type == CUSTOM_MESSAGE_TYPE {
+ let buf = read_to_end(buffer)?;
+ assert_eq!(buf, CUSTOM_MESSAGE_CONTENTS);
+ return Ok(Some(TestCustomMessage {}))
+ }
+ Ok(None)