Skip to content

Commit 835d2c7

Browse files
Add test for external node opening channel with LDK
Introduce `do_external_node_opens_channel_simple_transactions_with_ldk` to test external nodes initiating channel opening and performing simple transactions with LDK. Extend ExternalLightningNode trait with `open_channel` and `create_new_address` methods for better support in integration tests.
1 parent 3547bc6 commit 835d2c7

File tree

3 files changed

+113
-1
lines changed

3 files changed

+113
-1
lines changed

tests/common/external_node.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ pub trait ExternalLightningNode {
4242
fn check_receive_payment(&mut self, invoice: Bolt11Invoice);
4343

4444
fn close_channel(&mut self, channel_id: OutPoint, node_id: PublicKey, force: bool);
45+
46+
fn create_new_address(&mut self) -> String;
47+
48+
fn open_channel(&mut self, node_id: PublicKey, funding_amount_sat: u64);
4549
}
4650

4751
static BITCOIND_CLIENT: OnceLock<BitcoindClient> = OnceLock::new();
@@ -249,3 +253,59 @@ pub(crate) fn do_ldk_opens_channel_full_cycle_with_external_node<E: ExternalLigh
249253

250254
node.stop().unwrap();
251255
}
256+
257+
pub(crate) fn do_external_node_opens_channel_simple_transactions_with_ldk<
258+
E: ExternalLightningNode,
259+
>(
260+
external_node: &mut E,
261+
) {
262+
// Initialize LDK node and clients
263+
let (node, bitcoind_client, electrs_client) = setup_test_node(false);
264+
265+
// setup external node info
266+
let (external_node_id, external_node_address) = external_node.get_node_info();
267+
268+
let addr_string = external_node.create_new_address();
269+
let addr = bitcoin::Address::from_str(&addr_string)
270+
.unwrap()
271+
.require_network(bitcoin::Network::Regtest)
272+
.unwrap();
273+
let amount = Amount::from_sat(5_000_000);
274+
distribute_funds_unconfirmed(bitcoind_client, &electrs_client, vec![addr], amount);
275+
generate_blocks_and_wait(bitcoind_client, &electrs_client, 6);
276+
277+
node.connect(external_node_id, external_node_address.clone(), true).unwrap();
278+
279+
// Open the channel
280+
external_node.open_channel(node.node_id(), 2_000_000);
281+
let funding_txo = expect_channel_pending_event!(node, external_node_id);
282+
wait_for_tx(&electrs_client, funding_txo.txid);
283+
generate_blocks_and_wait(bitcoind_client, &electrs_client, 6);
284+
node.sync_wallets().unwrap();
285+
let user_channel_id = expect_channel_ready_event!(node, external_node_id);
286+
287+
// Send a payment to LDK
288+
let amount_msat = 100_000_000;
289+
receive_payment_from_external_node(&node, external_node, amount_msat);
290+
node.sync_wallets().unwrap();
291+
292+
// Send a payment to the external node
293+
let invoice_amount_sat = node.list_channels().first().unwrap().next_outbound_htlc_limit_msat;
294+
let invoice: Bolt11Invoice =
295+
send_payment_to_external_node(&node, external_node, invoice_amount_sat);
296+
check_send_payment_succeeds(&node, external_node, invoice);
297+
298+
// Close the channel
299+
close_channel(
300+
&bitcoind_client,
301+
&electrs_client,
302+
external_node,
303+
&node,
304+
funding_txo,
305+
external_node_id,
306+
&user_channel_id,
307+
None,
308+
);
309+
310+
node.stop().unwrap();
311+
}

tests/integration_tests_cln.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ use std::default::Default;
2121
use std::str::FromStr;
2222

2323
use crate::common::external_node::{
24-
do_ldk_opens_channel_full_cycle_with_external_node, init_bitcoind_client, ExternalLightningNode,
24+
do_external_node_opens_channel_simple_transactions_with_ldk,
25+
do_ldk_opens_channel_full_cycle_with_external_node, init_bitcoind_client,
26+
ExternalLightningNode,
2527
};
2628

2729
#[test]
@@ -45,6 +47,13 @@ fn test_cln_initiates_force_channel_close() {
4547
do_ldk_opens_channel_full_cycle_with_external_node(&mut client, None);
4648
}
4749

50+
#[test]
51+
fn test_cln_opens_channel_with_ldk() {
52+
init_bitcoind_client();
53+
let mut client = ClnClient::new();
54+
do_external_node_opens_channel_simple_transactions_with_ldk(&mut client);
55+
}
56+
4857
struct ClnClient {
4958
pub client: LightningRPC,
5059
pub rng: rand::rngs::ThreadRng,
@@ -139,4 +148,18 @@ impl ExternalLightningNode for ClnClient {
139148
assert_eq!(response.type_, "mutual");
140149
}
141150
}
151+
fn create_new_address(&mut self) -> String {
152+
let address_info = self.client.newaddr(None).unwrap();
153+
address_info.bech32.unwrap()
154+
}
155+
156+
fn open_channel(&mut self, node_id: PublicKey, funding_amount_sat: u64) {
157+
self.client
158+
.fundchannel(
159+
&node_id.to_string(),
160+
clightningrpc::requests::AmountOrAll::Amount(funding_amount_sat),
161+
None,
162+
)
163+
.unwrap();
164+
}
142165
}

tests/integration_tests_lnd.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,4 +184,33 @@ impl ExternalLightningNode for LndClient {
184184
.block_on(self.client.lightning().close_channel(request))
185185
.expect("Failed to initiate close channel on LND");
186186
}
187+
188+
fn create_new_address(&mut self) -> String {
189+
let address = self
190+
.runtime
191+
.block_on(self.client.lightning().new_address(
192+
lnd_grpc_rust::lnrpc::NewAddressRequest {
193+
r#type: 0, // 0 = WITNESS_PUBKEY_HASH (bech32)
194+
account: "".to_string(),
195+
},
196+
))
197+
.expect("Failed to create new address")
198+
.into_inner();
199+
200+
address.address
201+
}
202+
203+
fn open_channel(&mut self, node_id: PublicKey, funding_amount_sat: u64) {
204+
let open_channel_request = lnd_grpc_rust::lnrpc::OpenChannelRequest {
205+
node_pubkey: node_id.to_public_key().to_bytes().to_vec(),
206+
local_funding_amount: funding_amount_sat as i64,
207+
sat_per_vbyte: 1,
208+
..Default::default()
209+
};
210+
211+
let _stream = self
212+
.runtime
213+
.block_on(self.client.lightning().open_channel_sync(open_channel_request))
214+
.expect("Failed to open channel on LND");
215+
}
187216
}

0 commit comments

Comments
 (0)