fix test + process inventory
This commit is contained in:
parent
9d6f09889e
commit
c24af2daed
|
@ -638,6 +638,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chain 0.1.0",
|
"chain 0.1.0",
|
||||||
"db 0.1.0",
|
"db 0.1.0",
|
||||||
|
"ethcore-devtools 1.3.0",
|
||||||
"futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
|
@ -11,6 +11,7 @@ futures = "0.1"
|
||||||
futures-cpupool = "0.1"
|
futures-cpupool = "0.1"
|
||||||
tokio-core = { git = "https://github.com/debris/tokio-core" }
|
tokio-core = { git = "https://github.com/debris/tokio-core" }
|
||||||
linked-hash-map = "0.3"
|
linked-hash-map = "0.3"
|
||||||
|
ethcore-devtools = { path = "../devtools" }
|
||||||
|
|
||||||
chain = { path = "../chain" }
|
chain = { path = "../chain" }
|
||||||
db = { path = "../db" }
|
db = { path = "../db" }
|
||||||
|
@ -20,3 +21,6 @@ p2p = { path = "../p2p" }
|
||||||
primitives = { path = "../primitives" }
|
primitives = { path = "../primitives" }
|
||||||
test-data = { path = "../test-data" }
|
test-data = { path = "../test-data" }
|
||||||
verification = { path = "../verification" }
|
verification = { path = "../verification" }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
dev = []
|
||||||
|
|
|
@ -14,6 +14,8 @@ extern crate test_data;
|
||||||
extern crate time;
|
extern crate time;
|
||||||
extern crate verification;
|
extern crate verification;
|
||||||
extern crate miner;
|
extern crate miner;
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate ethcore_devtools as devtools;
|
||||||
|
|
||||||
mod best_headers_chain;
|
mod best_headers_chain;
|
||||||
mod blocks_writer;
|
mod blocks_writer;
|
||||||
|
|
|
@ -25,6 +25,8 @@ use time;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
#[cfg_attr(feature="cargo-clippy", allow(doc_markdown))]
|
#[cfg_attr(feature="cargo-clippy", allow(doc_markdown))]
|
||||||
|
///! TODO: update with headers-first corrections
|
||||||
|
///!
|
||||||
///! Blocks synchronization process:
|
///! Blocks synchronization process:
|
||||||
///!
|
///!
|
||||||
///! When new peer is connected:
|
///! When new peer is connected:
|
||||||
|
@ -286,8 +288,19 @@ impl<T> Client for SynchronizationClient<T> where T: TaskExecutor {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Try to queue synchronization of unknown blocks when new inventory is received.
|
/// Try to queue synchronization of unknown blocks when new inventory is received.
|
||||||
fn on_new_blocks_inventory(&mut self, _peer_index: usize, _peer_hashes: Vec<H256>) {
|
fn on_new_blocks_inventory(&mut self, peer_index: usize, blocks_hashes: Vec<H256>) {
|
||||||
// TODO
|
// we use headers-first synchronization
|
||||||
|
// we know nothing about these blocks
|
||||||
|
// =>
|
||||||
|
|
||||||
|
// if we are in synchronization state, we will ignore this message
|
||||||
|
if self.state.is_synchronizing() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// else => request blocks
|
||||||
|
let mut executor = self.executor.lock();
|
||||||
|
executor.execute(Task::RequestBlocks(peer_index, blocks_hashes))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Try to queue synchronization of unknown blocks when blocks headers are received.
|
/// Try to queue synchronization of unknown blocks when blocks headers are received.
|
||||||
|
@ -789,14 +802,20 @@ pub mod tests {
|
||||||
use p2p::event_loop;
|
use p2p::event_loop;
|
||||||
use test_data;
|
use test_data;
|
||||||
use db;
|
use db;
|
||||||
|
use devtools::RandomTempPath;
|
||||||
|
|
||||||
fn create_sync(empty_genesis: bool) -> (Core, Handle, Arc<Mutex<DummyTaskExecutor>>, ChainRef, Arc<Mutex<SynchronizationClient<DummyTaskExecutor>>>) {
|
fn create_disk_storage() -> Arc<db::Store> {
|
||||||
|
let path = RandomTempPath::create_dir();
|
||||||
|
Arc::new(db::Storage::new(path.as_path()).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_sync(storage: Option<Arc<db::Store>>) -> (Core, Handle, Arc<Mutex<DummyTaskExecutor>>, ChainRef, Arc<Mutex<SynchronizationClient<DummyTaskExecutor>>>) {
|
||||||
let event_loop = event_loop();
|
let event_loop = event_loop();
|
||||||
let handle = event_loop.handle();
|
let handle = event_loop.handle();
|
||||||
let storage = Arc::new(
|
let storage = match storage {
|
||||||
if empty_genesis { db::TestStorage::with_blocks(&[test_data::block_builder().header().build().build()]) }
|
Some(storage) => storage,
|
||||||
else { db::TestStorage::with_genesis_block() }
|
None => Arc::new(db::TestStorage::with_genesis_block()),
|
||||||
);
|
};
|
||||||
let chain = ChainRef::new(RwLock::new(Chain::new(storage.clone())));
|
let chain = ChainRef::new(RwLock::new(Chain::new(storage.clone())));
|
||||||
let executor = DummyTaskExecutor::new();
|
let executor = DummyTaskExecutor::new();
|
||||||
let config = Config { threads_num: 1, skip_verification: true };
|
let config = Config { threads_num: 1, skip_verification: true };
|
||||||
|
@ -807,7 +826,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_saturated_on_start() {
|
fn synchronization_saturated_on_start() {
|
||||||
let (_, _, _, _, sync) = create_sync(false);
|
let (_, _, _, _, sync) = create_sync(None);
|
||||||
let sync = sync.lock();
|
let sync = sync.lock();
|
||||||
let info = sync.information();
|
let info = sync.information();
|
||||||
assert!(!info.state.is_synchronizing());
|
assert!(!info.state.is_synchronizing());
|
||||||
|
@ -816,7 +835,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_in_order_block_path_nearly_saturated() {
|
fn synchronization_in_order_block_path_nearly_saturated() {
|
||||||
let (_, _, executor, _, sync) = create_sync(false);
|
let (_, _, executor, _, sync) = create_sync(None);
|
||||||
|
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
let block1: Block = test_data::block_h1();
|
let block1: Block = test_data::block_h1();
|
||||||
|
@ -858,7 +877,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_out_of_order_block_path() {
|
fn synchronization_out_of_order_block_path() {
|
||||||
let (_, _, _, _, sync) = create_sync(false);
|
let (_, _, _, _, sync) = create_sync(None);
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
|
|
||||||
let block2: Block = test_data::block_h169();
|
let block2: Block = test_data::block_h169();
|
||||||
|
@ -880,7 +899,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_parallel_peers() {
|
fn synchronization_parallel_peers() {
|
||||||
let (_, _, executor, _, sync) = create_sync(false);
|
let (_, _, executor, _, sync) = create_sync(None);
|
||||||
|
|
||||||
let block1: Block = test_data::block_h1();
|
let block1: Block = test_data::block_h1();
|
||||||
let block2: Block = test_data::block_h2();
|
let block2: Block = test_data::block_h2();
|
||||||
|
@ -925,7 +944,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_reset_when_peer_is_disconnected() {
|
fn synchronization_reset_when_peer_is_disconnected() {
|
||||||
let (_, _, _, _, sync) = create_sync(false);
|
let (_, _, _, _, sync) = create_sync(None);
|
||||||
|
|
||||||
// request new blocks
|
// request new blocks
|
||||||
{
|
{
|
||||||
|
@ -944,7 +963,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_not_starting_when_receiving_known_blocks() {
|
fn synchronization_not_starting_when_receiving_known_blocks() {
|
||||||
let (_, _, executor, _, sync) = create_sync(false);
|
let (_, _, executor, _, sync) = create_sync(None);
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
// saturated => receive inventory with known blocks only
|
// saturated => receive inventory with known blocks only
|
||||||
sync.on_new_blocks_headers(1, vec![test_data::genesis().block_header]);
|
sync.on_new_blocks_headers(1, vec![test_data::genesis().block_header]);
|
||||||
|
@ -957,7 +976,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_asks_for_inventory_after_saturating() {
|
fn synchronization_asks_for_inventory_after_saturating() {
|
||||||
let (_, _, executor, _, sync) = create_sync(false);
|
let (_, _, executor, _, sync) = create_sync(None);
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
let block = test_data::block_h1();
|
let block = test_data::block_h1();
|
||||||
sync.on_new_blocks_headers(1, vec![block.block_header.clone()]);
|
sync.on_new_blocks_headers(1, vec![block.block_header.clone()]);
|
||||||
|
@ -973,7 +992,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_remembers_correct_block_headers_in_order() {
|
fn synchronization_remembers_correct_block_headers_in_order() {
|
||||||
let (_, _, executor, chain, sync) = create_sync(false);
|
let (_, _, executor, chain, sync) = create_sync(None);
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
|
|
||||||
let b1 = test_data::block_h1();
|
let b1 = test_data::block_h1();
|
||||||
|
@ -1016,7 +1035,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_remembers_correct_block_headers_out_of_order() {
|
fn synchronization_remembers_correct_block_headers_out_of_order() {
|
||||||
let (_, _, executor, chain, sync) = create_sync(false);
|
let (_, _, executor, chain, sync) = create_sync(None);
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
|
|
||||||
let b1 = test_data::block_h1();
|
let b1 = test_data::block_h1();
|
||||||
|
@ -1059,7 +1078,7 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_ignores_unknown_block_headers() {
|
fn synchronization_ignores_unknown_block_headers() {
|
||||||
let (_, _, executor, chain, sync) = create_sync(false);
|
let (_, _, executor, chain, sync) = create_sync(None);
|
||||||
let mut sync = sync.lock();
|
let mut sync = sync.lock();
|
||||||
|
|
||||||
let b169 = test_data::block_h169();
|
let b169 = test_data::block_h169();
|
||||||
|
@ -1075,8 +1094,12 @@ pub mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn synchronization_works_for_forks_from_db_best_block() {
|
fn synchronization_works_for_forks_from_db_best_block() {
|
||||||
let (_, _, executor, chain, sync) = create_sync(true);
|
let storage = create_disk_storage();
|
||||||
let genesis_header = { chain.read().block_header_by_number(0).unwrap() };
|
let genesis = test_data::genesis();
|
||||||
|
storage.insert_block(&genesis).expect("no db error");
|
||||||
|
|
||||||
|
let (_, _, executor, chain, sync) = create_sync(Some(storage));
|
||||||
|
let genesis_header = &genesis.block_header;
|
||||||
let fork1 = test_data::build_n_empty_blocks_from(2, 100, &genesis_header);
|
let fork1 = test_data::build_n_empty_blocks_from(2, 100, &genesis_header);
|
||||||
let fork2 = test_data::build_n_empty_blocks_from(3, 200, &genesis_header);
|
let fork2 = test_data::build_n_empty_blocks_from(3, 200, &genesis_header);
|
||||||
|
|
||||||
|
@ -1099,28 +1122,25 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
sync.on_peer_block(1, fork1[0].clone());
|
sync.on_peer_block(1, fork1[0].clone());
|
||||||
// TODO
|
{
|
||||||
//{
|
let chain = chain.read();
|
||||||
// let chain = chain.read();
|
assert_eq!(chain.best_storage_block().hash, fork2[0].hash());
|
||||||
// assert_eq!(chain.best_storage_block().hash, fork2[0].hash());
|
assert_eq!(chain.best_storage_block().number, 1);
|
||||||
// assert_eq!(chain.best_storage_block().number, 1);
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
sync.on_peer_block(1, fork1[1].clone());
|
sync.on_peer_block(1, fork1[1].clone());
|
||||||
// TODO
|
{
|
||||||
//{
|
let chain = chain.read();
|
||||||
// let chain = chain.read();
|
assert_eq!(chain.best_storage_block().hash, fork1[1].hash());
|
||||||
// assert_eq!(chain.best_storage_block().hash, fork1[1].hash());
|
assert_eq!(chain.best_storage_block().number, 2);
|
||||||
// assert_eq!(chain.best_storage_block().number, 2);
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
sync.on_peer_block(2, fork2[1].clone());
|
sync.on_peer_block(2, fork2[1].clone());
|
||||||
// TODO
|
{
|
||||||
//{
|
let chain = chain.read();
|
||||||
// let chain = chain.read();
|
assert_eq!(chain.best_storage_block().hash, fork1[1].hash());
|
||||||
// assert_eq!(chain.best_storage_block().hash, fork1[1].hash());
|
assert_eq!(chain.best_storage_block().number, 2);
|
||||||
// assert_eq!(chain.best_storage_block().number, 2);
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
sync.on_peer_block(2, fork2[2].clone());
|
sync.on_peer_block(2, fork2[2].clone());
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue