Skip to content

Commit 5e224d8

Browse files
committed
simln-lib/tests: update test helper to mock lightning node type
Rather than need to downcast the dyn LightningNode, we store the raw mock in our test builder output and add a helper to cast to dyn.
1 parent 83c9472 commit 5e224d8

2 files changed

Lines changed: 61 additions & 53 deletions

File tree

simln-lib/src/lib.rs

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,8 +1735,8 @@ mod tests {
17351735
/// support are present, expecting an `Ok` result.
17361736
#[tokio::test]
17371737
async fn test_validate_activity_empty_with_sufficient_nodes() {
1738-
let (_, clients) = LightningTestNodeBuilder::new(3).build_full();
1739-
let simulation = test_utils::create_simulation(clients);
1738+
let network = LightningTestNodeBuilder::new(3).build_full();
1739+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
17401740
let result = simulation.validate_activity(&[]).await;
17411741
assert!(result.is_ok());
17421742
}
@@ -1745,8 +1745,8 @@ mod tests {
17451745
/// expecting a `ValidationError` with "At least two nodes required".
17461746
#[tokio::test]
17471747
async fn test_validate_activity_empty_with_insufficient_nodes() {
1748-
let (_, clients) = LightningTestNodeBuilder::new(1).build_full();
1749-
let simulation = test_utils::create_simulation(clients);
1748+
let network = LightningTestNodeBuilder::new(1).build_full();
1749+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
17501750
let result = simulation.validate_activity(&[]).await;
17511751

17521752
assert!(result.is_err());
@@ -1759,10 +1759,10 @@ mod tests {
17591759
/// expecting a `ValidationError` with "must support keysend".
17601760
#[tokio::test]
17611761
async fn test_validate_activity_empty_with_non_keysend_node() {
1762-
let (_, clients) = LightningTestNodeBuilder::new(2)
1762+
let network = LightningTestNodeBuilder::new(2)
17631763
.with_keysend_nodes(vec![0])
17641764
.build_full();
1765-
let simulation = test_utils::create_simulation(clients);
1765+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
17661766
let result = simulation.validate_activity(&[]).await;
17671767

17681768
assert!(result.is_err());
@@ -1775,13 +1775,13 @@ mod tests {
17751775
/// expecting a `ValidationError` with "Source node not found".
17761776
#[tokio::test]
17771777
async fn test_validate_activity_with_missing_source_node() {
1778-
let (nodes, clients) = LightningTestNodeBuilder::new(1).build_full();
1778+
let network = LightningTestNodeBuilder::new(1).build_full();
17791779
let missing_nodes = test_utils::create_nodes(1, 100_000);
17801780
let missing_node = missing_nodes.first().unwrap().0.clone();
1781-
let dest_node = nodes[0].clone();
1781+
let dest_node = network.nodes[0].clone();
17821782

17831783
let activity = test_utils::create_activity(missing_node, dest_node, 1000);
1784-
let simulation = test_utils::create_simulation(clients);
1784+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
17851785
let result = simulation.validate_activity(&vec![activity]).await;
17861786

17871787
assert!(result.is_err());
@@ -1794,12 +1794,12 @@ mod tests {
17941794
/// expecting a `ValidationError` with "does not support keysend".
17951795
#[tokio::test]
17961796
async fn test_validate_activity_with_non_keysend_destination() {
1797-
let (nodes, clients) = LightningTestNodeBuilder::new(1).build_full();
1797+
let network = LightningTestNodeBuilder::new(1).build_full();
17981798
let dest_nodes = test_utils::create_nodes(1, 100_000);
17991799
let dest_node = dest_nodes.first().unwrap().0.clone();
18001800

1801-
let activity = test_utils::create_activity(nodes[0].clone(), dest_node, 1000);
1802-
let simulation = test_utils::create_simulation(clients);
1801+
let activity = test_utils::create_activity(network.nodes[0].clone(), dest_node, 1000);
1802+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
18031803
let result = simulation.validate_activity(&vec![activity]).await;
18041804

18051805
assert!(result.is_err());
@@ -1812,13 +1812,13 @@ mod tests {
18121812
/// passes validation, expecting an `Ok` result.
18131813
#[tokio::test]
18141814
async fn test_validate_activity_valid_payment_flow() {
1815-
let (nodes, clients) = LightningTestNodeBuilder::new(1).build_full();
1815+
let network = LightningTestNodeBuilder::new(1).build_full();
18161816
let dest_nodes = test_utils::create_nodes(1, 100_000);
18171817
let mut dest_node = dest_nodes.first().unwrap().0.clone();
18181818
dest_node.features.set_keysend_optional();
18191819

1820-
let activity = test_utils::create_activity(nodes[0].clone(), dest_node, 1000);
1821-
let simulation = test_utils::create_simulation(clients);
1820+
let activity = test_utils::create_activity(network.nodes[0].clone(), dest_node, 1000);
1821+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
18221822
let result = simulation.validate_activity(&vec![activity]).await;
18231823

18241824
assert!(result.is_ok());
@@ -1828,10 +1828,11 @@ mod tests {
18281828
/// expecting a `ValidationError` with "zero values".
18291829
#[tokio::test]
18301830
async fn test_validate_zero_amount_no_valid() {
1831-
let (nodes, clients) = LightningTestNodeBuilder::new(2).build_full();
1831+
let network = LightningTestNodeBuilder::new(2).build_full();
18321832

1833-
let activity = test_utils::create_activity(nodes[0].clone(), nodes[1].clone(), 0);
1834-
let simulation = test_utils::create_simulation(clients);
1833+
let activity =
1834+
test_utils::create_activity(network.nodes[0].clone(), network.nodes[1].clone(), 0);
1835+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
18351836
let result = simulation.validate_activity(&vec![activity]).await;
18361837

18371838
assert!(result.is_err());
@@ -1859,11 +1860,11 @@ mod tests {
18591860
/// with "mainnet is not supported".
18601861
#[tokio::test]
18611862
async fn test_validate_node_network_mainnet_not_supported() {
1862-
let clients = LightningTestNodeBuilder::new(1)
1863+
let network = LightningTestNodeBuilder::new(1)
18631864
.with_networks(vec![Network::Bitcoin])
1864-
.build_clients_only();
1865+
.build_full();
18651866

1866-
let simulation = test_utils::create_simulation(clients);
1867+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
18671868
let result = simulation.validate_node_network().await;
18681869

18691870
assert!(result.is_err());
@@ -1876,11 +1877,11 @@ mod tests {
18761877
/// `ValidationError` with "nodes are not on the same network".
18771878
#[tokio::test]
18781879
async fn test_validate_node_network_mixed_networks() {
1879-
let clients = LightningTestNodeBuilder::new(2)
1880+
let network = LightningTestNodeBuilder::new(2)
18801881
.with_networks(vec![Network::Testnet, Network::Regtest])
1881-
.build_clients_only();
1882+
.build_full();
18821883

1883-
let simulation = test_utils::create_simulation(clients);
1884+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
18841885
let result = simulation.validate_node_network().await;
18851886

18861887
assert!(result.is_err());
@@ -1892,23 +1893,23 @@ mod tests {
18921893
/// Verifies that three Testnet nodes pass validation, expecting an `Ok` result.
18931894
#[tokio::test]
18941895
async fn test_validate_node_network_multiple_nodes_same_network() {
1895-
let clients = LightningTestNodeBuilder::new(3)
1896+
let network = LightningTestNodeBuilder::new(3)
18961897
.with_networks(vec![Network::Testnet, Network::Testnet, Network::Testnet])
1897-
.build_clients_only();
1898+
.build_full();
18981899

1899-
let simulation = test_utils::create_simulation(clients);
1900+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
19001901
let result = simulation.validate_node_network().await;
19011902

19021903
assert!(result.is_ok());
19031904
}
19041905

19051906
#[tokio::test]
19061907
async fn test_validate_node_network_single_node_valid_network() {
1907-
let clients = LightningTestNodeBuilder::new(1)
1908+
let network = LightningTestNodeBuilder::new(1)
19081909
.with_networks(vec![Network::Testnet])
1909-
.build_clients_only();
1910+
.build_full();
19101911

1911-
let simulation = test_utils::create_simulation(clients);
1912+
let simulation = test_utils::create_simulation(network.get_client_hashmap());
19121913
let result = simulation.validate_node_network().await;
19131914

19141915
assert!(result.is_ok());
@@ -1928,16 +1929,17 @@ mod tests {
19281929
HashMap<PublicKey, Arc<Mutex<dyn LightningNode>>>,
19291930
Arc<StdMutex<Vec<PublicKey>>>,
19301931
) {
1931-
let (nodes, mut clients) = LightningTestNodeBuilder::new(4)
1932+
let network = LightningTestNodeBuilder::new(4)
19321933
.with_networks(vec![
19331934
Network::Regtest,
19341935
Network::Regtest,
19351936
Network::Regtest,
19361937
Network::Regtest,
19371938
])
19381939
.build_full();
1940+
let mut clients = network.get_client_hashmap();
19391941

1940-
let node_1 = &nodes[0];
1942+
let node_1 = &network.nodes[0];
19411943
let mut mock_node_1 = MockLightningNode::new();
19421944

19431945
let payments_list = Arc::new(StdMutex::new(Vec::new()));
@@ -1981,7 +1983,7 @@ mod tests {
19811983
clients.insert(node_1.pubkey, Arc::new(Mutex::new(mock_node_1)));
19821984
}
19831985

1984-
let node_2 = &nodes[1];
1986+
let node_2 = &network.nodes[1];
19851987

19861988
let mut mock_node_2 = MockLightningNode::new();
19871989

@@ -2020,7 +2022,7 @@ mod tests {
20202022
clients.insert(node_2.pubkey, Arc::new(Mutex::new(mock_node_2)));
20212023
}
20222024

2023-
let node_3 = &nodes[2];
2025+
let node_3 = &network.nodes[2];
20242026

20252027
let mut mock_node_3 = MockLightningNode::new();
20262028

@@ -2059,7 +2061,7 @@ mod tests {
20592061
clients.insert(node_3.pubkey, Arc::new(Mutex::new(mock_node_3)));
20602062
}
20612063

2062-
let node_4 = &nodes[3];
2064+
let node_4 = &network.nodes[3];
20632065

20642066
let mut mock_node_4 = MockLightningNode::new();
20652067

simln-lib/src/test_utils.rs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,23 @@ mock! {
9595
}
9696

9797
/// Type alias for the result of setup_test_nodes.
98-
type TestNodesResult = (
99-
Vec<NodeInfo>,
100-
HashMap<PublicKey, Arc<Mutex<dyn LightningNode>>>,
101-
);
98+
pub struct TestNodesResult {
99+
pub nodes: Vec<NodeInfo>,
100+
pub clients: Vec<Arc<Mutex<MockLightningNode>>>,
101+
}
102+
103+
impl TestNodesResult {
104+
// Returns a hashmap of the mocked lightning clients, cast to dyn LightningNode.
105+
pub fn get_client_hashmap(&self) -> HashMap<PublicKey, Arc<Mutex<dyn LightningNode>>> {
106+
let mut client_map: HashMap<PublicKey, Arc<Mutex<dyn LightningNode>>> =
107+
HashMap::with_capacity(self.nodes.len());
108+
109+
for (idx, node) in self.nodes.iter().enumerate() {
110+
client_map.insert(node.pubkey, self.clients[idx].clone());
111+
}
112+
client_map
113+
}
114+
}
102115

103116
/// A builder for creating mock Lightning nodes for testing purposes.
104117
///
@@ -161,21 +174,14 @@ impl LightningTestNodeBuilder {
161174
self
162175
}
163176

164-
/// Builds only the client map, omitting node info. Useful for network-specific testing.
165-
/// Returns a map of public keys to mocked Lightning node clients.
166-
pub fn build_clients_only(self) -> HashMap<PublicKey, Arc<Mutex<dyn LightningNode>>> {
167-
let (_, clients) = self.build_full();
168-
clients
169-
}
170-
171177
/// Builds the full test setup, including node info and clients. Returns a tuple of node
172178
/// information and a map of public keys to mocked Lightning node clients.
173179
pub fn build_full(self) -> TestNodesResult {
174-
let nodes = create_nodes(self.node_count, self.initial_balance);
175-
let mut node_infos = Vec::new();
176-
let mut clients: HashMap<PublicKey, Arc<Mutex<dyn LightningNode>>> = HashMap::new();
180+
let node_info_list = create_nodes(self.node_count, self.initial_balance);
181+
let mut nodes = Vec::with_capacity(node_info_list.len());
182+
let mut clients = Vec::with_capacity(node_info_list.len());
177183

178-
for (idx, (mut node_info, _)) in nodes.into_iter().enumerate() {
184+
for (idx, (mut node_info, _)) in node_info_list.into_iter().enumerate() {
179185
if self.keysend_indices.contains(&idx) {
180186
node_info.features.set_keysend_optional();
181187
}
@@ -188,11 +194,11 @@ impl LightningTestNodeBuilder {
188194
mock_node.expect_get_network().return_const(network);
189195
}
190196

191-
clients.insert(node_info.pubkey, Arc::new(Mutex::new(mock_node)));
192-
node_infos.push(node_info);
197+
clients.push(Arc::new(Mutex::new(mock_node)));
198+
nodes.push(node_info);
193199
}
194200

195-
(node_infos, clients)
201+
TestNodesResult { nodes, clients }
196202
}
197203
}
198204

0 commit comments

Comments
 (0)