commit
						c837c3164a
					
				@ -82,7 +82,8 @@ impl From<ethjson::blockchain::Account> for PodAccount {
 | 
			
		||||
			code: a.code.into(),
 | 
			
		||||
			storage: a.storage.into_iter().fold(BTreeMap::new(), |mut acc, (key, value)| {
 | 
			
		||||
				let key: U256 = key.into();
 | 
			
		||||
				acc.insert(H256::from(key), value.into());
 | 
			
		||||
				let value: U256 = value.into();
 | 
			
		||||
				acc.insert(H256::from(key), H256::from(value));
 | 
			
		||||
				acc
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,7 @@ pub struct Account {
 | 
			
		||||
	/// Nonce.
 | 
			
		||||
	pub nonce: Uint,
 | 
			
		||||
	/// Storage.
 | 
			
		||||
	pub storage: BTreeMap<Uint, H256>,
 | 
			
		||||
	pub storage: BTreeMap<Uint, Uint>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
 | 
			
		||||
@ -37,9 +37,10 @@ use ethcore::ethereum;
 | 
			
		||||
use ethcore::client::{BlockChainClient, Client, ClientConfig};
 | 
			
		||||
use devtools::RandomTempPath;
 | 
			
		||||
use util::IoChannel;
 | 
			
		||||
use rpc::v1::tests::helpers::{TestSyncProvider, Config as SyncConfig, TestMinerService, TestAccountProvider};
 | 
			
		||||
use rpc::v1::{Eth, EthClient};
 | 
			
		||||
use rpc::v1::tests::helpers::{TestSyncProvider, Config as SyncConfig, TestMinerService, TestAccountProvider, TestAccount};
 | 
			
		||||
use rpc::v1::{Eth, EthClient, EthFilter, EthFilterClient};
 | 
			
		||||
use util::panics::MayPanic;
 | 
			
		||||
use util::hash::Address;
 | 
			
		||||
 | 
			
		||||
const USAGE: &'static str = r#"
 | 
			
		||||
Parity rpctest client.
 | 
			
		||||
@ -86,8 +87,9 @@ impl Configuration {
 | 
			
		||||
			process::exit(1);
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		let	tests: ethjson::blockchain::Test = serde_json::from_reader(file).unwrap_or_else(|_| {
 | 
			
		||||
		let	tests: ethjson::blockchain::Test = serde_json::from_reader(file).unwrap_or_else(|err| {
 | 
			
		||||
			println!("Invalid json file.");
 | 
			
		||||
			println!("{:?}", err);
 | 
			
		||||
			process::exit(2);
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
@ -117,9 +119,12 @@ impl Configuration {
 | 
			
		||||
			}));
 | 
			
		||||
 | 
			
		||||
			let miner = Arc::new(TestMinerService::default());
 | 
			
		||||
			let accounts = Arc::new(TestAccountProvider::new(HashMap::new()));
 | 
			
		||||
			let mut accs = HashMap::new();
 | 
			
		||||
			accs.insert(Address::from(1), TestAccount::new("test"));
 | 
			
		||||
			let accounts = Arc::new(TestAccountProvider::new(accs));
 | 
			
		||||
			let server = rpc::RpcServer::new();
 | 
			
		||||
			server.add_delegate(EthClient::new(&client, &sync, &accounts, &miner).to_delegate());
 | 
			
		||||
			server.add_delegate(EthFilterClient::new(&client, &miner).to_delegate());
 | 
			
		||||
 | 
			
		||||
			let url = format!("{}:{}", self.args.flag_jsonrpc_addr, self.args.flag_jsonrpc_port);
 | 
			
		||||
			let panic_handler = server.start_http(url.as_ref(), "*", 1);
 | 
			
		||||
 | 
			
		||||
@ -103,7 +103,8 @@ impl<C, S, A, M, EM> EthClient<C, S, A, M, EM>
 | 
			
		||||
					timestamp: U256::from(view.timestamp()),
 | 
			
		||||
					difficulty: view.difficulty(),
 | 
			
		||||
					total_difficulty: total_difficulty,
 | 
			
		||||
					uncles: vec![],
 | 
			
		||||
					nonce: view.seal().get(1).map_or_else(H64::zero, |r| H64::from_slice(r)),
 | 
			
		||||
					uncles: block_view.uncle_hashes(),
 | 
			
		||||
					transactions: {
 | 
			
		||||
						if include_txs {
 | 
			
		||||
							BlockTransactions::Full(block_view.localized_transactions().into_iter().map(From::from).collect())
 | 
			
		||||
@ -111,7 +112,7 @@ impl<C, S, A, M, EM> EthClient<C, S, A, M, EM>
 | 
			
		||||
							BlockTransactions::Hashes(block_view.transaction_hashes())
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					extra_data: Bytes::default()
 | 
			
		||||
					extra_data: Bytes::new(view.extra_data())
 | 
			
		||||
				};
 | 
			
		||||
				to_value(&block)
 | 
			
		||||
			},
 | 
			
		||||
@ -229,8 +230,8 @@ impl<C, S, A, M, EM> Eth for EthClient<C, S, A, M, EM>
 | 
			
		||||
	fn block_transaction_count_by_hash(&self, params: Params) -> Result<Value, Error> {
 | 
			
		||||
		from_params::<(H256,)>(params)
 | 
			
		||||
			.and_then(|(hash,)| // match
 | 
			
		||||
				to_value(&take_weak!(self.client).block(BlockId::Hash(hash))
 | 
			
		||||
					.map_or_else(U256::zero, |bytes| U256::from(BlockView::new(&bytes).transactions_count()))))
 | 
			
		||||
				take_weak!(self.client).block(BlockId::Hash(hash))
 | 
			
		||||
					.map_or(Ok(Value::Null), |bytes| to_value(&U256::from(BlockView::new(&bytes).transactions_count()))))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn block_transaction_count_by_number(&self, params: Params) -> Result<Value, Error> {
 | 
			
		||||
@ -239,24 +240,24 @@ impl<C, S, A, M, EM> Eth for EthClient<C, S, A, M, EM>
 | 
			
		||||
				BlockNumber::Pending => to_value(
 | 
			
		||||
					&U256::from(take_weak!(self.miner).status().transactions_in_pending_block)
 | 
			
		||||
				),
 | 
			
		||||
				_ => to_value(&take_weak!(self.client).block(block_number.into())
 | 
			
		||||
						.map_or_else(U256::zero, |bytes| U256::from(BlockView::new(&bytes).transactions_count())))
 | 
			
		||||
				_ => take_weak!(self.client).block(block_number.into())
 | 
			
		||||
						.map_or(Ok(Value::Null), |bytes| to_value(&U256::from(BlockView::new(&bytes).transactions_count())))
 | 
			
		||||
			})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn block_uncles_count_by_hash(&self, params: Params) -> Result<Value, Error> {
 | 
			
		||||
		from_params::<(H256,)>(params)
 | 
			
		||||
			.and_then(|(hash,)|
 | 
			
		||||
				to_value(&take_weak!(self.client).block(BlockId::Hash(hash))
 | 
			
		||||
					.map_or_else(U256::zero, |bytes| U256::from(BlockView::new(&bytes).uncles_count()))))
 | 
			
		||||
				take_weak!(self.client).block(BlockId::Hash(hash))
 | 
			
		||||
					.map_or(Ok(Value::Null), |bytes| to_value(&U256::from(BlockView::new(&bytes).uncles_count()))))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn block_uncles_count_by_number(&self, params: Params) -> Result<Value, Error> {
 | 
			
		||||
		from_params::<(BlockNumber,)>(params)
 | 
			
		||||
			.and_then(|(block_number,)| match block_number {
 | 
			
		||||
				BlockNumber::Pending => to_value(&U256::from(0)),
 | 
			
		||||
				_ => to_value(&take_weak!(self.client).block(block_number.into())
 | 
			
		||||
						.map_or_else(U256::zero, |bytes| U256::from(BlockView::new(&bytes).uncles_count())))
 | 
			
		||||
				_ => take_weak!(self.client).block(block_number.into())
 | 
			
		||||
						.map_or(Ok(Value::Null), |bytes| to_value(&U256::from(BlockView::new(&bytes).uncles_count())))
 | 
			
		||||
			})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -224,7 +224,7 @@ fn rpc_eth_block_transaction_count_by_hash() {
 | 
			
		||||
		"params": ["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],
 | 
			
		||||
		"id": 1
 | 
			
		||||
	}"#;
 | 
			
		||||
	let response = r#"{"jsonrpc":"2.0","result":"0x00","id":1}"#;
 | 
			
		||||
	let response = r#"{"jsonrpc":"2.0","result":null,"id":1}"#;
 | 
			
		||||
 | 
			
		||||
	assert_eq!(EthTester::default().io.handle_request(request), Some(response.to_owned()));
 | 
			
		||||
}
 | 
			
		||||
@ -264,7 +264,7 @@ fn rpc_eth_uncle_count_by_block_hash() {
 | 
			
		||||
		"params": ["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],
 | 
			
		||||
		"id": 1
 | 
			
		||||
	}"#;
 | 
			
		||||
	let response = r#"{"jsonrpc":"2.0","result":"0x00","id":1}"#;
 | 
			
		||||
	let response = r#"{"jsonrpc":"2.0","result":null,"id":1}"#;
 | 
			
		||||
 | 
			
		||||
	assert_eq!(EthTester::default().io.handle_request(request), Some(response.to_owned()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,7 @@ impl MinerService for TestMinerService {
 | 
			
		||||
		where T: Fn(&Address) -> AccountDetails { unimplemented!(); }
 | 
			
		||||
 | 
			
		||||
	/// Returns hashes of transactions currently in pending
 | 
			
		||||
	fn pending_transactions_hashes(&self) -> Vec<H256> { unimplemented!(); }
 | 
			
		||||
	fn pending_transactions_hashes(&self) -> Vec<H256> { vec![] }
 | 
			
		||||
 | 
			
		||||
	/// Removes all transactions from the queue and restart mining operation.
 | 
			
		||||
	fn clear_and_reset(&self, _chain: &BlockChainClient) { unimplemented!(); }
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,8 @@ pub struct Block {
 | 
			
		||||
	pub difficulty: U256,
 | 
			
		||||
	#[serde(rename="totalDifficulty")]
 | 
			
		||||
	pub total_difficulty: U256,
 | 
			
		||||
	pub uncles: Vec<U256>,
 | 
			
		||||
	pub nonce: H64,
 | 
			
		||||
	pub uncles: Vec<H256>,
 | 
			
		||||
	pub transactions: BlockTransactions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -78,7 +79,7 @@ mod tests {
 | 
			
		||||
	fn test_serialize_block_transactions() {
 | 
			
		||||
		let t = BlockTransactions::Full(vec![Transaction::default()]);
 | 
			
		||||
		let serialized = serde_json::to_string(&t).unwrap();
 | 
			
		||||
		assert_eq!(serialized, r#"[{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x00","blockHash":null,"blockNumber":null,"transactionIndex":null,"from":"0x0000000000000000000000000000000000000000","to":null,"value":"0x00","gasPrice":"0x00","gas":"0x00","input":"0x00"}]"#);
 | 
			
		||||
		assert_eq!(serialized, r#"[{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x00","blockHash":null,"blockNumber":null,"transactionIndex":null,"from":"0x0000000000000000000000000000000000000000","to":null,"value":"0x00","gasPrice":"0x00","gas":"0x00","input":"0x"}]"#);
 | 
			
		||||
 | 
			
		||||
		let t = BlockTransactions::Hashes(vec![H256::default()]);
 | 
			
		||||
		let serialized = serde_json::to_string(&t).unwrap();
 | 
			
		||||
@ -104,11 +105,12 @@ mod tests {
 | 
			
		||||
			timestamp: U256::default(),
 | 
			
		||||
			difficulty: U256::default(),
 | 
			
		||||
			total_difficulty: U256::default(),
 | 
			
		||||
			nonce: H64::default(),
 | 
			
		||||
			uncles: vec![],
 | 
			
		||||
			transactions: BlockTransactions::Hashes(vec![])
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		let serialized = serde_json::to_string(&block).unwrap();
 | 
			
		||||
		assert_eq!(serialized, r#"{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","sha3Uncles":"0x0000000000000000000000000000000000000000000000000000000000000000","author":"0x0000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","number":"0x00","gasUsed":"0x00","gasLimit":"0x00","extraData":"0x00","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x00","difficulty":"0x00","totalDifficulty":"0x00","uncles":[],"transactions":[]}"#);
 | 
			
		||||
		assert_eq!(serialized, r#"{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","sha3Uncles":"0x0000000000000000000000000000000000000000000000000000000000000000","author":"0x0000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","number":"0x00","gasUsed":"0x00","gasLimit":"0x00","extraData":"0x","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x00","difficulty":"0x00","totalDifficulty":"0x00","nonce":"0x0000000000000000","uncles":[],"transactions":[]}"#);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ use serde::de::Visitor;
 | 
			
		||||
use util::common::FromHex;
 | 
			
		||||
 | 
			
		||||
/// Wrapper structure around vector of bytes.
 | 
			
		||||
#[derive(Debug, PartialEq)]
 | 
			
		||||
#[derive(Debug, PartialEq, Default)]
 | 
			
		||||
pub struct Bytes(Vec<u8>);
 | 
			
		||||
 | 
			
		||||
impl Bytes {
 | 
			
		||||
@ -31,13 +31,6 @@ impl Bytes {
 | 
			
		||||
	pub fn to_vec(self) -> Vec<u8> { let Bytes(x) = self; x }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Bytes {
 | 
			
		||||
	fn default() -> Self {
 | 
			
		||||
		// default serialized value is 0x00
 | 
			
		||||
		Bytes(vec![0])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Serialize for Bytes {
 | 
			
		||||
	fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
 | 
			
		||||
	where S: Serializer {
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,7 @@ mod tests {
 | 
			
		||||
	fn test_transaction_serialize() {
 | 
			
		||||
		let t = Transaction::default();
 | 
			
		||||
		let serialized = serde_json::to_string(&t).unwrap();
 | 
			
		||||
		assert_eq!(serialized, r#"{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x00","blockHash":null,"blockNumber":null,"transactionIndex":null,"from":"0x0000000000000000000000000000000000000000","to":null,"value":"0x00","gasPrice":"0x00","gas":"0x00","input":"0x00"}"#);
 | 
			
		||||
		assert_eq!(serialized, r#"{"hash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x00","blockHash":null,"blockNumber":null,"transactionIndex":null,"from":"0x0000000000000000000000000000000000000000","to":null,"value":"0x00","gasPrice":"0x00","gas":"0x00","input":"0x"}"#);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user