Skip to content

Commit 0a308cb

Browse files
committed
Refactor Python binding tests to share module-level helpers
Move two-node setup, funding, channel open, and cleanup logic out of TestLdkNode methods into reusable module functions. Reuse them in both test_spontaneous_payment and test_channel_full_cycle to reduce duplication and keep integration test flows consistent.
1 parent 8c53d4f commit 0a308cb

1 file changed

Lines changed: 58 additions & 103 deletions

File tree

bindings/python/src/ldk_node/test_ldk_node.py

Lines changed: 58 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -118,77 +118,76 @@ def expect_event(node, expected_event_type):
118118
assert isinstance(event, expected_event_type)
119119
print("EVENT:", event)
120120
node.event_handled()
121-
return event
121+
return event
122122

123+
def setup_two_nodes(esplora_endpoint):
124+
tmp_dir_1 = tempfile.TemporaryDirectory("_ldk_node_1")
125+
listening_addresses_1 = ["127.0.0.1:2323"]
126+
node_1 = setup_node(tmp_dir_1.name, esplora_endpoint, listening_addresses_1)
127+
node_1.start()
128+
node_id_1 = node_1.node_id()
123129

130+
tmp_dir_2 = tempfile.TemporaryDirectory("_ldk_node_2")
131+
listening_addresses_2 = ["127.0.0.1:2324"]
132+
node_2 = setup_node(tmp_dir_2.name, esplora_endpoint, listening_addresses_2)
133+
node_2.start()
134+
node_id_2 = node_2.node_id()
124135

125-
class TestLdkNode(unittest.TestCase):
126-
def setUp(self):
127-
bitcoin_cli("createwallet ldk_node_test")
128-
mine(101)
129-
time.sleep(3)
130-
esplora_endpoint = get_esplora_endpoint()
131-
mine_and_wait(esplora_endpoint, 1)
136+
return node_1, node_2, tmp_dir_1, tmp_dir_2, node_id_1, node_id_2, listening_addresses_2
132137

133-
def _setup_two_nodes(self, esplora_endpoint):
134-
tmp_dir_1 = tempfile.TemporaryDirectory("_ldk_node_1")
135-
listening_addresses_1 = ["127.0.0.1:2323"]
136-
node_1 = setup_node(tmp_dir_1.name, esplora_endpoint, listening_addresses_1)
137-
node_1.start()
138-
node_id_1 = node_1.node_id()
138+
def fund_nodes(node_1, node_2, esplora_endpoint, amount_sats=100000):
139+
address_1 = node_1.onchain_payment().new_address()
140+
txid_1 = send_to_address(address_1, amount_sats)
141+
address_2 = node_2.onchain_payment().new_address()
142+
txid_2 = send_to_address(address_2, amount_sats)
139143

140-
tmp_dir_2 = tempfile.TemporaryDirectory("_ldk_node_2")
141-
listening_addresses_2 = ["127.0.0.1:2324"]
142-
node_2 = setup_node(tmp_dir_2.name, esplora_endpoint, listening_addresses_2)
143-
node_2.start()
144-
node_id_2 = node_2.node_id()
144+
wait_for_tx(esplora_endpoint, txid_1)
145+
wait_for_tx(esplora_endpoint, txid_2)
146+
mine_and_wait(esplora_endpoint, 6)
145147

146-
return node_1, node_2, tmp_dir_1, tmp_dir_2, node_id_1, node_id_2, listening_addresses_2
148+
node_1.sync_wallets()
149+
node_2.sync_wallets()
147150

148-
def _fund_nodes(self, node_1, node_2, esplora_endpoint, amount_sats=100000):
149-
address_1 = node_1.onchain_payment().new_address()
150-
txid_1 = send_to_address(address_1, amount_sats)
151-
address_2 = node_2.onchain_payment().new_address()
152-
txid_2 = send_to_address(address_2, amount_sats)
151+
def open_channel_and_wait_ready(node_1, node_2, node_id_2, listening_address_2, esplora_endpoint, channel_amount_sats=50000):
152+
node_1.open_channel(node_id_2, listening_address_2, channel_amount_sats, None, None)
153153

154-
wait_for_tx(esplora_endpoint, txid_1)
155-
wait_for_tx(esplora_endpoint, txid_2)
156-
mine_and_wait(esplora_endpoint, 6)
157-
158-
node_1.sync_wallets()
159-
node_2.sync_wallets()
154+
channel_pending_event_1 = expect_event(node_1, Event.CHANNEL_PENDING)
155+
expect_event(node_2, Event.CHANNEL_PENDING)
160156

161-
def _open_channel_and_wait_ready(self, node_1, node_2, node_id_2, listening_address_2, esplora_endpoint, channel_amount_sats=50000):
162-
node_1.open_channel(node_id_2, listening_address_2, channel_amount_sats, None, None)
157+
funding_txid = channel_pending_event_1.funding_txo.txid
158+
wait_for_tx(esplora_endpoint, funding_txid)
159+
mine_and_wait(esplora_endpoint, 6)
163160

164-
channel_pending_event_1 = expect_event(node_1, Event.CHANNEL_PENDING)
165-
expect_event(node_2, Event.CHANNEL_PENDING)
161+
node_1.sync_wallets()
162+
node_2.sync_wallets()
166163

167-
funding_txid = channel_pending_event_1.funding_txo.txid
168-
wait_for_tx(esplora_endpoint, funding_txid)
169-
mine_and_wait(esplora_endpoint, 6)
164+
channel_ready_event_1 = expect_event(node_1, Event.CHANNEL_READY)
165+
channel_ready_event_2 = expect_event(node_2, Event.CHANNEL_READY)
166+
return channel_ready_event_1, channel_ready_event_2, funding_txid
170167

171-
node_1.sync_wallets()
172-
node_2.sync_wallets()
168+
def stop_and_cleanup(node_1, node_2, tmp_dir_1, tmp_dir_2):
169+
node_1.stop()
170+
node_2.stop()
171+
time.sleep(1)
172+
tmp_dir_1.cleanup()
173+
tmp_dir_2.cleanup()
173174

174-
channel_ready_event_1 = expect_event(node_1, Event.CHANNEL_READY)
175-
channel_ready_event_2 = expect_event(node_2, Event.CHANNEL_READY)
176-
return channel_ready_event_1, channel_ready_event_2, funding_txid
177175

178-
def _stop_and_cleanup(self, node_1, node_2, tmp_dir_1, tmp_dir_2):
179-
node_1.stop()
180-
node_2.stop()
181-
time.sleep(1)
182-
tmp_dir_1.cleanup()
183-
tmp_dir_2.cleanup()
176+
class TestLdkNode(unittest.TestCase):
177+
def setUp(self):
178+
bitcoin_cli("createwallet ldk_node_test")
179+
mine(101)
180+
time.sleep(3)
181+
esplora_endpoint = get_esplora_endpoint()
182+
mine_and_wait(esplora_endpoint, 1)
184183

185184
def test_spontaneous_payment(self):
186185
"""Spontaneous payment test in python: keysend after channel ready."""
187186
esplora_endpoint = get_esplora_endpoint()
188187

189-
node_1, node_2, tmp_dir_1, tmp_dir_2, node_id_1, node_id_2, listening_addresses_2 = self._setup_two_nodes(esplora_endpoint)
190-
self._fund_nodes(node_1, node_2, esplora_endpoint)
191-
self._open_channel_and_wait_ready(node_1, node_2, node_id_2, listening_addresses_2[0], esplora_endpoint)
188+
node_1, node_2, tmp_dir_1, tmp_dir_2, node_id_1, node_id_2, listening_addresses_2 = setup_two_nodes(esplora_endpoint)
189+
fund_nodes(node_1, node_2, esplora_endpoint)
190+
open_channel_and_wait_ready(node_1, node_2, node_id_2, listening_addresses_2[0], esplora_endpoint)
192191

193192
keysend_amount_msat = 2_500_000
194193
custom_tlvs = [CustomTlvRecord(type_num=13377331, value=bytes([1, 2, 3]))]
@@ -217,43 +216,18 @@ def test_spontaneous_payment(self):
217216
self.assertEqual(receiver_payment.amount_msat, keysend_amount_msat)
218217
self.assertTrue(receiver_payment.kind.is_spontaneous())
219218

220-
self._stop_and_cleanup(node_1, node_2, tmp_dir_1, tmp_dir_2)
219+
stop_and_cleanup(node_1, node_2, tmp_dir_1, tmp_dir_2)
221220

222221
def test_channel_full_cycle(self):
223222
esplora_endpoint = get_esplora_endpoint()
224223

225-
## Setup Node 1
226-
tmp_dir_1 = tempfile.TemporaryDirectory("_ldk_node_1")
224+
node_1, node_2, tmp_dir_1, tmp_dir_2, node_id_1, node_id_2, listening_addresses_2 = setup_two_nodes(esplora_endpoint)
227225
print("TMP DIR 1:", tmp_dir_1.name)
228-
229-
listening_addresses_1 = ["127.0.0.1:2323"]
230-
node_1 = setup_node(tmp_dir_1.name, esplora_endpoint, listening_addresses_1)
231-
node_1.start()
232-
node_id_1 = node_1.node_id()
233226
print("Node ID 1:", node_id_1)
234-
235-
# Setup Node 2
236-
tmp_dir_2 = tempfile.TemporaryDirectory("_ldk_node_2")
237227
print("TMP DIR 2:", tmp_dir_2.name)
238-
239-
listening_addresses_2 = ["127.0.0.1:2324"]
240-
node_2 = setup_node(tmp_dir_2.name, esplora_endpoint, listening_addresses_2)
241-
node_2.start()
242-
node_id_2 = node_2.node_id()
243228
print("Node ID 2:", node_id_2)
244229

245-
address_1 = node_1.onchain_payment().new_address()
246-
txid_1 = send_to_address(address_1, 100000)
247-
address_2 = node_2.onchain_payment().new_address()
248-
txid_2 = send_to_address(address_2, 100000)
249-
250-
wait_for_tx(esplora_endpoint, txid_1)
251-
wait_for_tx(esplora_endpoint, txid_2)
252-
253-
mine_and_wait(esplora_endpoint, 6)
254-
255-
node_1.sync_wallets()
256-
node_2.sync_wallets()
230+
fund_nodes(node_1, node_2, esplora_endpoint)
257231

258232
spendable_balance_1 = node_1.list_balances().spendable_onchain_balance_sats
259233
spendable_balance_2 = node_2.list_balances().spendable_onchain_balance_sats
@@ -272,23 +246,11 @@ def test_channel_full_cycle(self):
272246
print("TOTAL 2:", total_balance_2)
273247
self.assertEqual(total_balance_2, 100000)
274248

275-
node_1.open_channel(node_id_2, listening_addresses_2[0], 50000, None, None)
276-
277-
278-
channel_pending_event_1 = expect_event(node_1, Event.CHANNEL_PENDING)
279-
channel_pending_event_2 = expect_event(node_2, Event.CHANNEL_PENDING)
280-
funding_txid = channel_pending_event_1.funding_txo.txid
281-
wait_for_tx(esplora_endpoint, funding_txid)
282-
mine_and_wait(esplora_endpoint, 6)
283-
284-
node_1.sync_wallets()
285-
node_2.sync_wallets()
286-
287-
channel_ready_event_1 = expect_event(node_1, Event.CHANNEL_READY)
249+
channel_ready_event_1, channel_ready_event_2, funding_txid = open_channel_and_wait_ready(
250+
node_1, node_2, node_id_2, listening_addresses_2[0], esplora_endpoint
251+
)
288252
print("funding_txo:", funding_txid)
289253

290-
channel_ready_event_2 = expect_event(node_2, Event.CHANNEL_READY)
291-
292254
description = Bolt11InvoiceDescription.DIRECT("asdf")
293255
invoice = node_2.bolt11_payment().receive(2500000, description, 9217)
294256
node_1.bolt11_payment().send(invoice, None)
@@ -316,14 +278,7 @@ def test_channel_full_cycle(self):
316278
spendable_balance_after_close_2 = node_2.list_balances().spendable_onchain_balance_sats
317279
self.assertEqual(spendable_balance_after_close_2, 102500)
318280

319-
# Stop nodes
320-
node_1.stop()
321-
node_2.stop()
322-
323-
# Cleanup
324-
time.sleep(1) # Wait a sec so our logs can finish writing
325-
tmp_dir_1.cleanup()
326-
tmp_dir_2.cleanup()
281+
stop_and_cleanup(node_1, node_2, tmp_dir_1, tmp_dir_2)
327282

328283
if __name__ == '__main__':
329284
unittest.main()

0 commit comments

Comments
 (0)