Skip to content

Commit 43eed8d

Browse files
committed
Make test output deterministic
Tests use sources of randomness to produce seeds, preimages, secrets, and ephemeral data. However, this makes comparing logs between different test runs difficult. Remove uses of random number generators and the current time in favor of fixed values in order to make the test output deterministic.
1 parent bd2fa43 commit 43eed8d

8 files changed

+15
-68
lines changed

lightning/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,3 @@ features = ["bitcoinconsensus"]
2828

2929
[dev-dependencies]
3030
hex = "0.3"
31-
rand = "0.4"

lightning/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#![allow(ellipsis_inclusive_range_patterns)]
2020

2121
extern crate bitcoin;
22-
#[cfg(test)] extern crate rand;
2322
#[cfg(test)] extern crate hex;
2423

2524
#[macro_use]

lightning/src/ln/channel.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4478,7 +4478,6 @@ mod tests {
44784478
use bitcoin::hashes::Hash;
44794479
use bitcoin::hash_types::{Txid, WPubkeyHash};
44804480
use std::sync::Arc;
4481-
use rand::{thread_rng,Rng};
44824481

44834482
struct TestFeeEstimator {
44844483
fee_est: u32
@@ -4533,9 +4532,7 @@ mod tests {
45334532
let original_fee = 253;
45344533
let mut fee_est = TestFeeEstimator{fee_est: original_fee };
45354534
let secp_ctx = Secp256k1::new();
4536-
let mut seed = [0; 32];
4537-
let mut rng = thread_rng();
4538-
rng.fill_bytes(&mut seed);
4535+
let seed = [42; 32];
45394536
let network = Network::Testnet;
45404537
let keys_provider = test_utils::TestKeysInterface::new(&seed, network);
45414538

@@ -4555,9 +4552,7 @@ mod tests {
45554552
let feeest = TestFeeEstimator{fee_est: 15000};
45564553
let logger = test_utils::TestLogger::new();
45574554
let secp_ctx = Secp256k1::new();
4558-
let mut seed = [0; 32];
4559-
let mut rng = thread_rng();
4560-
rng.fill_bytes(&mut seed);
4555+
let seed = [42; 32];
45614556
let network = Network::Testnet;
45624557
let keys_provider = test_utils::TestKeysInterface::new(&seed, network);
45634558

lightning/src/ln/channelmonitor.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,7 +2544,6 @@ mod tests {
25442544
use util::test_utils::TestLogger;
25452545
use bitcoin::secp256k1::key::{SecretKey,PublicKey};
25462546
use bitcoin::secp256k1::Secp256k1;
2547-
use rand::{thread_rng,Rng};
25482547
use std::sync::Arc;
25492548
use chain::keysinterface::InMemoryChannelKeys;
25502549

@@ -2558,10 +2557,8 @@ mod tests {
25582557

25592558
let mut preimages = Vec::new();
25602559
{
2561-
let mut rng = thread_rng();
2562-
for _ in 0..20 {
2563-
let mut preimage = PaymentPreimage([0; 32]);
2564-
rng.fill_bytes(&mut preimage.0[..]);
2560+
for i in 0..20 {
2561+
let preimage = PaymentPreimage([i; 32]);
25652562
let hash = PaymentHash(Sha256::hash(&preimage.0[..]).into_inner());
25662563
preimages.push((preimage, hash));
25672564
}

lightning/src/ln/functional_test_utils.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ use bitcoin::hash_types::BlockHash;
2929

3030
use bitcoin::secp256k1::key::PublicKey;
3131

32-
use rand::{thread_rng,Rng};
33-
3432
use std::cell::RefCell;
3533
use std::rc::Rc;
3634
use std::sync::{Mutex, RwLock};
@@ -1071,11 +1069,9 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
10711069

10721070
pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMonCfg>) -> Vec<NodeCfg<'a>> {
10731071
let mut nodes = Vec::new();
1074-
let mut rng = thread_rng();
10751072

10761073
for i in 0..node_count {
1077-
let mut seed = [0; 32];
1078-
rng.fill_bytes(&mut seed);
1074+
let seed = [i as u8; 32];
10791075
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
10801076
let chan_monitor = test_utils::TestChannelMonitor::new(&chanmon_cfgs[i].chain_monitor, &chanmon_cfgs[i].tx_broadcaster, &chanmon_cfgs[i].logger, &chanmon_cfgs[i].fee_estimator);
10811077
nodes.push(NodeCfg { chain_monitor: &chanmon_cfgs[i].chain_monitor, logger: &chanmon_cfgs[i].logger, tx_broadcaster: &chanmon_cfgs[i].tx_broadcaster, fee_estimator: &chanmon_cfgs[i].fee_estimator, chan_monitor, keys_manager, node_seed: seed });

lightning/src/ln/functional_tests.rs

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ use std::sync::{Arc, Mutex};
4848
use std::sync::atomic::Ordering;
4949
use std::{mem, io};
5050

51-
use rand::{thread_rng, Rng};
52-
5351
use ln::functional_test_utils::*;
5452

5553
#[test]
@@ -1613,15 +1611,8 @@ fn test_chan_reserve_violation_inbound_htlc_outbound_channel() {
16131611
let (route, payment_hash, _) = get_route_and_payment_hash!(1000);
16141612
// Need to manually create the update_add_htlc message to go around the channel reserve check in send_htlc()
16151613
let secp_ctx = Secp256k1::new();
1616-
let session_priv = SecretKey::from_slice(&{
1617-
let mut session_key = [0; 32];
1618-
let mut rng = thread_rng();
1619-
rng.fill_bytes(&mut session_key);
1620-
session_key
1621-
}).expect("RNG is bad!");
1622-
1614+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
16231615
let cur_height = nodes[1].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
1624-
16251616
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
16261617
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0], 1000, &None, cur_height).unwrap();
16271618
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash);
@@ -1692,15 +1683,8 @@ fn test_chan_reserve_violation_inbound_htlc_inbound_chan() {
16921683

16931684
// Need to manually create the update_add_htlc message to go around the channel reserve check in send_htlc()
16941685
let secp_ctx = Secp256k1::new();
1695-
let session_priv = SecretKey::from_slice(&{
1696-
let mut session_key = [0; 32];
1697-
let mut rng = thread_rng();
1698-
rng.fill_bytes(&mut session_key);
1699-
session_key
1700-
}).expect("RNG is bad!");
1701-
1686+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
17021687
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
1703-
17041688
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route_2.paths[0], &session_priv).unwrap();
17051689
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route_2.paths[0], recv_value_2, &None, cur_height).unwrap();
17061690
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash_1);
@@ -3176,13 +3160,7 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
31763160
let (_, payment_hash) = get_payment_preimage_hash!(nodes[1]);
31773161

31783162
let secp_ctx = Secp256k1::new();
3179-
let session_priv = {
3180-
let mut session_key = [0; 32];
3181-
let mut rng = thread_rng();
3182-
rng.fill_bytes(&mut session_key);
3183-
SecretKey::from_slice(&session_key).expect("RNG is bad!")
3184-
};
3185-
3163+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
31863164
let current_height = nodes[1].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
31873165
let net_graph_msg_handler = &nodes[1].net_graph_msg_handler;
31883166
let route = get_route(&nodes[1].node.get_our_node_id(), net_graph_msg_handler, &nodes[0].node.get_our_node_id(), None, &Vec::new(), 50_000, TEST_FINAL_CLTV, &logger).unwrap();
@@ -5480,9 +5458,7 @@ fn test_key_derivation_params() {
54805458
let chanmon_cfgs = create_chanmon_cfgs(3);
54815459

54825460
// We manually create the node configuration to backup the seed.
5483-
let mut rng = thread_rng();
5484-
let mut seed = [0; 32];
5485-
rng.fill_bytes(&mut seed);
5461+
let seed = [42; 32];
54865462
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
54875463
let chan_monitor = test_utils::TestChannelMonitor::new(&chanmon_cfgs[0].chain_monitor, &chanmon_cfgs[0].tx_broadcaster, &chanmon_cfgs[0].logger, &chanmon_cfgs[0].fee_estimator);
54885464
let node = NodeCfg { chain_monitor: &chanmon_cfgs[0].chain_monitor, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, chan_monitor, keys_manager, node_seed: seed };
@@ -6475,13 +6451,7 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
64756451
let logger = test_utils::TestLogger::new();
64766452

64776453
let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
6478-
6479-
let session_priv = SecretKey::from_slice(&{
6480-
let mut session_key = [0; 32];
6481-
let mut rng = thread_rng();
6482-
rng.fill_bytes(&mut session_key);
6483-
session_key
6484-
}).expect("RNG is bad!");
6454+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
64856455

64866456
let net_graph_msg_handler = &nodes[0].net_graph_msg_handler;
64876457
let route = get_route(&nodes[0].node.get_our_node_id(), net_graph_msg_handler, &nodes[1].node.get_our_node_id(), None, &[], 3999999, TEST_FINAL_CLTV, &logger).unwrap();

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,8 +1216,6 @@ mod tests {
12161216
use bitcoin::secp256k1::Secp256k1;
12171217
use bitcoin::secp256k1::key::{SecretKey, PublicKey};
12181218

1219-
use rand::{thread_rng, Rng};
1220-
12211219
use std;
12221220
use std::sync::{Arc, Mutex};
12231221
use std::sync::atomic::Ordering;
@@ -1271,18 +1269,11 @@ mod tests {
12711269

12721270
fn create_network<'a>(peer_count: usize, cfgs: &'a Vec<PeerManagerCfg>) -> Vec<PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, &'a test_utils::TestLogger>> {
12731271
let mut peers = Vec::new();
1274-
let mut rng = thread_rng();
1275-
let mut ephemeral_bytes = [0; 32];
1276-
rng.fill_bytes(&mut ephemeral_bytes);
1277-
12781272
for i in 0..peer_count {
1279-
let node_id = {
1280-
let mut key_slice = [0;32];
1281-
rng.fill_bytes(&mut key_slice);
1282-
SecretKey::from_slice(&key_slice).unwrap()
1283-
};
1273+
let node_secret = SecretKey::from_slice(&[42 + i as u8; 32]).unwrap();
1274+
let ephemeral_bytes = [i as u8; 32];
12841275
let msg_handler = MessageHandler { chan_handler: &cfgs[i].chan_handler, route_handler: &cfgs[i].routing_handler };
1285-
let peer = PeerManager::new(msg_handler, node_id, &ephemeral_bytes, &cfgs[i].logger);
1276+
let peer = PeerManager::new(msg_handler, node_secret, &ephemeral_bytes, &cfgs[i].logger);
12861277
peers.push(peer);
12871278
}
12881279

lightning/src/util/test_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use bitcoin::hash_types::{Txid, BlockHash};
2222

2323
use bitcoin::secp256k1::{SecretKey, PublicKey, Secp256k1, Signature};
2424

25-
use std::time::{SystemTime, UNIX_EPOCH};
25+
use std::time::Duration;
2626
use std::sync::Mutex;
2727
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
2828
use std::{cmp, mem};
@@ -344,7 +344,7 @@ impl keysinterface::KeysInterface for TestKeysInterface {
344344

345345
impl TestKeysInterface {
346346
pub fn new(seed: &[u8; 32], network: Network) -> Self {
347-
let now = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards");
347+
let now = Duration::from_secs(genesis_block(network).header.time as u64);
348348
Self {
349349
backing: keysinterface::KeysManager::new(seed, network, now.as_secs(), now.subsec_nanos()),
350350
override_session_priv: Mutex::new(None),

0 commit comments

Comments
 (0)