diff --git a/ethcore/res/ethereum/tests b/ethcore/res/ethereum/tests index 9b722a014..b6aa0947a 160000 --- a/ethcore/res/ethereum/tests +++ b/ethcore/res/ethereum/tests @@ -1 +1 @@ -Subproject commit 9b722a014a2b2c9ea6eac456fe01a5c3dd1042a8 +Subproject commit b6aa0947a8e20f4140dd2647882791be6ceb2ac5 diff --git a/ethcore/src/json_tests/difficulty.rs b/ethcore/src/json_tests/difficulty.rs new file mode 100644 index 000000000..eb599ab83 --- /dev/null +++ b/ethcore/src/json_tests/difficulty.rs @@ -0,0 +1,71 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use ethjson; +use header::Header; +use bigint::prelude::U256; +use spec::Spec; + +pub fn json_difficulty_test(json_data: &[u8], spec: Spec) -> Vec { + ::ethcore_logger::init_log(); + let tests = ethjson::test::DifficultyTest::load(json_data).unwrap(); + let engine = &spec.engine; + + for (name, test) in tests.into_iter() { + flush!(" - {}...", name); + println!(" - {}...", name); + + let mut parent_header = Header::new(); + let block_number: u64 = test.current_block_number.into(); + parent_header.set_number(block_number - 1); + parent_header.set_gas_limit(0x20000.into()); + parent_header.set_timestamp(test.parent_timestamp.into()); + parent_header.set_difficulty(test.parent_difficulty.into()); + parent_header.set_uncles_hash(test.parent_uncles.into()); + let mut header = Header::new(); + header.set_number(block_number); + header.set_timestamp(test.current_timestamp.into()); + engine.populate_from_parent(&mut header, &parent_header); + let expected_difficulty: U256 = test.current_difficulty.into(); + assert_eq!(header.difficulty(), &expected_difficulty); + flushln!("ok"); + } + vec![] +} + +mod difficulty_test_byzantium { + use super::json_difficulty_test; + + fn do_json_test(json_data: &[u8]) -> Vec { + json_difficulty_test(json_data, ::ethereum::new_byzantium_test()) + } + + declare_test!{DifficultyTests_difficultyByzantium, "BasicTests/difficultyByzantium.json"} +} + + +mod difficulty_test_foundation { + use super::json_difficulty_test; + + fn do_json_test(json_data: &[u8]) -> Vec { + json_difficulty_test(json_data, ::ethereum::new_foundation(&::std::env::temp_dir())) + } + + declare_test!{DifficultyTests_difficultyMainNetwork, "BasicTests/difficultyMainNetwork.json"} +} + + + diff --git a/ethcore/src/json_tests/mod.rs b/ethcore/src/json_tests/mod.rs index ab3205d18..a0966a2d2 100644 --- a/ethcore/src/json_tests/mod.rs +++ b/ethcore/src/json_tests/mod.rs @@ -22,3 +22,4 @@ mod executive; mod state; mod chain; mod trie; +mod difficulty; diff --git a/json/src/lib.rs b/json/src/lib.rs index 4af7384a0..fffeb0824 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -31,3 +31,4 @@ pub mod maybe; pub mod state; pub mod transaction; pub mod misc; +pub mod test; diff --git a/json/src/test/mod.rs b/json/src/test/mod.rs new file mode 100644 index 000000000..1a6e4db7d --- /dev/null +++ b/json/src/test/mod.rs @@ -0,0 +1,67 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Additional test structures deserialization. + +use std::collections::BTreeMap; +use std::io::Read; +use serde_json; +use serde_json::Error; +use hash::H256; +use uint::Uint; + +/// Blockchain test header deserializer. +#[derive(Debug, PartialEq, Deserialize)] +pub struct DifficultyTestCase { + /// Parent timestamp. + #[serde(rename="parentTimestamp")] + pub parent_timestamp: Uint, + /// Parent difficulty. + #[serde(rename="parentDifficulty")] + pub parent_difficulty: Uint, + /// Parent uncle hash. + #[serde(rename="parentUncles")] + pub parent_uncles: H256, + /// Current timestamp. + #[serde(rename="currentTimestamp")] + pub current_timestamp: Uint, + /// Current difficulty. + #[serde(rename="currentDifficulty")] + pub current_difficulty: Uint, + /// Current block number. + #[serde(rename="currentBlockNumber")] + pub current_block_number: Uint, +} +/// Blockchain test deserializer. +#[derive(Debug, PartialEq, Deserialize)] +pub struct DifficultyTest(BTreeMap); + +impl IntoIterator for DifficultyTest { + type Item = as IntoIterator>::Item; + type IntoIter = as IntoIterator>::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl DifficultyTest { + /// Loads test from json. + pub fn load(reader: R) -> Result where R: Read { + serde_json::from_reader(reader) + } +} +