2019-01-07 11:33:07 +01:00
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
// This file is part of Parity Ethereum.
2016-06-21 14:55:25 +02:00
2019-01-07 11:33:07 +01:00
// Parity Ethereum is free software: you can redistribute it and/or modify
2016-06-21 14:55:25 +02:00
// 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.
2019-01-07 11:33:07 +01:00
// Parity Ethereum is distributed in the hope that it will be useful,
2016-06-21 14:55:25 +02:00
// 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
2019-01-07 11:33:07 +01:00
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
2016-06-21 14:55:25 +02:00
2020-08-05 06:08:03 +02:00
use ethereum_types ::{ Address , U256 } ;
2017-07-06 11:26:14 +02:00
use rustc_hex ::FromHex ;
2020-08-05 06:08:03 +02:00
use std ::{ str ::FromStr , sync ::Arc } ;
2016-11-06 12:51:53 +01:00
2020-08-05 06:08:03 +02:00
use ethcore ::{ client ::TestBlockChainClient , miner ::MinerService } ;
2018-04-10 12:13:49 +02:00
use sync ::ManageNetwork ;
2016-06-21 14:55:25 +02:00
2016-11-06 12:51:53 +01:00
use super ::manage_network ::TestManageNetwork ;
2020-08-05 06:08:03 +02:00
use jsonrpc_core ::IoHandler ;
2020-08-14 12:24:16 +02:00
use v1 ::{ tests ::helpers ::TestMinerService , ParitySet , ParitySetClient } ;
2016-11-06 12:51:53 +01:00
2018-04-11 11:59:04 +02:00
use fake_fetch ::FakeFetch ;
2016-06-21 14:55:25 +02:00
fn miner_service ( ) -> Arc < TestMinerService > {
2020-08-05 06:08:03 +02:00
Arc ::new ( TestMinerService ::default ( ) )
2016-06-21 14:55:25 +02:00
}
2016-07-05 17:50:46 +02:00
fn client_service ( ) -> Arc < TestBlockChainClient > {
2020-08-05 06:08:03 +02:00
Arc ::new ( TestBlockChainClient ::default ( ) )
2016-07-05 17:50:46 +02:00
}
2016-07-11 17:02:42 +02:00
fn network_service ( ) -> Arc < TestManageNetwork > {
2020-08-05 06:08:03 +02:00
Arc ::new ( TestManageNetwork )
2016-06-21 15:13:41 +02:00
}
2020-08-05 06:08:03 +02:00
pub type TestParitySetClient =
2020-08-14 12:24:16 +02:00
ParitySetClient < TestBlockChainClient , TestMinerService , FakeFetch < usize > > ;
2016-11-06 12:51:53 +01:00
2017-05-24 12:24:07 +02:00
fn parity_set_client (
2020-08-05 06:08:03 +02:00
client : & Arc < TestBlockChainClient > ,
miner : & Arc < TestMinerService > ,
net : & Arc < TestManageNetwork > ,
2017-05-24 12:24:07 +02:00
) -> TestParitySetClient {
2020-08-05 06:08:03 +02:00
ParitySetClient ::new (
client ,
miner ,
2020-07-29 10:36:15 +02:00
& ( net . clone ( ) as Arc < dyn ManageNetwork > ) ,
2020-08-05 06:08:03 +02:00
FakeFetch ::new ( Some ( 1 ) ) ,
)
2016-06-21 14:55:25 +02:00
}
#[ test ]
2016-11-06 12:51:53 +01:00
fn rpc_parity_set_min_gas_price ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
2017-01-11 20:02:27 +01:00
2020-08-05 06:08:03 +02:00
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2016-06-21 14:55:25 +02:00
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_setMinGasPrice", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":true,"id":1}"# ;
2019-02-11 18:08:12 +01:00
2020-08-05 06:08:03 +02:00
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
2019-02-11 18:08:12 +01:00
}
#[ test ]
fn rpc_parity_set_min_gas_price_with_automated_calibration_enabled ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
* miner . min_gas_price . write ( ) = None ;
2019-02-11 18:08:12 +01:00
2020-08-05 06:08:03 +02:00
let client = client_service ( ) ;
let network = network_service ( ) ;
2019-02-11 18:08:12 +01:00
2020-08-05 06:08:03 +02:00
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2019-02-11 18:08:12 +01:00
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_setMinGasPrice", "params":["0xdeadbeef"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","error":{"code":-32000,"message":"Can't update fixed gas price while automatic gas calibration is enabled."},"id":1}"# ;
2016-06-21 14:55:25 +02:00
2020-08-05 06:08:03 +02:00
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
2016-06-21 14:55:25 +02:00
}
2016-07-05 17:50:46 +02:00
2016-06-21 14:55:25 +02:00
#[ test ]
2016-11-06 12:51:53 +01:00
fn rpc_parity_set_gas_floor_target ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_setGasFloorTarget", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":true,"id":1}"# ;
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
assert_eq! (
miner . authoring_params ( ) . gas_range_target . 0 ,
U256 ::from_str ( " cd1722f3947def4cf144679da39c4c32bdc35681 " ) . unwrap ( )
) ;
2016-06-21 14:55:25 +02:00
}
#[ test ]
2016-11-06 12:51:53 +01:00
fn rpc_parity_set_extra_data ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_setExtraData", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":true,"id":1}"# ;
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
assert_eq! (
miner . authoring_params ( ) . extra_data ,
" cd1722f3947def4cf144679da39c4c32bdc35681 "
. from_hex ( )
. unwrap ( )
) ;
2016-06-21 14:55:25 +02:00
}
#[ test ]
2016-11-06 12:51:53 +01:00
fn rpc_parity_set_author ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
2020-08-14 12:24:16 +02:00
2020-08-05 06:08:03 +02:00
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_setAuthor", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":true,"id":1}"# ;
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
assert_eq! (
miner . authoring_params ( ) . author ,
Address ::from_str ( " cd1722f3947def4cf144679da39c4c32bdc35681 " ) . unwrap ( )
) ;
2016-06-21 14:55:25 +02:00
}
#[ test ]
2016-11-06 12:51:53 +01:00
fn rpc_parity_set_transactions_limit ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
2020-08-14 12:24:16 +02:00
2020-08-05 06:08:03 +02:00
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2016-06-21 14:55:25 +02:00
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_setTransactionsLimit", "params":[10240240], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":false,"id":1}"# ;
2016-06-21 14:55:25 +02:00
2020-08-05 06:08:03 +02:00
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
2016-11-06 12:51:53 +01:00
}
#[ test ]
fn rpc_parity_set_hash_content ( ) {
2020-08-05 06:08:03 +02:00
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
2020-08-14 12:24:16 +02:00
2020-08-05 06:08:03 +02:00
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2016-11-06 12:51:53 +01:00
2020-08-05 06:08:03 +02:00
let request = r # "{"jsonrpc": "2.0", "method": "parity_hashContent", "params":["https://parity.io/assets/images/ethcore-black-horizontal.png"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":"0x2be00befcf008bc0e7d9cdefc194db9c75352e8632f48498b5a6bfce9f02c88e","id":1}"# ;
2016-11-06 12:51:53 +01:00
2020-08-05 06:08:03 +02:00
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
2016-11-06 12:51:53 +01:00
}
2017-03-19 08:46:51 +01:00
#[ test ]
fn rpc_parity_remove_transaction ( ) {
2020-08-05 06:08:03 +02:00
use types ::transaction ::{ Action , Transaction } ;
let miner = miner_service ( ) ;
let client = client_service ( ) ;
let network = network_service ( ) ;
2020-08-14 12:24:16 +02:00
2020-08-05 06:08:03 +02:00
let mut io = IoHandler ::new ( ) ;
2020-08-14 12:24:16 +02:00
io . extend_with ( parity_set_client ( & client , & miner , & network ) . to_delegate ( ) ) ;
2020-08-05 06:08:03 +02:00
let tx = Transaction {
nonce : 1. into ( ) ,
gas_price : 0x9184e72a000 u64 . into ( ) ,
gas : 0x76c0 . into ( ) ,
action : Action ::Call ( 5. into ( ) ) ,
value : 0x9184e72a u64 . into ( ) ,
data : vec ! [ ] ,
} ;
let signed = tx . fake_sign ( 2. into ( ) ) ;
let hash = signed . hash ( ) ;
let request = r # "{"jsonrpc": "2.0", "method": "parity_removeTransaction", "params":[""#
. to_owned ( )
+ & format! ( " 0x {:x} " , hash )
+ r # ""], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":{"blockHash":null,"blockNumber":null,"chainId":null,"condition":null,"creates":null,"from":"0x0000000000000000000000000000000000000002","gas":"0x76c0","gasPrice":"0x9184e72a000","hash":"0xa2e0da8a8064e0b9f93e95a53c2db6d01280efb8ac72a708d25487e67dd0f8fc","input":"0x","nonce":"0x1","publicKey":null,"r":"0x1","raw":"0xe9018609184e72a0008276c0940000000000000000000000000000000000000005849184e72a80800101","s":"0x1","standardV":"0x4","to":"0x0000000000000000000000000000000000000005","transactionIndex":null,"v":"0x0","value":"0x9184e72a"},"id":1}"# ;
miner . pending_transactions . lock ( ) . insert ( hash , signed ) ;
assert_eq! ( io . handle_request_sync ( & request ) , Some ( response . to_owned ( ) ) ) ;
2017-03-19 08:46:51 +01:00
}
2019-02-07 14:34:24 +01:00
#[ test ]
fn rpc_parity_set_engine_signer ( ) {
2020-08-05 06:08:03 +02:00
use accounts ::AccountProvider ;
use bytes ::ToPretty ;
use v1 ::{ impls ::ParitySetAccountsClient , traits ::ParitySetAccounts } ;
let account_provider = Arc ::new ( AccountProvider ::transient_provider ( ) ) ;
account_provider
. insert_account ( ::hash ::keccak ( " cow " ) . into ( ) , & " password " . into ( ) )
. unwrap ( ) ;
let miner = miner_service ( ) ;
let mut io = IoHandler ::new ( ) ;
io . extend_with ( ParitySetAccountsClient ::new ( & account_provider , & miner ) . to_delegate ( ) ) ;
let request = r # "{"jsonrpc": "2.0", "method": "parity_setEngineSigner", "params":["0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826", "password"], "id": 1}"# ;
let response = r # "{"jsonrpc":"2.0","result":true,"id":1}"# ;
assert_eq! ( io . handle_request_sync ( request ) , Some ( response . to_owned ( ) ) ) ;
assert_eq! (
miner . authoring_params ( ) . author ,
Address ::from_str ( " cd2a3d9f938e13cd947ec05abc7fe734df8dd826 " ) . unwrap ( )
) ;
let signature = miner
. signer
. read ( )
. as_ref ( )
. unwrap ( )
. sign ( ::hash ::keccak ( " x " ) )
. unwrap ( )
. to_vec ( ) ;
assert_eq! ( & format! ( " {} " , signature . pretty ( ) ) , " 6f46069ded2154af6e806706e4f7f6fd310ac45f3c6dccb85f11c0059ee20a09245df0a0008bb84a10882b1298284bc93058e7bc5938ea728e77620061687a6401 " ) ;
2019-02-07 14:34:24 +01:00
}