Wasm math tests extended (#6354)
* extend math tests * use latest wasm-tests * cleanup * avoid overflow * use correct gas- * and division
This commit is contained in:
parent
3226e1ca33
commit
abecd80f54
@ -1 +1 @@
|
|||||||
Subproject commit 85e76c5ea2a54c6c54e35014643b5080a50460c5
|
Subproject commit 519b0b967cffd7d1236ef21698b1e6e415a048e9
|
@ -415,36 +415,121 @@ fn storage_read() {
|
|||||||
assert_eq!(Address::from(&result[12..32]), address);
|
assert_eq!(Address::from(&result[12..32]), address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! reqrep_test {
|
||||||
// Tests that contract's ability to read from a storage
|
($name: expr, $input: expr) => {
|
||||||
// Test prepopulates address into storage, than executes a contract which read that address from storage and write this address into result
|
{
|
||||||
#[test]
|
|
||||||
fn math_add() {
|
|
||||||
::ethcore_logger::init_log();
|
::ethcore_logger::init_log();
|
||||||
let code = load_sample!("math.wasm");
|
let code = load_sample!($name);
|
||||||
|
|
||||||
let mut params = ActionParams::default();
|
let mut params = ActionParams::default();
|
||||||
params.gas = U256::from(100_000);
|
params.gas = U256::from(100_000);
|
||||||
params.code = Some(Arc::new(code));
|
params.code = Some(Arc::new(code));
|
||||||
|
params.data = Some($input);
|
||||||
let mut args = [0u8; 64];
|
|
||||||
let arg_a = U256::from_dec_str("999999999999999999999999999999").unwrap();
|
|
||||||
let arg_b = U256::from_dec_str("888888888888888888888888888888").unwrap();
|
|
||||||
arg_a.to_big_endian(&mut args[0..32]);
|
|
||||||
arg_b.to_big_endian(&mut args[32..64]);
|
|
||||||
params.data = Some(args.to_vec());
|
|
||||||
|
|
||||||
let (gas_left, result) = {
|
let (gas_left, result) = {
|
||||||
let mut interpreter = wasm_interpreter();
|
let mut interpreter = wasm_interpreter();
|
||||||
let result = interpreter.exec(params, &mut FakeExt::new()).expect("Interpreter to execute without any errors");
|
let result = interpreter.exec(params, &mut FakeExt::new()).expect("Interpreter to execute without any errors");
|
||||||
match result {
|
match result {
|
||||||
GasLeft::Known(_) => { panic!("storage_read should return payload"); },
|
GasLeft::Known(_) => { panic!("Test is expected to return payload to check"); },
|
||||||
GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()),
|
GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let sum: U256 = (&result[..]).into();
|
(gas_left, result)
|
||||||
|
}
|
||||||
assert_eq!(gas_left, U256::from(96284));
|
}
|
||||||
assert_eq!(sum, U256::from_dec_str("1888888888888888888888888888887").unwrap());
|
}
|
||||||
|
|
||||||
|
// math_* tests check the ability of wasm contract to perform big integer operations
|
||||||
|
// - addition
|
||||||
|
// - multiplication
|
||||||
|
// - substraction
|
||||||
|
// - division
|
||||||
|
|
||||||
|
// addition
|
||||||
|
#[test]
|
||||||
|
fn math_add() {
|
||||||
|
|
||||||
|
let (gas_left, result) = reqrep_test!(
|
||||||
|
"math.wasm",
|
||||||
|
{
|
||||||
|
let mut args = [0u8; 65];
|
||||||
|
let arg_a = U256::from_dec_str("999999999999999999999999999999").unwrap();
|
||||||
|
let arg_b = U256::from_dec_str("888888888888888888888888888888").unwrap();
|
||||||
|
arg_a.to_big_endian(&mut args[1..33]);
|
||||||
|
arg_b.to_big_endian(&mut args[33..65]);
|
||||||
|
args.to_vec()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(gas_left, U256::from(98087));
|
||||||
|
assert_eq!(
|
||||||
|
U256::from_dec_str("1888888888888888888888888888887").unwrap(),
|
||||||
|
(&result[..]).into()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// multiplication
|
||||||
|
#[test]
|
||||||
|
fn math_mul() {
|
||||||
|
let (gas_left, result) = reqrep_test!(
|
||||||
|
"math.wasm",
|
||||||
|
{
|
||||||
|
let mut args = [1u8; 65];
|
||||||
|
let arg_a = U256::from_dec_str("888888888888888888888888888888").unwrap();
|
||||||
|
let arg_b = U256::from_dec_str("999999999999999999999999999999").unwrap();
|
||||||
|
arg_a.to_big_endian(&mut args[1..33]);
|
||||||
|
arg_b.to_big_endian(&mut args[33..65]);
|
||||||
|
args.to_vec()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(gas_left, U256::from(97236));
|
||||||
|
assert_eq!(
|
||||||
|
U256::from_dec_str("888888888888888888888888888887111111111111111111111111111112").unwrap(),
|
||||||
|
(&result[..]).into()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// substraction
|
||||||
|
#[test]
|
||||||
|
fn math_sub() {
|
||||||
|
let (gas_left, result) = reqrep_test!(
|
||||||
|
"math.wasm",
|
||||||
|
{
|
||||||
|
let mut args = [2u8; 65];
|
||||||
|
let arg_a = U256::from_dec_str("999999999999999999999999999999").unwrap();
|
||||||
|
let arg_b = U256::from_dec_str("888888888888888888888888888888").unwrap();
|
||||||
|
arg_a.to_big_endian(&mut args[1..33]);
|
||||||
|
arg_b.to_big_endian(&mut args[33..65]);
|
||||||
|
args.to_vec()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(gas_left, U256::from(98131));
|
||||||
|
assert_eq!(
|
||||||
|
U256::from_dec_str("111111111111111111111111111111").unwrap(),
|
||||||
|
(&result[..]).into()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn math_div() {
|
||||||
|
let (gas_left, result) = reqrep_test!(
|
||||||
|
"math.wasm",
|
||||||
|
{
|
||||||
|
let mut args = [3u8; 65];
|
||||||
|
let arg_a = U256::from_dec_str("999999999999999999999999999999").unwrap();
|
||||||
|
let arg_b = U256::from_dec_str("888888888888888888888888").unwrap();
|
||||||
|
arg_a.to_big_endian(&mut args[1..33]);
|
||||||
|
arg_b.to_big_endian(&mut args[33..65]);
|
||||||
|
args.to_vec()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(gas_left, U256::from(91420));
|
||||||
|
assert_eq!(
|
||||||
|
U256::from_dec_str("1125000").unwrap(),
|
||||||
|
(&result[..]).into()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user