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
This commit is contained in:
parent
da2c2e5fc6
commit
4e466f09db
@ -341,3 +341,91 @@ impl SnapshotReader for LooseReader {
|
|||||||
Ok(buf)
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -40,7 +40,7 @@ use util::kvdb::{Database, DatabaseConfig};
|
|||||||
use util::snappy;
|
use util::snappy;
|
||||||
|
|
||||||
/// Statuses for restorations.
|
/// Statuses for restorations.
|
||||||
#[derive(PartialEq, Clone, Copy, Debug)]
|
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||||
pub enum RestorationStatus {
|
pub enum RestorationStatus {
|
||||||
/// No restoration.
|
/// No restoration.
|
||||||
Inactive,
|
Inactive,
|
||||||
@ -519,3 +519,50 @@ impl SnapshotService for Service {
|
|||||||
.expect("snapshot service and io service are kept alive by client service; qed");
|
.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::<ClientIoMessage>::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![]);
|
||||||
|
}
|
||||||
|
}
|
@ -78,7 +78,7 @@ impl StateProducer {
|
|||||||
let new_accs = rng.gen::<u32>() % 5;
|
let new_accs = rng.gen::<u32>() % 5;
|
||||||
|
|
||||||
for _ in 0..new_accs {
|
for _ in 0..new_accs {
|
||||||
let address_hash = H256::random();
|
let address_hash = H256(rng.gen());
|
||||||
let balance: usize = rng.gen();
|
let balance: usize = rng.gen();
|
||||||
let nonce: usize = rng.gen();
|
let nonce: usize = rng.gen();
|
||||||
let acc = ::state::Account::new_basic(balance.into(), nonce.into()).rlp();
|
let acc = ::state::Account::new_basic(balance.into(), nonce.into()).rlp();
|
||||||
|
@ -20,3 +20,18 @@ mod blocks;
|
|||||||
mod state;
|
mod state;
|
||||||
|
|
||||||
pub mod helpers;
|
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);
|
||||||
|
}
|
@ -20,7 +20,7 @@ use snapshot::{chunk_state, Progress, StateRebuilder};
|
|||||||
use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter};
|
use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter};
|
||||||
use super::helpers::{compare_dbs, StateProducer};
|
use super::helpers::{compare_dbs, StateProducer};
|
||||||
|
|
||||||
use rand;
|
use rand::{XorShiftRng, SeedableRng};
|
||||||
use util::hash::H256;
|
use util::hash::H256;
|
||||||
use util::journaldb::{self, Algorithm};
|
use util::journaldb::{self, Algorithm};
|
||||||
use util::kvdb::{Database, DatabaseConfig};
|
use util::kvdb::{Database, DatabaseConfig};
|
||||||
@ -33,7 +33,7 @@ use std::sync::Arc;
|
|||||||
#[test]
|
#[test]
|
||||||
fn snap_and_restore() {
|
fn snap_and_restore() {
|
||||||
let mut producer = StateProducer::new();
|
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 mut old_db = MemoryDB::new();
|
||||||
let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user