From 4e466f09db5b1b5a5b5307d07a5d7deb72ef3c35 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 5 Sep 2016 12:24:03 +0200 Subject: [PATCH] Add a few small snapshot tests (#2038) * add manifest data test * begin tests for io * add unit tests for snapshot io * service smoke test * remove empty service module --- ethcore/src/snapshot/io.rs | 88 +++++++++++++++++++++++++++ ethcore/src/snapshot/mod.rs | 2 +- ethcore/src/snapshot/service.rs | 49 ++++++++++++++- ethcore/src/snapshot/tests/helpers.rs | 2 +- ethcore/src/snapshot/tests/mod.rs | 17 +++++- ethcore/src/snapshot/tests/state.rs | 4 +- 6 files changed, 156 insertions(+), 6 deletions(-) diff --git a/ethcore/src/snapshot/io.rs b/ethcore/src/snapshot/io.rs index ae8a83b21..cd57b35d3 100644 --- a/ethcore/src/snapshot/io.rs +++ b/ethcore/src/snapshot/io.rs @@ -340,4 +340,92 @@ impl SnapshotReader for LooseReader { Ok(buf) } +} + +#[cfg(test)] +mod tests { + use devtools::RandomTempPath; + use util::sha3::Hashable; + + use snapshot::ManifestData; + use super::{SnapshotWriter, SnapshotReader, PackedWriter, PackedReader, LooseWriter, LooseReader}; + + const STATE_CHUNKS: &'static [&'static [u8]] = &[b"dog", b"cat", b"hello world", b"hi", b"notarealchunk"]; + const BLOCK_CHUNKS: &'static [&'static [u8]] = &[b"hello!", b"goodbye!", b"abcdefg", b"hijklmnop", b"qrstuvwxy", b"and", b"z"]; + + #[test] + fn packed_write_and_read() { + let path = RandomTempPath::new(); + let mut writer = PackedWriter::new(path.as_path()).unwrap(); + + let mut state_hashes = Vec::new(); + let mut block_hashes = Vec::new(); + + for chunk in STATE_CHUNKS { + let hash = chunk.sha3(); + state_hashes.push(hash.clone()); + writer.write_state_chunk(hash, chunk).unwrap(); + } + + for chunk in BLOCK_CHUNKS { + let hash = chunk.sha3(); + block_hashes.push(hash.clone()); + writer.write_block_chunk(chunk.sha3(), chunk).unwrap(); + } + + let manifest = ManifestData { + state_hashes: state_hashes, + block_hashes: block_hashes, + state_root: b"notarealroot".sha3(), + block_number: 12345678987654321, + block_hash: b"notarealblock".sha3(), + }; + + writer.finish(manifest.clone()).unwrap(); + + let reader = PackedReader::new(path.as_path()).unwrap().unwrap(); + assert_eq!(reader.manifest(), &manifest); + + for hash in manifest.state_hashes.iter().chain(&manifest.block_hashes) { + reader.chunk(hash.clone()).unwrap(); + } + } + + #[test] + fn loose_write_and_read() { + let path = RandomTempPath::new(); + let mut writer = LooseWriter::new(path.as_path().into()).unwrap(); + + let mut state_hashes = Vec::new(); + let mut block_hashes = Vec::new(); + + for chunk in STATE_CHUNKS { + let hash = chunk.sha3(); + state_hashes.push(hash.clone()); + writer.write_state_chunk(hash, chunk).unwrap(); + } + + for chunk in BLOCK_CHUNKS { + let hash = chunk.sha3(); + block_hashes.push(hash.clone()); + writer.write_block_chunk(chunk.sha3(), chunk).unwrap(); + } + + let manifest = ManifestData { + state_hashes: state_hashes, + block_hashes: block_hashes, + state_root: b"notarealroot".sha3(), + block_number: 12345678987654321, + block_hash: b"notarealblock".sha3(), + }; + + writer.finish(manifest.clone()).unwrap(); + + let reader = LooseReader::new(path.as_path().into()).unwrap(); + assert_eq!(reader.manifest(), &manifest); + + for hash in manifest.state_hashes.iter().chain(&manifest.block_hashes) { + reader.chunk(hash.clone()).unwrap(); + } + } } \ No newline at end of file diff --git a/ethcore/src/snapshot/mod.rs b/ethcore/src/snapshot/mod.rs index 89e4ed8ba..2a81b967d 100644 --- a/ethcore/src/snapshot/mod.rs +++ b/ethcore/src/snapshot/mod.rs @@ -653,4 +653,4 @@ impl BlockRebuilder { } } } -} +} \ No newline at end of file diff --git a/ethcore/src/snapshot/service.rs b/ethcore/src/snapshot/service.rs index 9f2b3f34a..40f629ad9 100644 --- a/ethcore/src/snapshot/service.rs +++ b/ethcore/src/snapshot/service.rs @@ -40,7 +40,7 @@ use util::kvdb::{Database, DatabaseConfig}; use util::snappy; /// Statuses for restorations. -#[derive(PartialEq, Clone, Copy, Debug)] +#[derive(PartialEq, Eq, Clone, Copy, Debug)] pub enum RestorationStatus { /// No restoration. Inactive, @@ -519,3 +519,50 @@ impl SnapshotService for Service { .expect("snapshot service and io service are kept alive by client service; qed"); } } + +#[cfg(test)] +mod tests { + use service::ClientIoMessage; + use io::{IoService}; + use devtools::RandomTempPath; + use tests::helpers::get_test_spec; + use util::journaldb::Algorithm; + + use snapshot::ManifestData; + use super::*; + + #[test] + fn sends_async_messages() { + let service = IoService::::start().unwrap(); + + let dir = RandomTempPath::new(); + let mut dir = dir.as_path().to_owned(); + dir.push("pruning"); + dir.push("db"); + + let service = Service::new( + &get_test_spec(), + Algorithm::Archive, + dir, + service.channel() + ).unwrap(); + + assert!(service.manifest().is_none()); + assert!(service.chunk(Default::default()).is_none()); + assert_eq!(service.status(), RestorationStatus::Inactive); + assert_eq!(service.chunks_done(), (0, 0)); + + let manifest = ManifestData { + state_hashes: vec![], + block_hashes: vec![], + state_root: Default::default(), + block_number: 0, + block_hash: Default::default(), + }; + + service.begin_restore(manifest); + service.abort_restore(); + service.restore_state_chunk(Default::default(), vec![]); + service.restore_block_chunk(Default::default(), vec![]); + } +} \ No newline at end of file diff --git a/ethcore/src/snapshot/tests/helpers.rs b/ethcore/src/snapshot/tests/helpers.rs index bdf6a6a6a..34c57df67 100644 --- a/ethcore/src/snapshot/tests/helpers.rs +++ b/ethcore/src/snapshot/tests/helpers.rs @@ -78,7 +78,7 @@ impl StateProducer { let new_accs = rng.gen::() % 5; for _ in 0..new_accs { - let address_hash = H256::random(); + let address_hash = H256(rng.gen()); let balance: usize = rng.gen(); let nonce: usize = rng.gen(); let acc = ::state::Account::new_basic(balance.into(), nonce.into()).rlp(); diff --git a/ethcore/src/snapshot/tests/mod.rs b/ethcore/src/snapshot/tests/mod.rs index e8c288ebb..84096bead 100644 --- a/ethcore/src/snapshot/tests/mod.rs +++ b/ethcore/src/snapshot/tests/mod.rs @@ -19,4 +19,19 @@ mod blocks; mod state; -pub mod helpers; \ No newline at end of file +pub mod helpers; + +use super::ManifestData; + +#[test] +fn manifest_rlp() { + let manifest = ManifestData { + block_hashes: Vec::new(), + state_hashes: Vec::new(), + block_number: 1234567, + state_root: Default::default(), + block_hash: Default::default(), + }; + let raw = manifest.clone().into_rlp(); + assert_eq!(ManifestData::from_rlp(&raw).unwrap(), manifest); +} \ No newline at end of file diff --git a/ethcore/src/snapshot/tests/state.rs b/ethcore/src/snapshot/tests/state.rs index fba6d56f6..e1d4df5f9 100644 --- a/ethcore/src/snapshot/tests/state.rs +++ b/ethcore/src/snapshot/tests/state.rs @@ -20,7 +20,7 @@ use snapshot::{chunk_state, Progress, StateRebuilder}; use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter}; use super::helpers::{compare_dbs, StateProducer}; -use rand; +use rand::{XorShiftRng, SeedableRng}; use util::hash::H256; use util::journaldb::{self, Algorithm}; use util::kvdb::{Database, DatabaseConfig}; @@ -33,7 +33,7 @@ use std::sync::Arc; #[test] fn snap_and_restore() { let mut producer = StateProducer::new(); - let mut rng = rand::thread_rng(); + let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]); let mut old_db = MemoryDB::new(); let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS);