@@ -28,7 +28,7 @@ use crate::ln::outbound_payment::{
28
28
PendingOutboundPayment , Retry , TEST_ASYNC_PAYMENT_TIMEOUT_RELATIVE_EXPIRY ,
29
29
} ;
30
30
use crate :: offers:: async_receive_offer_cache:: {
31
- TEST_MAX_CACHED_OFFERS_TARGET , TEST_MAX_UPDATE_ATTEMPTS ,
31
+ TEST_INVOICE_REFRESH_THRESHOLD , TEST_MAX_CACHED_OFFERS_TARGET , TEST_MAX_UPDATE_ATTEMPTS ,
32
32
TEST_MIN_OFFER_PATHS_RELATIVE_EXPIRY_SECS , TEST_OFFER_REFRESH_THRESHOLD ,
33
33
} ;
34
34
use crate :: offers:: flow:: {
@@ -1715,11 +1715,53 @@ fn offer_cache_round_trip_ser() {
1715
1715
assert_eq ! ( cached_offers_pre_ser, cached_offers_post_ser) ;
1716
1716
}
1717
1717
1718
+ #[ test]
1719
+ fn refresh_static_invoices_for_pending_offers ( ) {
1720
+ // Check that an invoice for an offer that is pending persistence with the server will be updated
1721
+ // every timer tick.
1722
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
1723
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
1724
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None , None ] ) ;
1725
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
1726
+ create_unannounced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
1727
+ let server = & nodes[ 0 ] ;
1728
+ let recipient = & nodes[ 1 ] ;
1729
+
1730
+ let recipient_id = vec ! [ 42 ; 32 ] ;
1731
+ let inv_server_paths =
1732
+ server. node . blinded_paths_for_async_recipient ( recipient_id. clone ( ) , None ) . unwrap ( ) ;
1733
+ recipient. node . set_paths_to_static_invoice_server ( inv_server_paths) . unwrap ( ) ;
1734
+ expect_offer_paths_requests ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] ) ;
1735
+
1736
+ // Set up the recipient to have one offer pending with the static invoice server.
1737
+ invoice_flow_up_to_send_serve_static_invoice ( server, recipient) ;
1738
+
1739
+ // Every timer tick, we'll send a fresh invoice to the server.
1740
+ for _ in 0 ..10 {
1741
+ recipient. node . timer_tick_occurred ( ) ;
1742
+ let pending_oms = recipient. onion_messenger . release_pending_msgs ( ) ;
1743
+ pending_oms
1744
+ . get ( & server. node . get_our_node_id ( ) )
1745
+ . unwrap ( )
1746
+ . iter ( )
1747
+ . find ( |msg| match server. onion_messenger . peel_onion_message ( & msg) . unwrap ( ) {
1748
+ PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: ServeStaticInvoice ( _) , _, _) => {
1749
+ true
1750
+ } ,
1751
+ PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: OfferPathsRequest ( _) , _, _) => {
1752
+ false
1753
+ } ,
1754
+ _ => panic ! ( "Unexpected message" ) ,
1755
+ } )
1756
+ . unwrap ( ) ;
1757
+ }
1758
+ }
1759
+
1718
1760
#[ cfg_attr( feature = "std" , ignore) ]
1719
1761
#[ test]
1720
- fn refresh_static_invoices ( ) {
1721
- // Check that an invoice for a particular offer stored with the server will be updated once per
1722
- // timer tick .
1762
+ fn refresh_static_invoices_for_used_offers ( ) {
1763
+ // Check that an invoice for a used offer stored with the server will be updated every
1764
+ // INVOICE_REFRESH_THRESHOLD .
1723
1765
let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
1724
1766
let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
1725
1767
@@ -1744,25 +1786,26 @@ fn refresh_static_invoices() {
1744
1786
// Set up the recipient to have one offer and an invoice with the static invoice server.
1745
1787
let flow_res = pass_static_invoice_server_messages ( server, recipient, recipient_id. clone ( ) ) ;
1746
1788
let original_invoice = flow_res. invoice ;
1747
- // Mark the offer as used so we'll update the invoice on timer tick .
1789
+ // Mark the offer as used so we'll update the invoice after INVOICE_REFRESH_THRESHOLD .
1748
1790
let _offer = recipient. node . get_async_receive_offer ( ) . unwrap ( ) ;
1749
1791
1750
1792
// Force the server and recipient to send OMs directly to each other for testing simplicity.
1751
1793
server. message_router . peers_override . lock ( ) . unwrap ( ) . push ( recipient. node . get_our_node_id ( ) ) ;
1752
1794
recipient. message_router . peers_override . lock ( ) . unwrap ( ) . push ( server. node . get_our_node_id ( ) ) ;
1753
1795
1754
- assert ! ( recipient
1755
- . onion_messenger
1756
- . next_onion_message_for_peer ( server . node. get_our_node_id ( ) )
1757
- . is_none ( ) ) ;
1796
+ // Prior to INVOICE_REFRESH_THRESHOLD, we won't refresh the invoice.
1797
+ advance_time_by ( TEST_INVOICE_REFRESH_THRESHOLD , recipient ) ;
1798
+ recipient . node . timer_tick_occurred ( ) ;
1799
+ expect_offer_paths_requests ( & nodes [ 2 ] , & [ & nodes [ 0 ] , & nodes [ 1 ] ] ) ;
1758
1800
1759
- // Check that we'll refresh the invoice on the next timer tick.
1801
+ // After INVOICE_REFRESH_THRESHOLD, we will refresh the invoice.
1802
+ advance_time_by ( Duration :: from_secs ( 1 ) , recipient) ;
1760
1803
recipient. node . timer_tick_occurred ( ) ;
1761
1804
let pending_oms = recipient. onion_messenger . release_pending_msgs ( ) ;
1762
1805
let serve_static_invoice_om = pending_oms
1763
1806
. get ( & server. node . get_our_node_id ( ) )
1764
1807
. unwrap ( )
1765
- . into_iter ( )
1808
+ . iter ( )
1766
1809
. find ( |msg| match server. onion_messenger . peel_onion_message ( & msg) . unwrap ( ) {
1767
1810
PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: ServeStaticInvoice ( _) , _, _) => true ,
1768
1811
PeeledOnion :: AsyncPayments ( AsyncPaymentsMessage :: OfferPathsRequest ( _) , _, _) => false ,
0 commit comments