Skip to content

Commit fe674a8

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 9be497c commit fe674a8

File tree

8 files changed

+13
-56
lines changed

8 files changed

+13
-56
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: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4330,7 +4330,6 @@ mod tests {
43304330
use bitcoin::hashes::Hash;
43314331
use bitcoin::hash_types::{Txid, WPubkeyHash};
43324332
use std::sync::Arc;
4333-
use rand::{thread_rng,Rng};
43344333

43354334
struct TestFeeEstimator {
43364335
fee_est: u64
@@ -4383,9 +4382,7 @@ mod tests {
43834382
let feeest = TestFeeEstimator{fee_est: 15000};
43844383
let logger = test_utils::TestLogger::new();
43854384
let secp_ctx = Secp256k1::new();
4386-
let mut seed = [0; 32];
4387-
let mut rng = thread_rng();
4388-
rng.fill_bytes(&mut seed);
4385+
let seed = [42; 32];
43894386
let network = Network::Testnet;
43904387
let keys_provider = test_utils::TestKeysInterface::new(&seed, network);
43914388

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: 4 additions & 26 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]
@@ -1636,13 +1634,7 @@ fn do_channel_reserve_test(test_recv: bool) {
16361634

16371635
// Need to manually create update_add_htlc message to go around the channel reserve check in send_htlc()
16381636
let secp_ctx = Secp256k1::new();
1639-
let session_priv = SecretKey::from_slice(&{
1640-
let mut session_key = [0; 32];
1641-
let mut rng = thread_rng();
1642-
rng.fill_bytes(&mut session_key);
1643-
session_key
1644-
}).expect("RNG is bad!");
1645-
1637+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
16461638
let cur_height = nodes[0].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
16471639
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
16481640
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0], recv_value_2 + 1, &None, cur_height).unwrap();
@@ -2985,13 +2977,7 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
29852977
let (_, payment_hash) = get_payment_preimage_hash!(nodes[1]);
29862978

29872979
let secp_ctx = Secp256k1::new();
2988-
let session_priv = {
2989-
let mut session_key = [0; 32];
2990-
let mut rng = thread_rng();
2991-
rng.fill_bytes(&mut session_key);
2992-
SecretKey::from_slice(&session_key).expect("RNG is bad!")
2993-
};
2994-
2980+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
29952981
let current_height = nodes[1].node.latest_block_height.load(Ordering::Acquire) as u32 + 1;
29962982
let net_graph_msg_handler = &nodes[1].net_graph_msg_handler;
29972983
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();
@@ -5289,9 +5275,7 @@ fn test_key_derivation_params() {
52895275
let chanmon_cfgs = create_chanmon_cfgs(3);
52905276

52915277
// We manually create the node configuration to backup the seed.
5292-
let mut rng = thread_rng();
5293-
let mut seed = [0; 32];
5294-
rng.fill_bytes(&mut seed);
5278+
let seed = [42; 32];
52955279
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
52965280
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);
52975281
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 };
@@ -6276,13 +6260,7 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
62766260
let logger = test_utils::TestLogger::new();
62776261

62786262
let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
6279-
6280-
let session_priv = SecretKey::from_slice(&{
6281-
let mut session_key = [0; 32];
6282-
let mut rng = thread_rng();
6283-
rng.fill_bytes(&mut session_key);
6284-
session_key
6285-
}).expect("RNG is bad!");
6263+
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
62866264

62876265
let net_graph_msg_handler = &nodes[0].net_graph_msg_handler;
62886266
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)