@@ -87,7 +87,12 @@ fn params_from_invoice(
87
87
#[ cfg( test) ]
88
88
mod tests {
89
89
use super :: * ;
90
- use crate :: routing:: router:: Payee ;
90
+ use crate :: events:: Event ;
91
+ use crate :: ln:: channelmanager:: { PaymentId , Retry } ;
92
+ use crate :: ln:: functional_test_utils:: * ;
93
+ use crate :: ln:: msgs:: ChannelMessageHandler ;
94
+ use crate :: ln:: outbound_payment:: Bolt11PaymentError ;
95
+ use crate :: routing:: router:: { Payee , RouteParametersConfig } ;
91
96
use crate :: sign:: { NodeSigner , Recipient } ;
92
97
use crate :: types:: payment:: PaymentSecret ;
93
98
use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
@@ -160,12 +165,7 @@ mod tests {
160
165
}
161
166
162
167
#[ test]
163
- fn payment_metadata_end_to_end ( ) {
164
- use crate :: events:: Event ;
165
- use crate :: ln:: channelmanager:: { PaymentId , Retry } ;
166
- use crate :: ln:: functional_test_utils:: * ;
167
- use crate :: ln:: msgs:: ChannelMessageHandler ;
168
-
168
+ fn payment_metadata_end_to_end_for_invoice_with_amount ( ) {
169
169
// Test that a payment metadata read from an invoice passed to `pay_invoice` makes it all
170
170
// the way out through the `PaymentClaimable` event.
171
171
let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
@@ -194,11 +194,96 @@ mod tests {
194
194
let invoice = invoice. sign :: < _ , ( ) > ( |_| Ok ( sig) ) . unwrap ( ) ;
195
195
let invoice = Bolt11Invoice :: from_signed ( invoice) . unwrap ( ) ;
196
196
197
- let ( hash, onion, params) = payment_parameters_from_invoice ( & invoice) . unwrap ( ) ;
197
+ match nodes[ 0 ] . node . pay_for_bolt11_invoice (
198
+ & invoice,
199
+ PaymentId ( payment_hash. 0 ) ,
200
+ Some ( 100 ) ,
201
+ RouteParametersConfig :: default ( ) ,
202
+ Retry :: Attempts ( 0 ) ,
203
+ ) {
204
+ Err ( Bolt11PaymentError :: InvalidAmount ) => ( ) ,
205
+ _ => panic ! ( "Unexpected result" ) ,
206
+ } ;
207
+
208
+ nodes[ 0 ]
209
+ . node
210
+ . pay_for_bolt11_invoice (
211
+ & invoice,
212
+ PaymentId ( payment_hash. 0 ) ,
213
+ None ,
214
+ RouteParametersConfig :: default ( ) ,
215
+ Retry :: Attempts ( 0 ) ,
216
+ )
217
+ . unwrap ( ) ;
218
+
219
+ check_added_monitors ( & nodes[ 0 ] , 1 ) ;
220
+ let send_event = SendEvent :: from_node ( & nodes[ 0 ] ) ;
221
+ nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & send_event. msgs [ 0 ] ) ;
222
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , & send_event. commitment_msg, false ) ;
223
+
224
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
225
+
226
+ let mut events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
227
+ assert_eq ! ( events. len( ) , 1 ) ;
228
+ match events. pop ( ) . unwrap ( ) {
229
+ Event :: PaymentClaimable { onion_fields, .. } => {
230
+ assert_eq ! ( Some ( payment_metadata) , onion_fields. unwrap( ) . payment_metadata) ;
231
+ } ,
232
+ _ => panic ! ( "Unexpected event" ) ,
233
+ }
234
+ }
235
+
236
+ #[ test]
237
+ fn payment_metadata_end_to_end_for_invoice_with_no_amount ( ) {
238
+ // Test that a payment metadata read from an invoice passed to `pay_invoice` makes it all
239
+ // the way out through the `PaymentClaimable` event.
240
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
241
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
242
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
243
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
244
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
245
+
246
+ let payment_metadata = vec ! [ 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 42 ] ;
247
+
248
+ let ( payment_hash, payment_secret) =
249
+ nodes[ 1 ] . node . create_inbound_payment ( None , 7200 , None ) . unwrap ( ) ;
250
+
251
+ let timestamp = SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) . unwrap ( ) ;
252
+ let invoice = InvoiceBuilder :: new ( Currency :: Bitcoin )
253
+ . description ( "test" . into ( ) )
254
+ . payment_hash ( Sha256 :: from_slice ( & payment_hash. 0 ) . unwrap ( ) )
255
+ . payment_secret ( payment_secret)
256
+ . duration_since_epoch ( timestamp)
257
+ . min_final_cltv_expiry_delta ( 144 )
258
+ . payment_metadata ( payment_metadata. clone ( ) )
259
+ . build_raw ( )
260
+ . unwrap ( ) ;
261
+ let sig = nodes[ 1 ] . keys_manager . backing . sign_invoice ( & invoice, Recipient :: Node ) . unwrap ( ) ;
262
+ let invoice = invoice. sign :: < _ , ( ) > ( |_| Ok ( sig) ) . unwrap ( ) ;
263
+ let invoice = Bolt11Invoice :: from_signed ( invoice) . unwrap ( ) ;
264
+
265
+ match nodes[ 0 ] . node . pay_for_bolt11_invoice (
266
+ & invoice,
267
+ PaymentId ( payment_hash. 0 ) ,
268
+ None ,
269
+ RouteParametersConfig :: default ( ) ,
270
+ Retry :: Attempts ( 0 ) ,
271
+ ) {
272
+ Err ( Bolt11PaymentError :: InvalidAmount ) => ( ) ,
273
+ _ => panic ! ( "Unexpected result" ) ,
274
+ } ;
275
+
198
276
nodes[ 0 ]
199
277
. node
200
- . send_payment ( hash, onion, PaymentId ( hash. 0 ) , params, Retry :: Attempts ( 0 ) )
278
+ . pay_for_bolt11_invoice (
279
+ & invoice,
280
+ PaymentId ( payment_hash. 0 ) ,
281
+ Some ( 50_000 ) ,
282
+ RouteParametersConfig :: default ( ) ,
283
+ Retry :: Attempts ( 0 ) ,
284
+ )
201
285
. unwrap ( ) ;
286
+
202
287
check_added_monitors ( & nodes[ 0 ] , 1 ) ;
203
288
let send_event = SendEvent :: from_node ( & nodes[ 0 ] ) ;
204
289
nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & send_event. msgs [ 0 ] ) ;
0 commit comments