From 4c9ea55e490db1d57c43536e847114e9dc15f80e Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 12 Dec 2016 03:49:50 +0100 Subject: [PATCH] Add an Updater mockup and provide a test for it. --- rpc/src/v1/tests/helpers/mod.rs | 4 +- rpc/src/v1/tests/helpers/update_service.rs | 92 ++++++++++++++++++++++ rpc/src/v1/tests/mocked/parity.rs | 18 ++++- rpc/src/v1/tests/mocked/parity_set.rs | 33 +++++--- 4 files changed, 133 insertions(+), 14 deletions(-) create mode 100644 rpc/src/v1/tests/helpers/update_service.rs diff --git a/rpc/src/v1/tests/helpers/mod.rs b/rpc/src/v1/tests/helpers/mod.rs index ce0f40271..6c97ce818 100644 --- a/rpc/src/v1/tests/helpers/mod.rs +++ b/rpc/src/v1/tests/helpers/mod.rs @@ -20,8 +20,10 @@ mod sync_provider; mod miner_service; mod fetch; mod snapshot_service; +mod update_service; pub use self::sync_provider::{Config, TestSyncProvider}; pub use self::miner_service::TestMinerService; pub use self::fetch::TestFetch; -pub use self::snapshot_service::TestSnapshotService; \ No newline at end of file +pub use self::snapshot_service::TestSnapshotService; +pub use self::update_service::TestUpdater; \ No newline at end of file diff --git a/rpc/src/v1/tests/helpers/update_service.rs b/rpc/src/v1/tests/helpers/update_service.rs new file mode 100644 index 000000000..23f1c702c --- /dev/null +++ b/rpc/src/v1/tests/helpers/update_service.rs @@ -0,0 +1,92 @@ +// Copyright 2015, 2016 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 . + +//! Test implementation of fetch client. + +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use semver::Version; +use updater::{Service as UpdateService, CapState, ReleaseInfo, VersionInfo, OperationsInfo, ReleaseTrack}; + +/// Test implementation of fetcher. Will always return the same file. +#[derive(Default)] +pub struct TestUpdater { + updated: AtomicBool, + current_block: AtomicUsize, +} + +impl TestUpdater { + /// Update the (faked) current block. + pub fn set_current_block(&self, n: usize) { + self.current_block.store(n, Ordering::Relaxed); + } +} + +impl UpdateService for TestUpdater { + fn capability(&self) -> CapState { + if self.updated.load(Ordering::Relaxed) { + CapState::Capable + } else { + if self.current_block.load(Ordering::Relaxed) < 15100 { + CapState::CapableUntil(15100) + } else { + CapState::IncapableSince(15100) + } + } + } + + fn upgrade_ready(&self) -> Option { + if self.updated.load(Ordering::Relaxed) { + None + } else { + self.info().map(|i| i.track) + } + } + + fn execute_upgrade(&self) -> bool { + if self.updated.load(Ordering::Relaxed) { + false + } else { + self.updated.store(true, Ordering::Relaxed); + true + } + } + + fn version_info(&self) -> VersionInfo { + VersionInfo { + track: ReleaseTrack::Beta, + version: Version{major: 1, minor: 5, patch: 0, build: vec![], pre: vec![]}, + hash: 150.into(), + } + } + + fn info(&self) -> Option { + Some(OperationsInfo { + fork: 15100, + this_fork: Some(15000), + track: ReleaseInfo { + version: VersionInfo { + track: ReleaseTrack::Beta, + version: Version{major: 1, minor: 5, patch: 1, build: vec![], pre: vec![]}, + hash: 151.into(), + }, + is_critical: true, + fork: 15100, + binary: Some(1510.into()), + }, + minor: None, + }) + } +} diff --git a/rpc/src/v1/tests/mocked/parity.rs b/rpc/src/v1/tests/mocked/parity.rs index 01bc37ad3..7ce356512 100644 --- a/rpc/src/v1/tests/mocked/parity.rs +++ b/rpc/src/v1/tests/mocked/parity.rs @@ -26,15 +26,16 @@ use ethstore::ethkey::{Generator, Random}; use jsonrpc_core::{IoHandler, GenericIoHandler}; use v1::{Parity, ParityClient}; use v1::helpers::{SignerService, NetworkSettings}; -use v1::tests::helpers::{TestSyncProvider, Config, TestMinerService}; +use v1::tests::helpers::{TestSyncProvider, Config, TestMinerService, TestUpdater}; use super::manage_network::TestManageNetwork; -pub type TestParityClient = ParityClient; +pub type TestParityClient = ParityClient; pub struct Dependencies { pub miner: Arc, pub client: Arc, pub sync: Arc, + pub updater: Arc, pub logger: Arc, pub settings: Arc, pub network: Arc, @@ -52,6 +53,7 @@ impl Dependencies { network_id: 3, num_peers: 120, })), + updater: Arc::new(TestUpdater::default()), logger: Arc::new(RotatingLogger::new("rpc=trace".to_owned())), settings: Arc::new(NetworkSettings { name: "mynode".to_owned(), @@ -73,6 +75,7 @@ impl Dependencies { &self.client, &self.miner, &self.sync, + &self.updater, &self.network, &self.accounts, self.logger.clone(), @@ -96,6 +99,17 @@ impl Dependencies { } } +#[test] +fn rpc_parity_consensus_capability() { + let deps = Dependencies::new(); + let io = deps.default_client(); + + let request = r#"{"jsonrpc": "2.0", "method": "parity_consensusCapability", "params": [], "id": 1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"capableUntil":15100},"id":1}"#; + + assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); +} + #[test] fn rpc_parity_extra_data() { let deps = Dependencies::new(); diff --git a/rpc/src/v1/tests/mocked/parity_set.rs b/rpc/src/v1/tests/mocked/parity_set.rs index d05c12770..53b1ab3e6 100644 --- a/rpc/src/v1/tests/mocked/parity_set.rs +++ b/rpc/src/v1/tests/mocked/parity_set.rs @@ -25,7 +25,7 @@ use ethsync::ManageNetwork; use jsonrpc_core::{IoHandler, GenericIoHandler}; use v1::{ParitySet, ParitySetClient}; -use v1::tests::helpers::{TestMinerService, TestFetch}; +use v1::tests::helpers::{TestMinerService, TestFetch, TestUpdater}; use super::manage_network::TestManageNetwork; fn miner_service() -> Arc { @@ -40,10 +40,14 @@ fn network_service() -> Arc { Arc::new(TestManageNetwork) } -pub type TestParitySetClient = ParitySetClient; +fn updater_service() -> Arc { + Arc::new(TestUpdater::default()) +} -fn parity_set_client(client: &Arc, miner: &Arc, net: &Arc) -> TestParitySetClient { - ParitySetClient::with_fetch(client, miner, &(net.clone() as Arc)) +pub type TestParitySetClient = ParitySetClient; + +fn parity_set_client(client: &Arc, miner: &Arc, updater: &Arc, net: &Arc) -> TestParitySetClient { + ParitySetClient::with_fetch(client, miner, updater, &(net.clone() as Arc)) } #[test] @@ -51,8 +55,9 @@ fn rpc_parity_set_min_gas_price() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setMinGasPrice", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; @@ -66,8 +71,9 @@ fn rpc_parity_set_gas_floor_target() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setGasFloorTarget", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; @@ -81,8 +87,9 @@ fn rpc_parity_set_extra_data() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setExtraData", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; @@ -96,8 +103,9 @@ fn rpc_parity_set_author() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setAuthor", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; @@ -111,8 +119,9 @@ fn rpc_parity_set_engine_signer() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setEngineSigner", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681", "password"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; @@ -128,8 +137,9 @@ fn rpc_parity_set_transactions_limit() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setTransactionsLimit", "params":[10240240], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; @@ -143,8 +153,9 @@ fn rpc_parity_set_hash_content() { let miner = miner_service(); let client = client_service(); let network = network_service(); + let updater = updater_service(); let io = IoHandler::new(); - io.add_delegate(parity_set_client(&client, &miner, &network).to_delegate()); + io.add_delegate(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_hashContent", "params":["https://ethcore.io/assets/images/ethcore-black-horizontal.png"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":"0x2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e","id":1}"#;