@@ -168,6 +168,7 @@ mod test {
168168 BaseMessageHandler , ChannelMessageHandler , Init , OnionMessageHandler ,
169169 } ;
170170 use lightning:: ln:: peer_handler:: IgnoringMessageHandler ;
171+ use lightning:: offers:: offer:: Offer ;
171172 use lightning:: onion_message:: dns_resolution:: { HumanReadableName , OMNameResolver } ;
172173 use lightning:: onion_message:: messenger:: {
173174 AOnionMessenger , Destination , MessageRouter , OnionMessagePath , OnionMessenger ,
@@ -365,55 +366,25 @@ mod test {
365366 assert ! ( resolution. 2 [ .."bitcoin:" . len( ) ] . eq_ignore_ascii_case( "bitcoin:" ) ) ;
366367 }
367368
368- #[ tokio:: test]
369- async fn end_to_end_test ( ) {
370- let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
371- let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
372- let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
373- let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
374-
375- create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
376-
377- // The DNSSEC validation will only work with the current time, so set the time on the
378- // resolver.
379- let now = SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) . unwrap ( ) . as_secs ( ) ;
380- let block = Block {
381- header : create_dummy_header ( nodes[ 0 ] . best_block_hash ( ) , now as u32 ) ,
382- txdata : Vec :: new ( ) ,
383- } ;
384- connect_block ( & nodes[ 0 ] , & block) ;
385- connect_block ( & nodes[ 1 ] , & block) ;
386-
387- let payer_id = nodes[ 0 ] . node . get_our_node_id ( ) ;
388- let payee_id = nodes[ 1 ] . node . get_our_node_id ( ) ;
389-
390- let ( resolver_messenger, resolver_id) = create_resolver ( ) ;
391- let init_msg = get_om_init ( ) ;
392- nodes[ 0 ] . onion_messenger . peer_connected ( resolver_id, & init_msg, true ) . unwrap ( ) ;
393- resolver_messenger. get_om ( ) . peer_connected ( payer_id, & init_msg, false ) . unwrap ( ) ;
394-
395- let name = HumanReadableName :: from_encoded ( "matt@mattcorallo.com" ) . unwrap ( ) ;
396-
397- // When we get the proof back, override its contents to an offer from nodes[1]
398- let bs_offer = nodes[ 1 ] . node . create_offer_builder ( None ) . unwrap ( ) . build ( ) . unwrap ( ) ;
369+ async fn pay_offer_flow < ' a , ' b , ' c > (
370+ nodes : & [ Node < ' a , ' b , ' c > ] , resolver_messenger : & impl AOnionMessenger ,
371+ resolver_id : PublicKey , payer_id : PublicKey , payee_id : PublicKey , offer : Offer ,
372+ name : HumanReadableName , amt : u64 , payment_id : PaymentId , payer_note : Option < String > ,
373+ retry : Retry , params : RouteParametersConfig , resolvers : Vec < Destination > ,
374+ ) {
375+ // Override contents to offer provided
399376 let proof_override = & nodes[ 0 ] . node . testing_dnssec_proof_offer_resolution_override ;
400- proof_override. lock ( ) . unwrap ( ) . insert ( name. clone ( ) , bs_offer. clone ( ) ) ;
401-
402- let payment_id = PaymentId ( [ 42 ; 32 ] ) ;
403- let resolvers = vec ! [ Destination :: Node ( resolver_id) ] ;
404- let retry = Retry :: Attempts ( 0 ) ;
405- let amt = 42_000 ;
406- let params = RouteParametersConfig :: default ( ) ;
377+ proof_override. lock ( ) . unwrap ( ) . insert ( name. clone ( ) , offer) ;
407378 nodes[ 0 ]
408379 . node
409380 . pay_for_offer_from_human_readable_name (
410- name. clone ( ) ,
381+ name,
411382 amt,
412383 payment_id,
413- None ,
384+ payer_note . clone ( ) ,
414385 retry,
415386 params,
416- resolvers. clone ( ) ,
387+ resolvers,
417388 )
418389 . unwrap ( ) ;
419390
@@ -457,7 +428,14 @@ mod test {
457428 nodes[ 1 ] . node . claim_funds ( our_payment_preimage) ;
458429 let payment_hash: PaymentHash = our_payment_preimage. into ( ) ;
459430 expect_payment_claimed ! ( nodes[ 1 ] , payment_hash, amt) ;
460- assert_eq ! ( payment_context. invoice_request. payer_note_truncated, None ) ;
431+ if let Some ( note) = payer_note {
432+ assert_eq ! (
433+ payment_context. invoice_request. payer_note_truncated,
434+ Some ( UntrustedString ( note. into( ) ) )
435+ ) ;
436+ } else {
437+ assert_eq ! ( payment_context. invoice_request. payer_note_truncated, None ) ;
438+ }
461439 } else {
462440 panic ! ( ) ;
463441 }
@@ -471,79 +449,76 @@ mod test {
471449 commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , updates. commitment_signed, false ) ;
472450
473451 expect_payment_sent ( & nodes[ 0 ] , our_payment_preimage, None , true , true ) ;
452+ }
474453
475- // Pay offer with payer_note
476- let proof_override = & nodes[ 0 ] . node . testing_dnssec_proof_offer_resolution_override ;
477- proof_override. lock ( ) . unwrap ( ) . insert ( name. clone ( ) , bs_offer) ;
478- nodes[ 0 ]
479- . node
480- . pay_for_offer_from_human_readable_name (
481- name,
482- amt,
483- PaymentId ( [ 21 ; 32 ] ) ,
484- Some ( "foo" . into ( ) ) ,
485- retry,
486- params,
487- resolvers,
488- )
489- . unwrap ( ) ;
454+ #[ tokio:: test]
455+ async fn end_to_end_test ( ) {
456+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
457+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
458+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
459+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
490460
491- let query = nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( resolver_id) . unwrap ( ) ;
492- resolver_messenger. get_om ( ) . handle_onion_message ( payer_id, & query) ;
461+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
493462
494- assert ! ( resolver_messenger. get_om( ) . next_onion_message_for_peer( payer_id) . is_none( ) ) ;
495- let start = Instant :: now ( ) ;
496- let response = loop {
497- tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ;
498- if let Some ( msg) = resolver_messenger. get_om ( ) . next_onion_message_for_peer ( payer_id) {
499- break msg;
500- }
501- assert ! ( start. elapsed( ) < Duration :: from_secs( 10 ) , "Resolution took too long" ) ;
463+ // The DNSSEC validation will only work with the current time, so set the time on the
464+ // resolver.
465+ let now = SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) . unwrap ( ) . as_secs ( ) ;
466+ let block = Block {
467+ header : create_dummy_header ( nodes[ 0 ] . best_block_hash ( ) , now as u32 ) ,
468+ txdata : Vec :: new ( ) ,
502469 } ;
470+ connect_block ( & nodes[ 0 ] , & block) ;
471+ connect_block ( & nodes[ 1 ] , & block) ;
503472
504- nodes[ 0 ] . onion_messenger . handle_onion_message ( resolver_id, & response) ;
505-
506- let invreq = nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( payee_id) . unwrap ( ) ;
507- nodes[ 1 ] . onion_messenger . handle_onion_message ( payer_id, & invreq) ;
473+ let payer_id = nodes[ 0 ] . node . get_our_node_id ( ) ;
474+ let payee_id = nodes[ 1 ] . node . get_our_node_id ( ) ;
508475
509- let inv = nodes[ 1 ] . onion_messenger . next_onion_message_for_peer ( payer_id) . unwrap ( ) ;
510- nodes[ 0 ] . onion_messenger . handle_onion_message ( payee_id, & inv) ;
476+ let ( resolver_messenger, resolver_id) = create_resolver ( ) ;
477+ let init_msg = get_om_init ( ) ;
478+ nodes[ 0 ] . onion_messenger . peer_connected ( resolver_id, & init_msg, true ) . unwrap ( ) ;
479+ resolver_messenger. get_om ( ) . peer_connected ( payer_id, & init_msg, false ) . unwrap ( ) ;
511480
512- check_added_monitors ( & nodes[ 0 ] , 1 ) ;
513- let updates = get_htlc_update_msgs ! ( nodes[ 0 ] , payee_id) ;
514- nodes[ 1 ] . node . handle_update_add_htlc ( payer_id, & updates. update_add_htlcs [ 0 ] ) ;
515- commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , updates. commitment_signed, false ) ;
516- expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
481+ let name = HumanReadableName :: from_encoded ( "matt@mattcorallo.com" ) . unwrap ( ) ;
517482
518- let claimable_events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
519- assert_eq ! ( claimable_events. len( ) , 1 ) ;
520- let our_payment_preimage;
521- if let Event :: PaymentClaimable { purpose, amount_msat, .. } = & claimable_events[ 0 ] {
522- assert_eq ! ( * amount_msat, amt) ;
523- if let PaymentPurpose :: Bolt12OfferPayment {
524- payment_preimage, payment_context, ..
525- } = purpose
526- {
527- our_payment_preimage = payment_preimage. unwrap ( ) ;
528- nodes[ 1 ] . node . claim_funds ( our_payment_preimage) ;
529- let payment_hash: PaymentHash = our_payment_preimage. into ( ) ;
530- expect_payment_claimed ! ( nodes[ 1 ] , payment_hash, amt) ;
531- assert_eq ! (
532- payment_context. invoice_request. payer_note_truncated,
533- Some ( UntrustedString ( "foo" . into( ) ) )
534- ) ;
535- } else {
536- panic ! ( ) ;
537- }
538- } else {
539- panic ! ( ) ;
540- }
483+ let bs_offer = nodes[ 1 ] . node . create_offer_builder ( None ) . unwrap ( ) . build ( ) . unwrap ( ) ;
484+ let resolvers = vec ! [ Destination :: Node ( resolver_id) ] ;
485+ let retry = Retry :: Attempts ( 0 ) ;
486+ let amt = 42_000 ;
487+ let params = RouteParametersConfig :: default ( ) ;
541488
542- check_added_monitors ( & nodes[ 1 ] , 1 ) ;
543- let updates = get_htlc_update_msgs ! ( nodes[ 1 ] , payer_id) ;
544- nodes[ 0 ] . node . handle_update_fulfill_htlc ( payee_id, & updates. update_fulfill_htlcs [ 0 ] ) ;
545- commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , updates. commitment_signed, false ) ;
489+ pay_offer_flow (
490+ & nodes,
491+ & resolver_messenger,
492+ resolver_id,
493+ payer_id,
494+ payee_id,
495+ bs_offer. clone ( ) ,
496+ name. clone ( ) ,
497+ amt,
498+ PaymentId ( [ 42 ; 32 ] ) ,
499+ None ,
500+ retry,
501+ params,
502+ resolvers. clone ( ) ,
503+ )
504+ . await ;
546505
547- expect_payment_sent ( & nodes[ 0 ] , our_payment_preimage, None , true , true ) ;
506+ // Pay offer with payer_note
507+ pay_offer_flow (
508+ & nodes,
509+ & resolver_messenger,
510+ resolver_id,
511+ payer_id,
512+ payee_id,
513+ bs_offer,
514+ name,
515+ amt,
516+ PaymentId ( [ 21 ; 32 ] ) ,
517+ Some ( "foo" . into ( ) ) ,
518+ retry,
519+ params,
520+ resolvers,
521+ )
522+ . await ;
548523 }
549524}
0 commit comments