bridge::deposit_relay tests init

This commit is contained in:
debris 2017-08-25 11:58:47 +02:00
parent 8abf7999f3
commit b6d4834400
6 changed files with 169 additions and 12 deletions

16
Cargo.lock generated
View File

@ -5,6 +5,7 @@ dependencies = [
"bridge 0.1.0",
"futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
"jsonrpc-core 7.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"pretty_assertions 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"web3 0.0.5 (git+https://github.com/tomusdrw/rust-web3?branch=bridge)",
]
@ -142,6 +143,11 @@ dependencies = [
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "difference"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "docopt"
version = "0.8.1"
@ -470,6 +476,14 @@ name = "percent-encoding"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "pretty_assertions"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "quote"
version = "0.3.15"
@ -865,6 +879,7 @@ dependencies = [
"checksum conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299"
"checksum custom_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9"
"checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"
"checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8"
"checksum docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3b5b93718f8b3e5544fcc914c43de828ca6c6ace23e0332c6080a2977b49787a"
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
"checksum env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "15abd780e45b3ea4f76b4e9a26ff4843258dd8a3eed2775a0e7368c2e7936c2f"
@ -904,6 +919,7 @@ dependencies = [
"checksum parking_lot 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2f213159e512f8376b31539ff28708164963357c59394747aa24c82a12633dca"
"checksum parking_lot_core 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a25dd36576d01cca115881dc920b1f0dd0037303ed8cfa0c5d0a4966151757f7"
"checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
"checksum pretty_assertions 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d510007841e87c7a6d829a36f7f0acb72aef12e38cc89073fe39810c1d976ac"
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
"checksum rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf"
"checksum redox_syscall 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "8312fba776a49cf390b7b62f3135f9b294d8617f7a7592cfd0ac2492b658cd7b"

View File

@ -11,9 +11,9 @@ use database::Database;
use error::Error;
pub use self::deploy::{Deploy, Deployed, create_deploy};
use self::deposit_relay::{DepositRelay, create_deposit_relay};
use self::withdraw_relay::{WithdrawRelay, create_withdraw_relay};
use self::withdraw_confirm::{WithdrawConfirm, create_withdraw_confirm};
pub use self::deposit_relay::{DepositRelay, create_deposit_relay};
pub use self::withdraw_relay::{WithdrawRelay, create_withdraw_relay};
pub use self::withdraw_confirm::{WithdrawConfirm, create_withdraw_confirm};
/// Last block checked by the bridge components.
#[derive(Clone, Copy)]
@ -68,7 +68,7 @@ impl<T: Transport> Stream for Bridge<T> {
some => return Ok(some.into()),
},
};
self.state = next_state;
}
}

View File

@ -6,7 +6,7 @@ use toml;
use error::{Error, ResultExt, ErrorKind};
/// Application "database".
#[derive(Debug, PartialEq, Deserialize, Serialize)]
#[derive(Debug, PartialEq, Deserialize, Serialize, Default)]
pub struct Database {
/// Address of mainnet contract.
pub mainnet_contract_address: Address,
@ -64,7 +64,7 @@ mod tests {
#[test]
fn databse_to_and_from_str() {
let toml =
let toml =
r#"mainnet_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db7"
testnet_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db8"
mainnet_deploy = 100

View File

@ -9,3 +9,4 @@ futures = "0.1"
jsonrpc-core = "7.0"
web3 = { git = "https://github.com/tomusdrw/rust-web3", branch = "bridge" }
serde_json = "1.0"
pretty_assertions = "0.2.1"

View File

@ -3,6 +3,8 @@ extern crate futures;
extern crate jsonrpc_core as rpc;
extern crate web3;
extern crate bridge;
#[macro_use]
extern crate pretty_assertions;
use std::cell::RefCell;
use futures::Future;
@ -13,6 +15,16 @@ pub struct MockedTransport {
pub mocked_responses: Vec<&'static str>,
}
impl MockedTransport {
pub fn compare_requests(&self, expected: &[(&str, &str)]) {
let requests_borrow = self.requests.borrow();
let requests: Vec<_> = requests_borrow.iter()
.map(|&(ref l, ref r)| (l as &str, r as &str))
.collect();
assert_eq!(expected, &requests as &[_]);
}
}
impl Transport for MockedTransport {
type Out = web3::Result<rpc::Value>;
@ -32,7 +44,12 @@ impl Transport for MockedTransport {
#[macro_export]
macro_rules! test_transport_stream {
(name => $name: ident, init => $init_stream: expr, expected => $expected: expr, $($method: expr => req => $req: expr, res => $res: expr ;)*) => {
(
name => $name: ident,
init => $init_stream: expr,
expected => $expected: expr,
$($method: expr => req => $req: expr, res => $res: expr ;)*
) => {
#[test]
fn $name() {
use self::futures::{Future, Stream};
@ -44,12 +61,95 @@ macro_rules! test_transport_stream {
let stream = $init_stream(&transport);
let res = stream.collect().wait().unwrap();
let expected_requests: Vec<_> = vec![$($method),*].into_iter().zip(vec![$($req),*].into_iter()).collect();
let requests_borrow = transport.requests.borrow();
let requests: Vec<_> = requests_borrow.iter()
.map(|&(ref l, ref r)| (l as &str, r as &str))
.collect();
assert_eq!(expected_requests, requests);
transport.compare_requests(&expected_requests);
assert_eq!($expected, res);
}
}
}
#[macro_export]
macro_rules! test_app_stream {
(
name => $name: ident,
database => $db: expr,
mainnet => account => $mainnet_acc: expr, confirmations => $mainnet_conf: expr;
testnet => account => $testnet_acc: expr, confirmations => $testnet_conf: expr;
authorities => accounts => $authorities_accs: expr, signatures => $signatures: expr;
init => $init_stream: expr,
expected => $expected: expr,
mainnet_transport => [$($mainnet_method: expr => req => $mainnet_req: expr, res => $mainnet_res: expr ;)*],
testnet_transport => [$($testnet_method: expr => req => $testnet_req: expr, res => $testnet_res: expr ;)*]
) => {
#[test]
fn $name() {
use self::std::sync::Arc;
use self::std::time::Duration;
use self::futures::{Future, Stream};
use self::bridge::app::{App, Connections};
use self::bridge::contracts::{testnet, mainnet};
use self::bridge::config::{Config, Authorities, Node, ContractConfig, Transactions};
use self::bridge::database::Database;
let mainnet = $crate::MockedTransport {
requests: Default::default(),
mocked_responses: vec![$($mainnet_res),*],
};
let testnet = $crate::MockedTransport {
requests: Default::default(),
mocked_responses: vec![$($testnet_res),*],
};
let config = Config {
txs: Transactions::default(),
mainnet: Node {
account: $mainnet_acc.parse().unwrap(),
ipc: "".into(),
contract: ContractConfig {
bin: Default::default(),
},
poll_interval: Duration::from_secs(0),
required_confirmations: $mainnet_conf,
},
testnet: Node {
account: $testnet_acc.parse().unwrap(),
ipc: "".into(),
contract: ContractConfig {
bin: Default::default(),
},
poll_interval: Duration::from_secs(0),
required_confirmations: $testnet_conf,
},
authorities: Authorities {
accounts: $authorities_accs.iter().map(|a: &&str| a.parse().unwrap()).collect(),
required_signatures: $signatures,
}
};
let app = App {
config,
database_path: "".into(),
connections: Connections {
mainnet: &mainnet,
testnet: &testnet,
},
mainnet_bridge: mainnet::EthereumBridge::default(),
testnet_bridge: testnet::KovanBridge::default(),
};
let app = Arc::new(app);
let stream = $init_stream(app, &$db);
let res = stream.collect().wait().unwrap();
let expected_mainnet_requests: Vec<_> = vec![$($mainnet_method),*].into_iter().zip(vec![$($mainnet_req),*].into_iter()).collect();
mainnet.compare_requests(&expected_mainnet_requests);
let expected_testnet_requests: Vec<_> = vec![$($testnet_method),*].into_iter().zip(vec![$($testnet_req),*].into_iter()).collect();
testnet.compare_requests(&expected_testnet_requests);
assert_eq!($expected, res);
}
}
}
#[cfg(test)]
mod tests {
}

View File

@ -0,0 +1,40 @@
extern crate futures;
extern crate bridge;
#[macro_use]
extern crate tests;
use bridge::bridge::create_deposit_relay;
test_app_stream! {
name => basic,
database => Database::default(),
mainnet =>
account => "0x0000000000000000000000000000000000000001",
confirmations => 12;
testnet =>
account => "0x0000000000000000000000000000000000000001",
confirmations => 12;
authorities =>
accounts => [
"0x0000000000000000000000000000000000000001",
"0x0000000000000000000000000000000000000002",
],
signatures => 1;
init => |app, db| create_deposit_relay(app, db).take(2),
expected => vec![0x1005, 0x1006],
mainnet_transport => [
"eth_blockNumber" =>
req => r#"[]"#,
res => r#""0x1011""#;
"eth_getLogs" =>
req => r#"[{"address":["0x0000000000000000000000000000000000000000"],"fromBlock":"0x1","limit":null,"toBlock":"0x1005","topics":[["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c"],[],[],[]]}]"#,
res => r#"[]"#;
"eth_blockNumber" =>
req => r#"[]"#,
res => r#""0x1012""#;
"eth_getLogs" =>
req => r#"[{"address":["0x0000000000000000000000000000000000000000"],"fromBlock":"0x1006","limit":null,"toBlock":"0x1006","topics":[["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c"],[],[],[]]}]"#,
res => r#"[]"#;
],
testnet_transport => []
}