Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make test_esplora_syncs more robust #2033

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions lightning-transaction-sync/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ fn get_bitcoind() -> &'static BitcoinD {
);
let mut conf = bitcoind::Conf::default();
conf.network = "regtest";
BitcoinD::with_conf(bitcoind_exe, &conf).unwrap()
let bitcoind = BitcoinD::with_conf(bitcoind_exe, &conf).unwrap();
std::thread::sleep(Duration::from_secs(1));
bitcoind
})
}

Expand All @@ -46,29 +48,42 @@ fn get_electrsd() -> &'static ElectrsD {
let mut conf = electrsd::Conf::default();
conf.http_enabled = true;
conf.network = "regtest";
ElectrsD::with_conf(electrs_exe, &bitcoind, &conf).unwrap()
let electrsd = ElectrsD::with_conf(electrs_exe, &bitcoind, &conf).unwrap();
std::thread::sleep(Duration::from_secs(1));
electrsd
})
}

fn generate_blocks_and_wait(num: usize) {
let miner_lock = MINER_LOCK.get_or_init(|| Mutex::new(()));
let _miner = miner_lock.lock().unwrap();
let cur_height = get_bitcoind().client.get_block_count().unwrap();
let address = get_bitcoind().client.get_new_address(Some("test"), Some(AddressType::Legacy)).unwrap();
let _block_hashes = get_bitcoind().client.generate_to_address(num as u64, &address).unwrap();
let cur_height = get_bitcoind().client.get_block_count().expect("failed to get current block height");
let address = get_bitcoind().client.get_new_address(Some("test"), Some(AddressType::Legacy)).expect("failed to get new address");
// TODO: expect this Result once the WouldBlock issue is resolved upstream.
let _block_hashes_res = get_bitcoind().client.generate_to_address(num as u64, &address);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are the blocks actually being mined here such that not unwrapping the error actually moves things forward? Otherwise, won't the test just fail in wait_for_block instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, from the user reports I got it indeed seems to be the case that bitcoind keeps generating the blocks in the background. So we should pick them up eventually via wait_for_block.

wait_for_block(cur_height as usize + num);
}

fn wait_for_block(min_height: usize) {
let mut header = get_electrsd().client.block_headers_subscribe().unwrap();
let mut header = match get_electrsd().client.block_headers_subscribe() {
Ok(header) => header,
Err(_) => {
// While subscribing should succeed the first time around, we ran into some cases where
// it didn't. Since we can't proceed without subscribing, we try again after a delay
// and panic if it still fails.
std::thread::sleep(Duration::from_secs(1));
get_electrsd().client.block_headers_subscribe().expect("failed to subscribe to block headers")
}
};

loop {
if header.height >= min_height {
break;
}
header = exponential_backoff_poll(|| {
get_electrsd().trigger().unwrap();
get_electrsd().client.ping().unwrap();
get_electrsd().client.block_headers_pop().unwrap()
get_electrsd().trigger().expect("failed to trigger electrsd");
get_electrsd().client.ping().expect("failed to ping electrsd");
get_electrsd().client.block_headers_pop().expect("failed to pop block header")
});
}
}
Expand Down