Skip to content

Commit 65ea63c

Browse files
committed
Extract methods for opening channels.
1 parent f266e97 commit 65ea63c

File tree

2 files changed

+84
-52
lines changed

2 files changed

+84
-52
lines changed

ci/LDKSwift/Tests/LDKSwiftTests/HumanObjectPeerTestInstance.swift

Lines changed: 83 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -516,62 +516,37 @@ public class HumanObjectPeerTestInstance {
516516
peerC.constructor?.interrupt()
517517
}
518518
}
519-
520-
func testMessageHandling() async {
521-
522-
let FUNDING_SATOSHI_AMOUNT: UInt64 = 100_000 // 100k satoshis
523-
let SEND_MSAT_AMOUNT_A_TO_B: UInt64 = 10_000_000 // 10k satoshis
524-
let SEND_MSAT_AMOUNT_B_TO_A: UInt64 = 3_000_000 // 3k satoshis
525-
526-
let peer1 = Peer(master: self, seed: 1)
527-
let peer2 = Peer(master: self, seed: 2)
528-
529-
do {
530-
// connect the nodes
531-
let originalPeersA = peer1.peerManager.getPeerNodeIds()
532-
let originalPeersB = peer2.peerManager.getPeerNodeIds()
533-
XCTAssertEqual(originalPeersA.count, 0)
534-
XCTAssertEqual(originalPeersB.count, 0)
535-
536-
connectPeers(peerA: peer1, peerB: peer2)
537-
538-
// sleep for one second
539-
try! await Task.sleep(nanoseconds: 1_000_000_000)
540-
541-
let connectedPeersA = peer1.peerManager.getPeerNodeIds()
542-
let connectedPeersB = peer2.peerManager.getPeerNodeIds()
543-
XCTAssertEqual(connectedPeersA.count, 1)
544-
XCTAssertEqual(connectedPeersB.count, 1)
545-
}
546-
519+
520+
fileprivate class func openChannel(peerA: Peer, peerB: Peer, fundingAmount: UInt64, latestBlock: BTCBlock? = nil, otherPeers: [Peer] = []) async -> BTCBlock? {
547521
do {
548522
// initiate channel opening
549523
let config = UserConfig.initWithDefault()
550-
let theirNodeId = peer2.channelManager.getOurNodeId()
524+
let theirNodeId = peerB.channelManager.getOurNodeId()
551525
let userChannelId: [UInt8] = [UInt8](repeating: 42, count: 16);
552-
let channelOpenResult = peer1.channelManager.createChannel(theirNetworkKey: theirNodeId, channelValueSatoshis: FUNDING_SATOSHI_AMOUNT, pushMsat: 1000, userChannelId: userChannelId, overrideConfig: config)
526+
let channelOpenResult = peerA.channelManager.createChannel(theirNetworkKey: theirNodeId, channelValueSatoshis: fundingAmount, pushMsat: 1000, userChannelId: userChannelId, overrideConfig: config)
553527

554528
XCTAssertTrue(channelOpenResult.isOk())
555-
let channels = peer1.channelManager.listChannels()
529+
let channels = peerA.channelManager.listChannels()
556530
let firstChannel = channels[0]
557531
let fundingTxo = firstChannel.getFundingTxo()
558532
XCTAssertNil(fundingTxo)
559533
}
560534

561-
let channelsA = peer1.channelManager.listChannels()
535+
let channelsA = peerA.channelManager.listChannels()
562536
XCTAssertEqual(channelsA.count, 1)
563537

564-
let managerEvents = try! await peer1.getManagerEvents(expectedCount: 1)
538+
let managerEvents = try! await peerA.getManagerEvents(expectedCount: 1)
565539
XCTAssertEqual(managerEvents.count, 1)
566540

567541
let managerEvent = managerEvents[0]
568542
guard case .FundingGenerationReady = managerEvent.getValueType() else {
569-
return XCTAssert(false, "Expected .FundingGenerationReady, got \(managerEvent.getValueType())")
543+
XCTAssert(false, "Expected .FundingGenerationReady, got \(managerEvent.getValueType())")
544+
return nil
570545
}
571546

572547
let fundingReadyEvent = managerEvent.getValueAsFundingGenerationReady()!
573-
XCTAssertEqual(fundingReadyEvent.getChannelValueSatoshis(), FUNDING_SATOSHI_AMOUNT)
574-
let expectedUserChannelId: [UInt8] = [UInt8](repeating: 42, count: 16);
548+
XCTAssertEqual(fundingReadyEvent.getChannelValueSatoshis(), fundingAmount)
549+
let expectedUserChannelId: [UInt8] = [UInt8](repeating: 42, count: 16);
575550
XCTAssertEqual(fundingReadyEvent.getUserChannelId(), expectedUserChannelId)
576551

577552
let fundingOutputScript = fundingReadyEvent.getOutputScript();
@@ -591,33 +566,37 @@ public class HumanObjectPeerTestInstance {
591566
fundingTransaction.inputs = [input]
592567
fundingTransaction.setWitnessForInput(inputIndex: 0, witness: BTCTransaction.Witness(stackElements: [[1]]))
593568

594-
let output = BTCTransaction.Output(value: FUNDING_SATOSHI_AMOUNT, script: fundingOutputScript)
569+
let output = BTCTransaction.Output(value: fundingAmount, script: fundingOutputScript)
595570
fundingTransaction.outputs = [output]
596571
let serializedFundingTx = fundingTransaction.serialize()
597-
let fundingResult = peer1.channelManager.fundingTransactionGenerated(temporaryChannelId: temporaryChannelId, counterpartyNodeId: peer2.channelManager.getOurNodeId(), fundingTransaction: serializedFundingTx)
572+
let fundingResult = peerA.channelManager.fundingTransactionGenerated(temporaryChannelId: temporaryChannelId, counterpartyNodeId: peerB.channelManager.getOurNodeId(), fundingTransaction: serializedFundingTx)
598573
XCTAssertTrue(fundingResult.isOk())
599574

600-
let pendingBroadcasts = await peer1.getPendingBroadcasts(expectedCount: 1)
575+
let pendingBroadcasts = await peerA.getPendingBroadcasts(expectedCount: 1)
601576

602577
XCTAssertEqual(pendingBroadcasts.count, 1)
603578
XCTAssertEqual(pendingBroadcasts.first!, serializedFundingTx)
604579

605580
let fundingBlock = BTCBlock()
606581
fundingBlock.version = 2
607-
fundingBlock.previousBlockHash = BTCHashing.SHA_ZERO_HASH
582+
fundingBlock.previousBlockHash = latestBlock?.calculateHash() ?? BTCHashing.SHA_ZERO_HASH
608583
fundingBlock.merkleRoot = BTCHashing.SHA_ZERO_HASH
609584
fundingBlock.timestamp = 42
610585
fundingBlock.difficultyTarget = 0
611586
fundingBlock.nonce = 0
587+
fundingBlock.height = (latestBlock?.height ?? 0) + 1;
612588
fundingBlock.transactions = [fundingTransaction]
613589

614590
print("Connecting funding block…")
615-
peer1.connectBlock(block: fundingBlock, height: 1, expectedMonitorUpdateLength: 0)
616-
peer2.connectBlock(block: fundingBlock, height: 1, expectedMonitorUpdateLength: 0)
591+
peerA.connectBlock(block: fundingBlock, height: fundingBlock.height, expectedMonitorUpdateLength: 0)
592+
peerB.connectBlock(block: fundingBlock, height: fundingBlock.height, expectedMonitorUpdateLength: 0)
593+
for currentPeer in otherPeers {
594+
currentPeer.connectBlock(block: fundingBlock, height: 1, expectedMonitorUpdateLength: 0)
595+
}
617596

618597
print("Connecting confirmation blocks…")
619598
var previousBlock = fundingBlock
620-
for height in 2..<101 {
599+
for height in (fundingBlock.height+1)..<(fundingBlock.height+100) {
621600
let currentBlock = BTCBlock()
622601
currentBlock.version = 2
623602
currentBlock.previousBlockHash = previousBlock.calculateHash()
@@ -626,29 +605,34 @@ public class HumanObjectPeerTestInstance {
626605
currentBlock.difficultyTarget = 0
627606
currentBlock.nonce = 0
628607

629-
peer1.connectBlock(block: currentBlock, height: UInt32(height), expectedMonitorUpdateLength: 0)
630-
peer2.connectBlock(block: currentBlock, height: UInt32(height), expectedMonitorUpdateLength: 0)
608+
peerA.connectBlock(block: currentBlock, height: UInt32(height), expectedMonitorUpdateLength: 0)
609+
peerB.connectBlock(block: currentBlock, height: UInt32(height), expectedMonitorUpdateLength: 0)
610+
for currentPeer in otherPeers {
611+
currentPeer.connectBlock(block: currentBlock, height: UInt32(height), expectedMonitorUpdateLength: 0)
612+
}
631613
previousBlock = currentBlock
632614
}
633615

634-
let peer1Events = try! await peer1.getManagerEvents(expectedCount: 2)
616+
let peer1Events = try! await peerA.getManagerEvents(expectedCount: 2)
635617
let peer1ReadyEvent = peer1Events[1]
636618
guard case .ChannelReady = peer1ReadyEvent.getValueType() else {
637-
return XCTAssert(false, "Expected .ChannelReady, got \(peer1ReadyEvent.getValueType())")
619+
XCTAssert(false, "Expected .ChannelReady, got \(peer1ReadyEvent.getValueType())")
620+
return nil
638621
}
639622

640-
let peer2Events = try! await peer2.getManagerEvents(expectedCount: 2)
623+
let peer2Events = try! await peerB.getManagerEvents(expectedCount: 2)
641624
let peer2ReadyEvent = peer2Events[1]
642625
guard case .ChannelReady = peer2ReadyEvent.getValueType() else {
643-
return XCTAssert(false, "Expected .ChannelReady, got \(peer2ReadyEvent.getValueType())")
626+
XCTAssert(false, "Expected .ChannelReady, got \(peer2ReadyEvent.getValueType())")
627+
return nil
644628
}
645629

646630
var usableChannelsA = [ChannelDetails]()
647631
var usableChannelsB = [ChannelDetails]()
648632
print("Awaiting usable channels to populate…")
649633
while (usableChannelsA.isEmpty || usableChannelsB.isEmpty) {
650-
usableChannelsA = peer1.channelManager.listUsableChannels()
651-
usableChannelsB = peer2.channelManager.listUsableChannels()
634+
usableChannelsA = peerA.channelManager.listUsableChannels()
635+
usableChannelsB = peerB.channelManager.listUsableChannels()
652636
// sleep for 100ms
653637
try! await Task.sleep(nanoseconds: 0_100_000_000)
654638
}
@@ -659,7 +643,7 @@ public class HumanObjectPeerTestInstance {
659643

660644
let channelAToB = usableChannelsA[0]
661645
let channelBToA = usableChannelsB[0]
662-
XCTAssertEqual(channelAToB.getChannelValueSatoshis(), FUNDING_SATOSHI_AMOUNT)
646+
XCTAssertEqual(channelAToB.getChannelValueSatoshis(), fundingAmount)
663647
let shortChannelId = channelAToB.getShortChannelId()!
664648

665649
let fundingTxId = fundingTransaction.calculateId()
@@ -670,7 +654,54 @@ public class HumanObjectPeerTestInstance {
670654
let originalChannelBalanceBToA = channelBToA.getBalanceMsat()
671655
print("original balance A->B mSats: \(originalChannelBalanceAToB)")
672656
print("original balance B->A mSats: \(originalChannelBalanceBToA)")
657+
658+
// return the latest block after activating the channel
659+
return previousBlock
660+
}
673661

662+
func testMessageHandling() async {
663+
664+
let FUNDING_SATOSHI_AMOUNT: UInt64 = 100_000 // 100k satoshis
665+
let SEND_MSAT_AMOUNT_A_TO_B: UInt64 = 10_000_000 // 10k satoshis
666+
let SEND_MSAT_AMOUNT_B_TO_A: UInt64 = 3_000_000 // 3k satoshis
667+
let SEND_MSAT_AMOUNT_A_TO_C: UInt64 = 5_000_000 // 5k satoshis, with intermediate hop
668+
669+
let peer1 = Peer(master: self, seed: 1)
670+
let peer2 = Peer(master: self, seed: 2)
671+
let peer3 = Peer(master: self, seed: 3)
672+
673+
do {
674+
// connect the nodes
675+
let originalPeersA = peer1.peerManager.getPeerNodeIds()
676+
let originalPeersB = peer2.peerManager.getPeerNodeIds()
677+
XCTAssertEqual(originalPeersA.count, 0)
678+
XCTAssertEqual(originalPeersB.count, 0)
679+
680+
connectPeers(peerA: peer1, peerB: peer2)
681+
connectPeers(peerA: peer2, peerB: peer3)
682+
683+
// sleep for one second
684+
try! await Task.sleep(nanoseconds: 1_000_000_000)
685+
686+
let connectedPeersA = peer1.peerManager.getPeerNodeIds()
687+
let connectedPeersB = peer2.peerManager.getPeerNodeIds()
688+
let connectedPeersC = peer3.peerManager.getPeerNodeIds()
689+
XCTAssertEqual(connectedPeersA.count, 1)
690+
XCTAssertEqual(connectedPeersB.count, 2)
691+
XCTAssertEqual(connectedPeersC.count, 1)
692+
}
693+
694+
var confirmedChannelBlock = await HumanObjectPeerTestInstance.openChannel(peerA: peer1, peerB: peer2, fundingAmount: FUNDING_SATOSHI_AMOUNT, otherPeers: [peer3])
695+
696+
let usableChannelsA = peer1.channelManager.listUsableChannels()
697+
let usableChannelsB = peer2.channelManager.listUsableChannels()
698+
let channelAToB = usableChannelsA[0]
699+
let channelBToA = usableChannelsB[0]
700+
let originalChannelBalanceAToB = channelAToB.getBalanceMsat()
701+
let originalChannelBalanceBToA = channelBToA.getBalanceMsat()
702+
703+
confirmedChannelBlock = await HumanObjectPeerTestInstance.openChannel(peerA: peer2, peerB: peer3, fundingAmount: FUNDING_SATOSHI_AMOUNT, latestBlock: confirmedChannelBlock, otherPeers: [peer1])
704+
674705
let logger = TestLogger()
675706

676707
do {

ci/LDKSwift/Tests/LDKSwiftTests/bitcoin/BTCBlock.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class BTCBlock: Equatable {
2626
var timestamp: UInt32 = 0
2727
var difficultyTarget: UInt32 = 0
2828
var nonce: UInt32 = 0
29+
var height: UInt32 = 0
2930

3031
// each transaction is a uint8 array
3132
var transactions: [BTCTransaction] = []

0 commit comments

Comments
 (0)