Skip to content

Commit ba08b08

Browse files
committed
Fix MultiThreadedScorer deallocation bug and unit tests.
1 parent dff9d6c commit ba08b08

File tree

2 files changed

+68
-31
lines changed

2 files changed

+68
-31
lines changed

ci/LDKSwift/Sources/LDKSwift/batteries/ChannelManagerConstructor.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
224224
if let netGraph = self.net_graph, let scorer = self.scorer {
225225
let router = DefaultRouter(network_graph: netGraph, logger: self.logger, random_seed_bytes: self.keysInterface.get_secure_random_bytes())
226226
// either dangle router, or set is_owned to false
227+
scorer.cOpaqueStruct!.is_owned = false
227228
router.cOpaqueStruct!.is_owned = false
228229
self.payer = InvoicePayer(payer: self.channelManager.as_Payer(), router: router.as_Router(), scorer: scorer, logger: self.logger, event_handler: self.customEventHandler!, retry: Retry.attempts(a: 3))
229230
router.cOpaqueStruct!.is_owned = true

ci/LDKSwift/Tests/LDKSwiftTests/HumanObjectPeerTestInstance.swift

Lines changed: 67 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ public class HumanObjectPeerTestInstance {
5959
case failedToBindSocket
6060
}
6161

62+
fileprivate enum ChannelManagerEventError: Error {
63+
case notUsingChannelManagerConstructor
64+
}
65+
6266
fileprivate actor PendingEventTracker {
6367

6468
private(set) var pendingManagerEvents: [Event] = []
@@ -357,17 +361,19 @@ public class HumanObjectPeerTestInstance {
357361

358362
}
359363

360-
fileprivate func getManagerEvents(expectedCount: UInt) async -> [Event] {
361-
var response = [Event]();
362-
if self.master.use_chan_manager_constructor {
363-
while true {
364-
if await self.pendingEventTracker.getCount() >= expectedCount {
365-
return await self.pendingEventTracker.getAndClearEvents()
366-
}
367-
await self.pendingEventTracker.awaitAddition()
364+
fileprivate func getManagerEvents(expectedCount: UInt) async throws -> [Event] {
365+
guard self.master.use_chan_manager_constructor else {
366+
throw ChannelManagerEventError.notUsingChannelManagerConstructor
367+
}
368+
while true {
369+
if await self.pendingEventTracker.getCount() >= expectedCount {
370+
print("Found enough events for expected count of \(expectedCount)")
371+
let events = await self.pendingEventTracker.getAndClearEvents()
372+
print("Found event count: \(events.count)")
373+
return events
368374
}
375+
await self.pendingEventTracker.awaitAddition()
369376
}
370-
return response
371377
}
372378

373379
fileprivate func getPendingBroadcasts(expectedCount: UInt) async -> Set<[UInt8]> {
@@ -511,11 +517,13 @@ public class HumanObjectPeerTestInstance {
511517
XCTAssertNil(fundingTxo)
512518
}
513519

514-
let managerEvents = await peer1.getManagerEvents(expectedCount: 1)
520+
let managerEvents = try! await peer1.getManagerEvents(expectedCount: 1)
515521
XCTAssertEqual(managerEvents.count, 1)
516522

517523
let managerEvent = managerEvents[0]
518-
XCTAssertEqual(managerEvent.getValueType(), .FundingGenerationReady)
524+
guard case .FundingGenerationReady = managerEvent.getValueType() else {
525+
return XCTAssert(false, "Expected .FundingGenerationReady, got \(managerEvent.getValueType())")
526+
}
519527

520528
let fundingReadyEvent = managerEvent.getValueAsFundingGenerationReady()!
521529
XCTAssertEqual(fundingReadyEvent.getChannel_value_satoshis(), FUNDING_SATOSHI_AMOUNT)
@@ -612,13 +620,17 @@ public class HumanObjectPeerTestInstance {
612620
let recreatedInvoice = Invoice.from_str(s: invoice.to_str())
613621
XCTAssertTrue(recreatedInvoice.isOk())
614622

615-
let invoicePaymentResult = peer1.constructor!.payer!.pay_invoice(invoice: invoice)
623+
let channelManagerConstructor = peer1.constructor!
624+
let invoicePayer = channelManagerConstructor.payer!
625+
let invoicePaymentResult = invoicePayer.pay_invoice(invoice: invoice)
616626
XCTAssertTrue(invoicePaymentResult.isOk())
617627

618628
do {
619629
// process HTLCs
620-
let peer2Event = await peer2.getManagerEvents(expectedCount: 1)[0]
621-
XCTAssertEqual(peer2Event.getValueType(), .PendingHTLCsForwardable)
630+
let peer2Event = try! await peer2.getManagerEvents(expectedCount: 1)[0]
631+
guard case .PendingHTLCsForwardable = peer2Event.getValueType() else {
632+
return XCTAssert(false, "Expected .PendingHTLCsForwardable, got \(peer2Event.getValueType())")
633+
}
622634
let pendingHTLCsForwardable = peer2Event.getValueAsPendingHTLCsForwardable()!
623635
print("forwardable time: \(pendingHTLCsForwardable.getTime_forwardable())")
624636
peer2.channelManager.process_pending_htlc_forwards()
@@ -627,13 +639,17 @@ public class HumanObjectPeerTestInstance {
627639

628640
do {
629641
// process payment
630-
let peer2Event = await peer2.getManagerEvents(expectedCount: 1)[0]
631-
XCTAssertEqual(peer2Event.getValueType(), .PaymentReceived)
642+
let peer2Event = try! await peer2.getManagerEvents(expectedCount: 1)[0]
643+
guard case .PaymentReceived = peer2Event.getValueType() else {
644+
return XCTAssert(false, "Expected .PaymentReceived, got \(peer2Event.getValueType())")
645+
}
632646
let paymentReceived = peer2Event.getValueAsPaymentReceived()!
633647
let paymentHash = paymentReceived.getPayment_hash()
634648
print("received payment of \(paymentReceived.getAmount_msat()) with hash \(paymentHash)")
635649
let paymentPurpose = paymentReceived.getPurpose()
636-
XCTAssertEqual(paymentPurpose.getValueType(), .InvoicePayment)
650+
guard case .InvoicePayment = paymentPurpose.getValueType() else {
651+
return XCTAssert(false, "Expected .InvoicePayment, got \(paymentPurpose.getValueType())")
652+
}
637653
let invoicePayment = paymentPurpose.getValueAsInvoicePayment()!
638654
let preimage = invoicePayment.getPayment_preimage()
639655
let secret = invoicePayment.getPayment_secret()
@@ -643,11 +659,15 @@ public class HumanObjectPeerTestInstance {
643659

644660
do {
645661
// process payment
646-
let peer1Events = await peer1.getManagerEvents(expectedCount: 2)
662+
let peer1Events = try! await peer1.getManagerEvents(expectedCount: 2)
647663
let paymentSentEvent = peer1Events[0]
648664
let paymentPathSuccessfulEvent = peer1Events[1]
649-
XCTAssertEqual(paymentSentEvent.getValueType(), .PaymentSent)
650-
XCTAssertEqual(paymentPathSuccessfulEvent.getValueType(), .PaymentPathSuccessful)
665+
guard case .PaymentSent = paymentSentEvent.getValueType() else {
666+
return XCTAssert(false, "Expected .PaymentSent, got \(paymentSentEvent.getValueType())")
667+
}
668+
guard case .PaymentPathSuccessful = paymentPathSuccessfulEvent.getValueType() else {
669+
return XCTAssert(false, "Expected .PaymentPathSuccessful, got \(paymentPathSuccessfulEvent.getValueType())")
670+
}
651671
let paymentSent = paymentSentEvent.getValueAsPaymentSent()!
652672
let paymentPathSuccessful = paymentPathSuccessfulEvent.getValueAsPaymentPathSuccessful()!
653673
print("sent payment \(paymentSent.getPayment_id()) with fee \(paymentSent.getFee_paid_msat().getValue()) via \(paymentPathSuccessful.getPath().map { h in h.get_short_channel_id() })")
@@ -699,8 +719,10 @@ public class HumanObjectPeerTestInstance {
699719

700720
do {
701721
// process HTLCs
702-
let peer1Event = await peer1.getManagerEvents(expectedCount: 1)[0]
703-
XCTAssertEqual(peer1Event.getValueType(), .PendingHTLCsForwardable)
722+
let peer1Event = try! await peer1.getManagerEvents(expectedCount: 1)[0]
723+
guard case .PendingHTLCsForwardable = peer1Event.getValueType() else {
724+
return XCTAssert(false, "Expected .PendingHTLCsForwardable, got \(peer1Event.getValueType())")
725+
}
704726
let pendingHTLCsForwardable = peer1Event.getValueAsPendingHTLCsForwardable()!
705727
print("forwardable time: \(pendingHTLCsForwardable.getTime_forwardable())")
706728
peer1.channelManager.process_pending_htlc_forwards()
@@ -709,13 +731,17 @@ public class HumanObjectPeerTestInstance {
709731

710732
do {
711733
// process payment
712-
let peer1Event = await peer1.getManagerEvents(expectedCount: 1)[0]
713-
XCTAssertEqual(peer1Event.getValueType(), .PaymentReceived)
734+
let peer1Event = try! await peer1.getManagerEvents(expectedCount: 1)[0]
735+
guard case .PaymentReceived = peer1Event.getValueType() else {
736+
return XCTAssert(false, "Expected .PaymentReceived, got \(peer1Event.getValueType())")
737+
}
714738
let paymentReceived = peer1Event.getValueAsPaymentReceived()!
715739
let paymentHash = paymentReceived.getPayment_hash()
716740
print("received payment of \(paymentReceived.getAmount_msat()) with hash \(paymentHash)")
717741
let paymentPurpose = paymentReceived.getPurpose()
718-
XCTAssertEqual(paymentPurpose.getValueType(), .InvoicePayment)
742+
guard case .InvoicePayment = paymentPurpose.getValueType() else {
743+
return XCTAssert(false, "Expected .InvoicePayment, got \(paymentPurpose.getValueType())")
744+
}
719745
let invoicePayment = paymentPurpose.getValueAsInvoicePayment()!
720746
let preimage = invoicePayment.getPayment_preimage()
721747
let secret = invoicePayment.getPayment_secret()
@@ -725,14 +751,24 @@ public class HumanObjectPeerTestInstance {
725751

726752
do {
727753
// process payment
728-
let peer2Events = await peer2.getManagerEvents(expectedCount: 2)
729-
let paymentSentEvent = peer2Events[0]
730-
let paymentPathSuccessfulEvent = peer2Events[1]
731-
XCTAssertEqual(paymentSentEvent.getValueType(), .PaymentSent)
732-
XCTAssertEqual(paymentPathSuccessfulEvent.getValueType(), .PaymentPathSuccessful)
754+
let peer2Events = try! await peer2.getManagerEvents(expectedCount: 3)
755+
print("received event count: \(peer2Events.count)")
756+
let paymentClaimedEvent = peer2Events[0]
757+
let paymentSentEvent = peer2Events[1]
758+
let paymentPathSuccessfulEvent = peer2Events[2]
759+
guard case .PaymentClaimed = paymentClaimedEvent.getValueType() else {
760+
return XCTAssert(false, "Expected .PaymentClaimed, got \(paymentClaimedEvent.getValueType())")
761+
}
762+
guard case .PaymentSent = paymentSentEvent.getValueType() else {
763+
return XCTAssert(false, "Expected .PaymentSent, got \(paymentSentEvent.getValueType())")
764+
}
765+
guard case .PaymentPathSuccessful = paymentPathSuccessfulEvent.getValueType() else {
766+
return XCTAssert(false, "Expected .PaymentPathSuccessful, got \(paymentPathSuccessfulEvent.getValueType())")
767+
}
768+
let paymentClaimed = paymentClaimedEvent.getValueAsPaymentClaimed()!
733769
let paymentSent = paymentSentEvent.getValueAsPaymentSent()!
734770
let paymentPathSuccessful = paymentPathSuccessfulEvent.getValueAsPaymentPathSuccessful()!
735-
print("sent payment \(paymentSent.getPayment_id()) with fee \(paymentSent.getFee_paid_msat().getValue()) via \(paymentPathSuccessful.getPath().map { h in h.get_short_channel_id() })")
771+
print("sent payment \(paymentSent.getPayment_id()) worth \(paymentClaimed.getAmount_msat()) with fee \(paymentSent.getFee_paid_msat().getValue()) via \(paymentPathSuccessful.getPath().map { h in h.get_short_channel_id() })")
736772
}
737773

738774
var currentChannelABalance = prePaymentBalanceAToB

0 commit comments

Comments
 (0)