@@ -27,7 +27,7 @@ use crate::ln::outbound_payment::{
27
27
PendingOutboundPayment , Retry , TEST_ASYNC_PAYMENT_TIMEOUT_RELATIVE_EXPIRY ,
28
28
} ;
29
29
use crate :: offers:: async_receive_offer_cache:: {
30
- TEST_MAX_CACHED_OFFERS_TARGET , TEST_MAX_UPDATE_ATTEMPTS ,
30
+ TEST_INVOICE_REFRESH_THRESHOLD , TEST_MAX_CACHED_OFFERS_TARGET , TEST_MAX_UPDATE_ATTEMPTS ,
31
31
TEST_MIN_OFFER_PATHS_RELATIVE_EXPIRY_SECS , TEST_OFFER_REFRESH_THRESHOLD ,
32
32
} ;
33
33
use crate :: offers:: flow:: {
@@ -1679,11 +1679,53 @@ fn offer_cache_round_trip_ser() {
1679
1679
assert_eq ! ( cached_offers_pre_ser, cached_offers_post_ser) ;
1680
1680
}
1681
1681
1682
+ #[ test]
1683
+ fn refresh_static_invoices_for_pending_offers ( ) {
1684
+ // Check that an invoice for an offer that is pending persistence with the server will be updated
1685
+ // every timer tick.
1686
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
1687
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
1688
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None , None ] ) ;
1689
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
1690
+ create_unannounced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
1691
+ let server = & nodes[ 0 ] ;
1692
+ let recipient = & nodes[ 1 ] ;
1693
+
1694
+ let recipient_id = vec ! [ 42 ; 32 ] ;
1695
+ let inv_server_paths =
1696
+ server. node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
1697
+ recipient. node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1698
+ expect_offer_paths_requests ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] ) ;
1699
+
1700
+ // Set up the recipient to have one offer pending with the static invoice server.
1701
+ invoice_flow_up_to_send_serve_static_invoice ( server, recipient) ;
1702
+
1703
+ // Every timer tick, we'll send a fresh invoice to the server.
1704
+ for _ in 0 ..10 {
1705
+ recipient. node . timer_tick_occurred ( ) ;
1706
+ let pending_oms = recipient. onion_messenger . release_pending_msgs ( ) ;
1707
+ pending_oms
1708
+ . get ( & server. node . get_our_node_id ( ) )
1709
+ . unwrap ( )
1710
+ . iter ( )
1711
+ . find ( |msg| match server. onion_messenger . peel_onion_message ( & msg) . unwrap ( ) {
1712
+ PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: ServeStaticInvoice ( _) , _, _) => {
1713
+ true
1714
+ } ,
1715
+ PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: OfferPathsRequest ( _) , _, _) => {
1716
+ false
1717
+ } ,
1718
+ _ => panic ! ( "Unexpected message" ) ,
1719
+ } )
1720
+ . unwrap ( ) ;
1721
+ }
1722
+ }
1723
+
1682
1724
#[ cfg_attr( feature = "std" , ignore) ]
1683
1725
#[ test]
1684
- fn refresh_static_invoices ( ) {
1685
- // Check that an invoice for a particular offer stored with the server will be updated once per
1686
- // timer tick .
1726
+ fn refresh_static_invoices_for_used_offers ( ) {
1727
+ // Check that an invoice for a used offer stored with the server will be updated every
1728
+ // INVOICE_REFRESH_THRESHOLD .
1687
1729
let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
1688
1730
let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
1689
1731
@@ -1708,25 +1750,26 @@ fn refresh_static_invoices() {
1708
1750
// Set up the recipient to have one offer and an invoice with the static invoice server.
1709
1751
let flow_res = pass_static_invoice_server_messages ( server, recipient, recipient_id. clone ( ) ) ;
1710
1752
let original_invoice = flow_res. invoice ;
1711
- // Mark the offer as used so we'll update the invoice on timer tick .
1753
+ // Mark the offer as used so we'll update the invoice after INVOICE_REFRESH_THRESHOLD .
1712
1754
let _offer = recipient. node . get_async_receive_offer ( ) . unwrap ( ) ;
1713
1755
1714
1756
// Force the server and recipient to send OMs directly to each other for testing simplicity.
1715
1757
server. message_router . peers_override . lock ( ) . unwrap ( ) . push ( recipient. node . get_our_node_id ( ) ) ;
1716
1758
recipient. message_router . peers_override . lock ( ) . unwrap ( ) . push ( server. node . get_our_node_id ( ) ) ;
1717
1759
1718
- assert ! ( recipient
1719
- . onion_messenger
1720
- . next_onion_message_for_peer ( server . node. get_our_node_id ( ) )
1721
- . is_none ( ) ) ;
1760
+ // Prior to INVOICE_REFRESH_THRESHOLD, we won't refresh the invoice.
1761
+ advance_time_by ( TEST_INVOICE_REFRESH_THRESHOLD , recipient ) ;
1762
+ recipient . node . timer_tick_occurred ( ) ;
1763
+ expect_offer_paths_requests ( & nodes [ 2 ] , & [ & nodes [ 0 ] , & nodes [ 1 ] ] ) ;
1722
1764
1723
- // Check that we'll refresh the invoice on the next timer tick.
1765
+ // After INVOICE_REFRESH_THRESHOLD, we will refresh the invoice.
1766
+ advance_time_by ( Duration :: from_secs ( 1 ) , recipient) ;
1724
1767
recipient. node . timer_tick_occurred ( ) ;
1725
1768
let pending_oms = recipient. onion_messenger . release_pending_msgs ( ) ;
1726
1769
let serve_static_invoice_om = pending_oms
1727
1770
. get ( & server. node . get_our_node_id ( ) )
1728
1771
. unwrap ( )
1729
- . into_iter ( )
1772
+ . iter ( )
1730
1773
. find ( |msg| match server. onion_messenger . peel_onion_message ( & msg) . unwrap ( ) {
1731
1774
PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: ServeStaticInvoice ( _) , _, _) => true ,
1732
1775
PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: OfferPathsRequest ( _) , _, _) => false ,
0 commit comments