@@ -12,26 +12,36 @@ import LDKHeaders
12
12
import XCTest
13
13
14
14
public class HumanObjectPeerTestInstance {
15
-
16
- private let nice_close : Bool ;
17
- private let use_km_wrapper : Bool ;
18
- private let use_manual_watch : Bool ;
19
- private let reload_peers : Bool ;
20
- private let break_cross_peer_refs : Bool ;
21
- private let use_nio_peer_handler : Bool ;
22
- private let use_filter : Bool ;
23
- private let use_chan_manager_constructor : Bool ;
24
-
25
-
26
- public init ( nice_close: Bool , use_km_wrapper: Bool , use_manual_watch: Bool , reload_peers: Bool , break_cross_peer_refs: Bool , use_nio_peer_handler: Bool , use_filter: Bool , use_chan_manager_constructor: Bool ) {
27
- self . nice_close = nice_close
28
- self . use_km_wrapper = use_km_wrapper
29
- self . use_manual_watch = use_manual_watch
30
- self . reload_peers = reload_peers
31
- self . break_cross_peer_refs = break_cross_peer_refs
32
- self . use_nio_peer_handler = use_nio_peer_handler
33
- self . use_filter = use_filter
34
- self . use_chan_manager_constructor = use_chan_manager_constructor
15
+
16
+ private let configuration : Configuration
17
+
18
+ public class Configuration {
19
+ //
20
+ public var useFilter : Bool = false ;
21
+ public var useRouter : Bool = false ;
22
+ public var shouldRecipientRejectPayment : Bool = false ;
23
+
24
+ // public var nice_close: Bool = false;
25
+ // public var use_km_wrapper: Bool = false;
26
+ // public var use_manual_watch: Bool = false;
27
+ // public var reload_peers: Bool = false;
28
+ // public var break_cross_peer_refs: Bool = false;
29
+ // public var use_nio_peer_handler: Bool = false;
30
+
31
+ private class func listCustomizeableProperties( ) -> [ String ] {
32
+ return [ " useFilter " , " useRouter " , " shouldRecipientRejectPayment " ]
33
+ }
34
+
35
+ public class func combinationCount( ) -> UInt {
36
+ return 1 << self . listCustomizeableProperties ( ) . count
37
+ }
38
+
39
+ }
40
+
41
+
42
+
43
+ public init ( configuration: Configuration ) {
44
+ self . configuration = configuration
35
45
}
36
46
37
47
fileprivate class Peer {
@@ -259,15 +269,14 @@ public class HumanObjectPeerTestInstance {
259
269
260
270
self . txBroadcaster = TestBroadcaster ( master: self )
261
271
262
- if master. use_filter {
272
+ if master. configuration . useFilter {
263
273
self . filter = Option_FilterZ ( value: TestFilter ( master: self ) )
264
274
} else {
265
275
self . filter = Option_FilterZ ( value: nil )
266
276
}
267
277
268
- if master. use_manual_watch || false { // don't support manual watch yet
269
- // self.chainMonitor
270
- } else {
278
+ // never use manual watch
279
+ do {
271
280
self . chainMonitor = ChainMonitor ( chain_source: self . filter, broadcaster: self . txBroadcaster, logger: self . logger, feeest: self . feeEstimator, persister: persister)
272
281
self . chainWatch = self . chainMonitor!. as_Watch ( )
273
282
}
@@ -280,29 +289,28 @@ public class HumanObjectPeerTestInstance {
280
289
let timestamp_seconds = UInt64 ( NSDate ( ) . timeIntervalSince1970)
281
290
let timestamp_nanos = UInt32 ( truncating: NSNumber ( value: timestamp_seconds * 1000 * 1000 ) )
282
291
let keysManager = KeysManager ( seed: keySeed, starting_time_secs: timestamp_seconds, starting_time_nanos: timestamp_nanos)
292
+
293
+ self . keysInterface = keysManager. as_KeysInterface ( )
294
+ self . explicitKeysManager = keysManager
283
295
284
- if master. use_km_wrapper {
285
- // self.keysInterface = manual_
286
- } else {
287
- self . keysInterface = keysManager . as_KeysInterface ( )
288
- self . explicitKeysManager = keysManager
296
+ if master. configuration . useRouter {
297
+ let networkGraph = NetworkGraph ( genesis_hash : [ UInt8 ] ( repeating : 0 , count : 32 ) , logger : self . logger )
298
+ self . router = GossipSync . p2_p ( a : P2PGossipSync ( network_graph : networkGraph , chain_access : Option_AccessZ . none ( ) , logger : self . logger ) )
299
+ } else {
300
+ self . router = GossipSync . none ( )
289
301
}
290
-
291
- // self.router = NetGraphMsgHandlerConstructor.initNetGraphMsgHandler(networkGraph: NetworkGraph(genesis_hash: [UInt8](repeating: 0, count: 32)), chainAccess: nil, logger: self.logger)
292
- self . router = GossipSync . none ( )
293
302
}
294
303
295
304
fileprivate convenience init ( master: HumanObjectPeerTestInstance , seed: UInt8 ) {
296
305
self . init ( master: master, _dummy: ( ) , seed: seed)
297
306
298
- if master. use_chan_manager_constructor {
307
+ do {
308
+ // channel manager constructor is mandatory
299
309
300
310
let graph = NetworkGraph ( genesis_hash: [ UInt8] ( repeating: 0 , count: 32 ) , logger: self . logger)
301
311
302
312
self . constructor = ChannelManagerConstructor ( network: LDKNetwork_Bitcoin, config: UserConfig ( ) , current_blockchain_tip_hash: [ UInt8] ( repeating: 0 , count: 32 ) , current_blockchain_tip_height: 0 , keys_interface: self . keysInterface, fee_estimator: self . feeEstimator, chain_monitor: self . chainMonitor!, net_graph: graph, tx_broadcaster: self . txBroadcaster, logger: self . logger)
303
313
304
- // self.constructor = ChannelManagerConstructor(network: LDKNetwork_Bitcoin, config: UserConfig(), current_blockchain_tip_hash: [UInt8](repeating: 0, count: 32), current_blockchain_tip_height: 0, keys_interface: self.keysInterface, fee_estimator: self.feeEstimator, chain_monitor: self.chainMonitor!, net_graph: nil, tx_broadcaster: self.txBroadcaster, logger: self.logger)
305
-
306
314
let scoringParams = ProbabilisticScoringParameters ( )
307
315
let probabalisticScorer = ProbabilisticScorer ( params: scoringParams, network_graph: graph, logger: self . logger)
308
316
let score = probabalisticScorer. as_Score ( )
@@ -311,15 +319,6 @@ public class HumanObjectPeerTestInstance {
311
319
self . constructor? . chain_sync_completed ( persister: TestChannelManagerPersister ( master: self ) , scorer: multiThreadedScorer)
312
320
self . channelManager = self . constructor!. channelManager
313
321
self . peerManager = self . constructor!. peerManager
314
- } else {
315
- let chainParameters = ChainParameters ( network_arg: LDKNetwork_Bitcoin, best_block_arg: BestBlock ( block_hash: [ UInt8] ( repeating: 0 , count: 32 ) , height: 0 ) )
316
- self . channelManager = ChannelManager ( fee_est: self . feeEstimator, chain_monitor: self . chainWatch!, tx_broadcaster: self . txBroadcaster, logger: self . logger, keys_manager: self . keysInterface, config: UserConfig ( ) , params: chainParameters)
317
- let randomData = self . keysInterface. get_secure_random_bytes ( )
318
- let ignoringMessageHandler = IgnoringMessageHandler ( )
319
- let messageHandler = MessageHandler ( chan_handler_arg: self . channelManager. as_ChannelMessageHandler ( ) , route_handler_arg: self . router. getValueAsP2P ( ) !. as_RoutingMessageHandler ( ) , onion_message_handler_arg: ignoringMessageHandler. as_OnionMessageHandler ( ) )
320
- let nodeSecret = self . keysInterface. get_node_secret ( recipient: LDKRecipient_Node) . getValue ( ) !
321
- let timestampSeconds = UInt32 ( NSDate ( ) . timeIntervalSince1970)
322
- self . peerManager = PeerManager ( message_handler: messageHandler, our_node_secret: nodeSecret, current_time: timestampSeconds, ephemeral_random_data: randomData, logger: self . logger, custom_message_handler: IgnoringMessageHandler ( ) . as_CustomMessageHandler ( ) )
323
322
}
324
323
self . nodeId = self . channelManager. get_our_node_id ( )
325
324
try ! self . bindSocketHandler ( )
@@ -328,7 +327,8 @@ public class HumanObjectPeerTestInstance {
328
327
fileprivate convenience init ( original: Peer ) {
329
328
self . init ( master: original. master, _dummy: ( ) , seed: original. seed)
330
329
331
- if master. use_chan_manager_constructor {
330
+ do {
331
+ // channel manager constructor is mandatory
332
332
let graph = NetworkGraph ( genesis_hash: [ UInt8] ( repeating: 0 , count: 32 ) , logger: self . logger)
333
333
self . constructor = ChannelManagerConstructor ( network: LDKNetwork_Bitcoin, config: UserConfig ( ) , current_blockchain_tip_hash: [ UInt8] ( repeating: 0 , count: 32 ) , current_blockchain_tip_height: 0 , keys_interface: self . keysInterface, fee_estimator: self . feeEstimator, chain_monitor: self . chainMonitor!, net_graph: graph, tx_broadcaster: self . txBroadcaster, logger: self . logger)
334
334
self . constructor? . chain_sync_completed ( persister: TestChannelManagerPersister ( master: self ) , scorer: nil )
@@ -337,23 +337,12 @@ public class HumanObjectPeerTestInstance {
337
337
let events = await original. pendingEventTracker. getEvents ( )
338
338
await self . pendingEventTracker. addEvents ( events: events)
339
339
}
340
- } else {
341
- var monitors : [ ChannelMonitor ] = [ ]
342
- var nativeMonitors : [ LDKChannelMonitor ] = [ ]
343
- // let serialized = original.monitors[0].wr
344
- let serializedManager = original. channelManager. write ( )
345
- let managerResult = UtilMethods . constructor_BlockHashChannelManagerZ_read ( ser: serializedManager, arg_keys_manager: self . keysInterface, arg_fee_estimator: self . feeEstimator, arg_chain_monitor: self . chainWatch!, arg_tx_broadcaster: self . txBroadcaster, arg_logger: self . logger, arg_default_config: UserConfig ( ) , arg_channel_monitors: nativeMonitors)
346
- assert ( managerResult. isOk ( ) )
347
- managerResult. getValue ( ) !
348
340
}
349
341
self . nodeId = self . channelManager. get_our_node_id ( )
350
342
try ! self . bindSocketHandler ( )
351
343
}
352
344
353
345
private func bindSocketHandler( ) throws {
354
- if !self . master. use_nio_peer_handler {
355
- return
356
- }
357
346
self . tcpSocketHandler = self . constructor!. getTCPPeerHandler ( )
358
347
print ( " Attempting to bind socket… " )
359
348
for i in 10000 ... 65535 {
@@ -378,16 +367,15 @@ public class HumanObjectPeerTestInstance {
378
367
}
379
368
380
369
fileprivate func getManagerEvents( expectedCount: UInt ) async throws -> [ Event ] {
381
- guard self . master. use_chan_manager_constructor else {
382
- throw ChannelManagerEventError . notUsingChannelManagerConstructor
383
- }
384
370
while true {
385
371
if await self . pendingEventTracker. getCount ( ) >= expectedCount {
386
372
print ( " Found enough events for expected count of \( expectedCount) " )
387
373
let events = await self . pendingEventTracker. getAndClearEvents ( )
388
374
print ( " Found event count: \( events. count) " )
389
375
return events
390
376
}
377
+ // sleep for 0.1 seconds
378
+ // try await Task.sleep(nanoseconds: 0_100_000_000)
391
379
await self . pendingEventTracker. awaitAddition ( )
392
380
}
393
381
}
@@ -438,12 +426,10 @@ public class HumanObjectPeerTestInstance {
438
426
439
427
440
428
fileprivate func connectPeers( peerA: Peer , peerB: Peer ) {
441
- if self . use_nio_peer_handler {
442
- let connectionResult = peerA. tcpSocketHandler? . connect ( address: " 127.0.0.1 " , port: peerB. tcpPort!, theirNodeId: peerB. nodeId!)
443
- print ( " connection result: \( connectionResult) " )
444
- } else {
445
- // not currently relevant; we need the TCP connection simulation
446
- }
429
+
430
+ let connectionResult = peerA. tcpSocketHandler? . connect ( address: " 127.0.0.1 " , port: peerB. tcpPort!, theirNodeId: peerB. nodeId!)
431
+ print ( " connection result: \( connectionResult) " )
432
+
447
433
}
448
434
449
435
func test_multiple_peer_connections( ) async {
@@ -493,7 +479,7 @@ public class HumanObjectPeerTestInstance {
493
479
}
494
480
}
495
481
496
- func do_test_message_handler ( ) async {
482
+ func testMessageHandling ( ) async {
497
483
498
484
let FUNDING_SATOSHI_AMOUNT : UInt64 = 100_000 // 100k satoshis
499
485
let SEND_MSAT_AMOUNT_A_TO_B : UInt64 = 10_000_000 // 10k satoshis
@@ -671,11 +657,42 @@ public class HumanObjectPeerTestInstance {
671
657
let invoicePayment = paymentPurpose. getValueAsInvoicePayment ( ) !
672
658
let preimage = invoicePayment. getPayment_preimage ( )
673
659
let secret = invoicePayment. getPayment_secret ( )
674
- peer2. channelManager. claim_funds ( payment_preimage: preimage)
675
- print ( " claimed payment with secret \( secret) using preimage \( preimage) " )
660
+ if self . configuration. shouldRecipientRejectPayment {
661
+ print ( " about to fail payment because shouldRecipientRejectPayment flag is set " )
662
+ peer2. channelManager. fail_htlc_backwards ( payment_hash: paymentHash)
663
+ print ( " deliberately failed payment with hash \( paymentHash) " )
664
+ for _ in 0 ..< 10 {
665
+ // this may have a random delay, run it repeatedly
666
+ peer2. channelManager. process_pending_htlc_forwards ( )
667
+ try ! await Task . sleep ( nanoseconds: 0_100_000_000 )
668
+ }
669
+ } else {
670
+ peer2. channelManager. claim_funds ( payment_preimage: preimage)
671
+ print ( " claimed payment with secret \( secret) using preimage \( preimage) " )
672
+ }
676
673
}
677
674
678
- do {
675
+ if self . configuration. shouldRecipientRejectPayment {
676
+ let peer1Events = try ! await peer1. getManagerEvents ( expectedCount: 1 )
677
+ let paymentPathFailedEvent = peer1Events [ 0 ]
678
+ guard case . PaymentPathFailed = paymentPathFailedEvent. getValueType ( ) else {
679
+ return XCTAssert ( false , " Expected .PaymentPathFailed, got \( paymentPathFailedEvent. getValueType ( ) ) " )
680
+ }
681
+ let paymentPathFailed = paymentPathFailedEvent. getValueAsPaymentPathFailed ( ) !
682
+ let failureDescriptor : [ String : Any ] = [
683
+ " payment_id " : paymentPathFailed. getPayment_id ( ) ,
684
+ " payment_hash " : paymentPathFailed. getPayment_hash ( ) ,
685
+ " payment_failed_permanently " : paymentPathFailed. getPayment_failed_permanently ( ) ,
686
+ " short_channel_id " : paymentPathFailed. getShort_channel_id ( ) ,
687
+ " path " : paymentPathFailed. getPath ( ) . map { $0. get_short_channel_id ( ) } ,
688
+ " network_update " : paymentPathFailed. getNetwork_update ( ) . getValue ( ) . debugDescription
689
+ ]
690
+
691
+ print ( " payent path failure: \( failureDescriptor) " )
692
+ print ( " here " )
693
+ return
694
+
695
+ } else {
679
696
// process payment
680
697
let peer1Events = try ! await peer1. getManagerEvents ( expectedCount: 2 )
681
698
let paymentSentEvent = peer1Events [ 0 ]
0 commit comments