chore(testing-framework)!: restore WASM test executor (#609)

* chore(testing-framework)!: fix WASM test runner

Native mode was used before because some package used native runner
for its tests.

This PR allows to explicitly select test runner for tests.  Many testing-framework
types are now parametrized with a runner type with almost compatible defaults.

* chore(testing-framework): Add `ReleaseWasmAirRunner`
* chore(testing-framework)!: Rename `AirScriptExecutor::simple` to `AirScriptExecutor::from_annotated`.
This commit is contained in:
Ivan Boldyrev 2023-06-23 19:28:28 +07:00 committed by GitHub
parent c6627fe437
commit c332cca6b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 303 additions and 201 deletions

View File

@ -6,7 +6,9 @@ use criterion::Criterion;
use std::cell::RefCell;
thread_local!(static VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "test_peer_id")));
thread_local!(static VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "test_peer_id"))
);
thread_local!(static SCRIPT: String = String::from(
r#"
(call "test_peer_id" ("local_service_id" "local_fn_name") [] result_name)

View File

@ -7,17 +7,25 @@ use serde_json::json;
use std::cell::RefCell;
thread_local!(static RELAY_1_VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "Relay1")));
thread_local!(static RELAY_2_VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "Relay2")));
thread_local!(static REMOTE_VM: RefCell<TestRunner> = RefCell::new({
thread_local!(static RELAY_1_VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "Relay1")
));
thread_local!(static RELAY_2_VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "Relay2")
));
thread_local!(static REMOTE_VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new({
let members_call_service: CallServiceClosure = Box::new(|_| -> CallServiceResult {
CallServiceResult::ok(json!([["A", "Relay1"], ["B", "Relay2"]]))
});
create_avm(members_call_service, "Remote")
create_custom_avm(members_call_service, "Remote")
}));
thread_local!(static CLIENT_1_VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "A")));
thread_local!(static CLIENT_2_VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "B")));
thread_local!(static CLIENT_1_VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "A")
));
thread_local!(static CLIENT_2_VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "B")
));
fn chat_sent_message_benchmark() -> Result<RawAVMOutcome, String> {
let script = r#"

View File

@ -8,7 +8,7 @@ use criterion::Criterion;
use std::cell::RefCell;
thread_local!(static VM: RefCell<TestRunner> = RefCell::new({
thread_local!(static VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new({
let add_module_response = String::from("add_module response");
let add_blueprint_response = String::from("add_blueprint response");
let create_response = String::from("create response");
@ -24,10 +24,10 @@ thread_local!(static VM: RefCell<TestRunner> = RefCell::new({
CallServiceResult::ok(json!(response))
});
create_avm(call_service, "A")
create_custom_avm(call_service, "A")
}));
thread_local!(static SET_VARIABLES_VM: RefCell<TestRunner> = RefCell::new({
thread_local!(static SET_VARIABLES_VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new({
let module = "greeting";
let module_config = json!(
{
@ -51,7 +51,7 @@ thread_local!(static SET_VARIABLES_VM: RefCell<TestRunner> = RefCell::new({
String::from("blueprint") => json!(blueprint),
);
create_avm(set_variables_call_service(variables_mapping, VariableOptionSource::Argument(0)), "set_variables")
create_custom_avm(set_variables_call_service(variables_mapping, VariableOptionSource::Argument(0)), "set_variables")
}));
fn create_service_benchmark() -> Result<RawAVMOutcome, String> {

View File

@ -7,7 +7,9 @@ use serde_json::Value;
use std::cell::RefCell;
thread_local!(static VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "test_peer_id")));
thread_local!(static VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "test_peer_id")
));
const SCRIPT: &str = include_str!("data/big.air");
// this is the data with smaller number of huge values; it contains only calls and

View File

@ -7,7 +7,9 @@ use serde_json::Value;
use std::cell::RefCell;
thread_local!(static VM: RefCell<TestRunner> = RefCell::new(create_avm(unit_call_service(), "test_peer_id")));
thread_local!(static VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "test_peer_id")
));
// effectively, we measure just loading time
const SCRIPT: &str = "(par (null) (null))";

View File

@ -35,7 +35,8 @@ fn test_canon_ok() {
)"#
);
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &script).unwrap();
let executor =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &script).unwrap();
let result = executor.execute_one(init_peer_id).unwrap();
let data = data_from_result(&result);
@ -110,7 +111,8 @@ fn test_canon_ok_multi() {
)"#
);
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &script).unwrap();
let executor =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &script).unwrap();
let _result1 = executor.execute_one(init_peer_id).unwrap();
let _result2 = executor.execute_one(other_peer_id).unwrap();
let result3 = executor.execute_one(init_peer_id).unwrap();

View File

@ -78,13 +78,9 @@ fn test_scalar_cid() {
(call "{vm_peer_id}" ("service" "call2") [] y) ; ok="ipld"
)"#
);
let executor = AirScriptExecutor::new(
TestRunParameters::from_init_peer_id(vm_peer_id),
vec![],
std::iter::empty(),
&annotated_air_script,
)
.unwrap();
let executor =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(vm_peer_id), &annotated_air_script)
.unwrap();
let result = executor.execute_one(vm_peer_id).unwrap();
let data = data_from_result(&result);
@ -127,13 +123,9 @@ fn test_stream_cid() {
(call "{vm_peer_id}" ("service" "call2") [] $x) ; ok="ipld"
)"#
);
let executor = AirScriptExecutor::new(
TestRunParameters::from_init_peer_id(vm_peer_id),
vec![],
std::iter::empty(),
&annotated_air_script,
)
.unwrap();
let executor =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(vm_peer_id), &annotated_air_script)
.unwrap();
let result = executor.execute_one(vm_peer_id).unwrap();
let data = data_from_result(&result);
@ -178,13 +170,9 @@ fn test_unused_cid() {
(call "{vm_peer_id}" ("service" "call2") []) ; ok="ipld"
)"#
);
let executor = AirScriptExecutor::new(
TestRunParameters::from_init_peer_id(vm_peer_id),
vec![],
std::iter::empty(),
&annotated_air_script,
)
.unwrap();
let executor =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(vm_peer_id), &annotated_air_script)
.unwrap();
let result = executor.execute_one(vm_peer_id).unwrap();
let data = data_from_result(&result);

View File

@ -32,7 +32,7 @@ fn length_functor_for_array_scalar() {
"#;
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), script)
.expect("invalid test AIR script");
let result = executor.execute_one(init_peer_id).unwrap();
@ -56,7 +56,7 @@ fn length_functor_for_non_array_scalar() {
"#);
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &script)
.expect("invalid test AIR script");
let result = executor.execute_one(init_peer_id).unwrap();
@ -81,7 +81,7 @@ fn length_functor_for_stream() {
"#;
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), script)
.expect("invalid test AIR script");
let result = executor.execute_one(init_peer_id).unwrap();
@ -122,7 +122,7 @@ fn length_functor_for_empty_stream() {
"#;
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), script)
.expect("invalid test AIR script");
let result = executor.execute_one(init_peer_id).unwrap();
@ -153,7 +153,7 @@ fn length_functor_for_canon_stream() {
"#;
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), script)
.expect("invalid test AIR script");
let result = executor.execute_one(init_peer_id).unwrap();
@ -185,7 +185,7 @@ fn length_functor_for_empty_canon_stream() {
"#;
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), script)
.expect("invalid test AIR script");
let result = executor.execute_one(init_peer_id).unwrap();

View File

@ -27,7 +27,7 @@ fn test_signature_empty() {
let init_peer_id = "init_peer_id";
let (keypair, _) = derive_dummy_keypair(init_peer_id);
let exec = AirScriptExecutor::new(
let exec = <AirScriptExecutor>::new(
TestRunParameters::from_init_peer_id(init_peer_id),
vec![],
vec![PeerId::from(init_peer_id)].into_iter(),
@ -54,7 +54,8 @@ fn test_signature_call_var() {
(call "{init_peer_id}" ("" "") [] var) ; ok = "ok"
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let res = exec.execution_iter(init_peer_id).unwrap().last().unwrap();
assert_eq!(res.ret_code, 0, "{:?}", res);
@ -79,7 +80,8 @@ fn test_signature_call_stream() {
(call "{init_peer_id}" ("" "") [] $var) ; ok = "ok"
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let res = exec.execution_iter(init_peer_id).unwrap().last().unwrap();
assert_eq!(res.ret_code, 0, "{:?}", res);
@ -106,7 +108,8 @@ fn test_signature_call_ununsed() {
(call "{init_peer_id}" ("" "") []) ; ok = "ok"
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let res = exec.execution_iter(init_peer_id).unwrap().last().unwrap();
assert_eq!(res.ret_code, 0, "{:?}", res);
@ -137,7 +140,8 @@ fn test_signature_call_merged() {
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let _ = exec.execute_one(init_peer_id).unwrap();
let _ = exec.execute_one(other_peer_id).unwrap();
let res2 = exec.execute_one(init_peer_id).unwrap();
@ -173,7 +177,8 @@ fn test_signature_call_double() {
(next i))))
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let res = exec.execution_iter(init_peer_id).unwrap().last().unwrap();
assert_eq!(res.ret_code, 0, "{:?}", res);
@ -216,7 +221,8 @@ fn test_signature_canon_basic() {
(canon "{init_peer_id}" $stream #canon)))
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let last_result = exec.execution_iter(init_peer_id).unwrap().last().unwrap();
let last_data = data_from_result(&last_result);
@ -293,7 +299,8 @@ fn test_signature_canon_merge() {
(call "{init_peer_id}" ("" "") []))) ; ok = "ok"
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
exec.execute_all(init_peer_id);
exec.execute_one(other_peer_id);
@ -371,7 +378,8 @@ fn test_signature_canon_result() {
(canon "{init_peer_id}" $stream #canon)))
"#
);
let exec = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let exec =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), &air_script).unwrap();
let last_result = exec.execution_iter(init_peer_id).unwrap().last().unwrap();
let last_data = data_from_result(&last_result);

View File

@ -82,7 +82,7 @@ fn merging_fold_iterations_extensively() {
)
"#;
let engine = AirScriptExecutor::new(
let engine = <AirScriptExecutor>::new(
TestRunParameters::from_init_peer_id("client"),
vec![],
vec!["relay", "p1", "p2", "p3"].into_iter().map(Into::into),
@ -219,7 +219,7 @@ fn merging_fold_iterations_extensively_2() {
)
"#;
let engine = AirScriptExecutor::new(
let engine = <AirScriptExecutor>::new(
TestRunParameters::from_init_peer_id("client"),
vec![],
vec!["relay", "p1", "p2", "p3"].into_iter().map(Into::into),

View File

@ -26,7 +26,8 @@ fn call_result() {
(call "B" ("service" "func") [] $s) ; ok = "some_data"
(canon "B" $s #c))
"#;
let runner = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let runner =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let result = runner.execute_one(init_peer_id).unwrap();
assert_eq!(result.ret_code, 0, "{:?}", result.error_message);
@ -78,7 +79,8 @@ fn call_result_iteration() {
(next a))))
(canon "A" $s #c))
"#;
let runner = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let runner =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let result = runner.execute_one(init_peer_id).unwrap();
assert_eq!(result.ret_code, 0, "{:?}", result.error_message);
@ -143,7 +145,8 @@ fn literal() {
(ap 1 $s)
(canon "B" $s #c))
"#;
let runner = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let runner =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let result = runner.execute_one(init_peer_id).unwrap();
assert_eq!(result.ret_code, 0, "{:?}", result.error_message);
@ -186,7 +189,8 @@ fn canon_in_canon() {
(ap #c $s)
(canon "B" $s #d)))
"#;
let runner = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let runner =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let result = runner.execute_one(init_peer_id).unwrap();
assert_eq!(result.ret_code, 0, "{:?}", result.error_message);
@ -261,7 +265,8 @@ fn lambda_result_iteration() {
(next y))))
(canon "A" $s #c))
"#;
let runner = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let runner =
AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), air_script).unwrap();
let result = runner.execute_one(init_peer_id).unwrap();
assert_eq!(result.ret_code, 0, "{:?}", result.error_message);

View File

@ -109,10 +109,8 @@ fn fold_stream_with_inner_call() {
(call "init_peer_id" ("" "") [i] $s2) ; behaviour = tetraplet
(next i))))
"#;
let executor = air_test_framework::AirScriptExecutor::new(
let executor = air_test_framework::AirScriptExecutor::from_annotated(
TestRunParameters::from_init_peer_id(init_peer_id),
vec![],
std::iter::empty(),
&air_script,
)
.unwrap();
@ -157,10 +155,8 @@ fn fold_canon_with_inner_call() {
(call "init_peer_id" ("" "") [x] $s2) ; behaviour=tetraplet
(next x)))))
"#;
let executor = air_test_framework::AirScriptExecutor::new(
let executor = air_test_framework::AirScriptExecutor::from_annotated(
TestRunParameters::from_init_peer_id(init_peer_id),
vec![],
std::iter::empty(),
&air_script,
)
.unwrap();

View File

@ -40,8 +40,9 @@ fn par_ap_behaviour() {
)
"#);
let engine = air_test_framework::AirScriptExecutor::simple(TestRunParameters::new("client_id", 0, 1, ""), &script)
.expect("invalid test executor config");
let engine =
air_test_framework::AirScriptExecutor::from_annotated(TestRunParameters::new("client_id", 0, 1, ""), &script)
.expect("invalid test executor config");
let client_result_1 = engine.execute_one(client_id).unwrap();
assert_next_pks!(&client_result_1.next_peer_pks, [relay_id, variable_setter_id]);

View File

@ -68,8 +68,8 @@ fn issue_211() {
let run_params = TestRunParameters::from_init_peer_id(peer_1_id);
let engine =
air_test_framework::AirScriptExecutor::simple(run_params, &script).expect("invalid test executor config");
let engine = air_test_framework::AirScriptExecutor::from_annotated(run_params, &script)
.expect("invalid test executor config");
let result = engine.execute_one(peer_1_id).unwrap();

View File

@ -68,7 +68,7 @@ fn issue_221() {
)
"#);
let executor = AirScriptExecutor::new(
let executor = <AirScriptExecutor>::new(
TestRunParameters::from_init_peer_id("set_variable_id"),
vec![],
vec![peer_1_id, peer_2_id].into_iter().map(Into::into),

View File

@ -33,7 +33,7 @@ fn issue_304() {
"#;
let init_peer_id = "init_peer_id";
let executor = AirScriptExecutor::simple(TestRunParameters::from_init_peer_id(init_peer_id), script)
let executor = AirScriptExecutor::from_annotated(TestRunParameters::from_init_peer_id(init_peer_id), script)
.expect("invalid test AIR script");
let res = executor.execute_one(init_peer_id).unwrap();

View File

@ -51,7 +51,7 @@ fn issue_356() {
)
"#;
let engine = AirScriptExecutor::new(
let engine = <AirScriptExecutor>::new(
TestRunParameters::from_init_peer_id("client"),
vec![],
vec!["p1", "p2", "p3"].into_iter().map(Into::into),

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"version":"0.7.0","interpreter_version":"0.39.0","trace":[{"call":{"executed":{"scalar":"bagaaierac7ero3zlwycmoidfsejn2gjdk7kx7lrerhajn6lqm7dhcd2dfxla"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaiera3cpk4hkdc462bup4ab7i6dnl6rs2wludga6f666i5wzwt6nv7noa":["val0","val1","val2","val3","val4","val5","val6","val7","val8","val9"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaierac7ero3zlwycmoidfsejn2gjdk7kx7lrerhajn6lqm7dhcd2dfxla":{"value_cid":"bagaaiera3cpk4hkdc462bup4ab7i6dnl6rs2wludga6f666i5wzwt6nv7noa","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"163VbjpvwdXKcCN7tQb9XZACcf4md1uze1WgP1pzXoUSFJw1vmwNBc2YX88xzmBiQVLBKW3iEBAhQujPTeWrJ1twq"}}
{"version":"0.8.0","interpreter_version":"0.40.0","trace":[{"call":{"executed":{"scalar":"bagaaierac7ero3zlwycmoidfsejn2gjdk7kx7lrerhajn6lqm7dhcd2dfxla"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaiera3cpk4hkdc462bup4ab7i6dnl6rs2wludga6f666i5wzwt6nv7noa":["val0","val1","val2","val3","val4","val5","val6","val7","val8","val9"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaierac7ero3zlwycmoidfsejn2gjdk7kx7lrerhajn6lqm7dhcd2dfxla":{"value_cid":"bagaaiera3cpk4hkdc462bup4ab7i6dnl6rs2wludga6f666i5wzwt6nv7noa","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"163VbjpvwdXKcCN7tQb9XZACcf4md1uze1WgP1pzXoUSFJw1vmwNBc2YX88xzmBiQVLBKW3iEBAhQujPTeWrJ1twq"}}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"version":"0.7.0","interpreter_version":"0.39.0","trace":[{"call":{"executed":{"scalar":"bagaaiera6ekp5lr72eqti3rsxz2oikgzhaluu6hzcjc5uybasul2czpxuuda"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaierardh4fnqkydva35bnwiolv43gej6pwwbt75zacvktcbv3x55tyaza":["val0","val1","val2","val3","val4","val5","val6","val7","val8","val9","val10","val11","val12","val13","val14","val15","val16","val17","val18","val19","val20","val21","val22","val23","val24","val25","val26","val27","val28","val29","val30","val31","val32","val33","val34","val35","val36","val37","val38","val39","val40","val41","val42","val43","val44","val45","val46","val47","val48","val49"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaiera6ekp5lr72eqti3rsxz2oikgzhaluu6hzcjc5uybasul2czpxuuda":{"value_cid":"bagaaierardh4fnqkydva35bnwiolv43gej6pwwbt75zacvktcbv3x55tyaza","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"13vWGqDZQHGDm5dqJZqDD8hkGq9bVPs2Y1dq9yDwj6WVDWccg4YhGFXGXVriWN4ESAMDu4Do6nBxi223JxWsbPytD"}}
{"version":"0.8.0","interpreter_version":"0.40.0","trace":[{"call":{"executed":{"scalar":"bagaaiera6ekp5lr72eqti3rsxz2oikgzhaluu6hzcjc5uybasul2czpxuuda"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaierardh4fnqkydva35bnwiolv43gej6pwwbt75zacvktcbv3x55tyaza":["val0","val1","val2","val3","val4","val5","val6","val7","val8","val9","val10","val11","val12","val13","val14","val15","val16","val17","val18","val19","val20","val21","val22","val23","val24","val25","val26","val27","val28","val29","val30","val31","val32","val33","val34","val35","val36","val37","val38","val39","val40","val41","val42","val43","val44","val45","val46","val47","val48","val49"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaiera6ekp5lr72eqti3rsxz2oikgzhaluu6hzcjc5uybasul2czpxuuda":{"value_cid":"bagaaierardh4fnqkydva35bnwiolv43gej6pwwbt75zacvktcbv3x55tyaza","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"13vWGqDZQHGDm5dqJZqDD8hkGq9bVPs2Y1dq9yDwj6WVDWccg4YhGFXGXVriWN4ESAMDu4Do6nBxi223JxWsbPytD"}}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"version":"0.7.0","interpreter_version":"0.39.0","trace":[{"call":{"executed":{"scalar":"bagaaieran57a2jmc23bun7cvrungjal2vf4tht5torcwfl6exgno2ow4ynma"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaieramm3kz5cu4bw4rx45bqdvunoc766s5tiqq57kedlgohklidri22wa":["12D3KooWQ8ZKGDbSPp33JLaum9bQ3afhLinWr8vdfKHaorTdBeTw","12D3KooWKdFJFg5FPo1ygEJd5uMf6dzpaMC7HqLgvirYnSjmBxcZ","12D3KooWRwuE9mscEw6aZeWoTtkFazxUsLqmmkvecxF1yTNuoskn","12D3KooWShXhXkEaUVvXAJVVV5SLQc5zPJv1hdwcMxkVynaDRGCy","12D3KooWRVTWjeg8GDY5zYqM5owEcvRu9zEqDsd7WM8fcr2Vd38v","12D3KooWJp1ZVpuZzDpSJtKjuyzGYzEAbtDhUhxm9PM1LbcXxVbo","12D3KooWNbiW2fn1nwW1PcyMHkmHU9LqTqT3a9DURmJPZtuS5b3H","12D3KooWMc1jRhKBCXoREqZHWfrNqDCY9PmmxtDh5vNPU3umMDsb","12D3KooWCay13DtvvYhyJYas3QibP2NEuKHQMa6ssa49Z7wkyfpt","12D3KooWFbsZYLjRHyzWzeR9QqT5aFqweZdWLfZv1fqxfGWLZhNu","12D3KooWQU52GYFBv5uoDCsVMN8RCAHrbysXdErHX89uBZBmhfey","12D3KooWPHLYKqP2ZgXaW21dUZSe8KjDF9LuEtm798FhsAVmFVXc","12D3KooWEmryJZH7YRHDX8FPfLL4gnaySunmigmWCXwpSfcN4bPD","12D3KooWFuQ7u5HJ13d49RGbABqzGJYdXdNPMnEFMrbt81ukUgJT"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaieran57a2jmc23bun7cvrungjal2vf4tht5torcwfl6exgno2ow4ynma":{"value_cid":"bagaaieramm3kz5cu4bw4rx45bqdvunoc766s5tiqq57kedlgohklidri22wa","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"1zhzoi14gLACPYcePf64bun2VwayjXP4b9THmazJ8NLx2vhe1zXeVZx1T2MJY2Ve78JhQZeaniBGWgXn6EEJ8y1R"}}
{"version":"0.8.0","interpreter_version":"0.40.0","trace":[{"call":{"executed":{"scalar":"bagaaieran57a2jmc23bun7cvrungjal2vf4tht5torcwfl6exgno2ow4ynma"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaieramm3kz5cu4bw4rx45bqdvunoc766s5tiqq57kedlgohklidri22wa":["12D3KooWQ8ZKGDbSPp33JLaum9bQ3afhLinWr8vdfKHaorTdBeTw","12D3KooWKdFJFg5FPo1ygEJd5uMf6dzpaMC7HqLgvirYnSjmBxcZ","12D3KooWRwuE9mscEw6aZeWoTtkFazxUsLqmmkvecxF1yTNuoskn","12D3KooWShXhXkEaUVvXAJVVV5SLQc5zPJv1hdwcMxkVynaDRGCy","12D3KooWRVTWjeg8GDY5zYqM5owEcvRu9zEqDsd7WM8fcr2Vd38v","12D3KooWJp1ZVpuZzDpSJtKjuyzGYzEAbtDhUhxm9PM1LbcXxVbo","12D3KooWNbiW2fn1nwW1PcyMHkmHU9LqTqT3a9DURmJPZtuS5b3H","12D3KooWMc1jRhKBCXoREqZHWfrNqDCY9PmmxtDh5vNPU3umMDsb","12D3KooWCay13DtvvYhyJYas3QibP2NEuKHQMa6ssa49Z7wkyfpt","12D3KooWFbsZYLjRHyzWzeR9QqT5aFqweZdWLfZv1fqxfGWLZhNu","12D3KooWQU52GYFBv5uoDCsVMN8RCAHrbysXdErHX89uBZBmhfey","12D3KooWPHLYKqP2ZgXaW21dUZSe8KjDF9LuEtm798FhsAVmFVXc","12D3KooWEmryJZH7YRHDX8FPfLL4gnaySunmigmWCXwpSfcN4bPD","12D3KooWFuQ7u5HJ13d49RGbABqzGJYdXdNPMnEFMrbt81ukUgJT"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaieran57a2jmc23bun7cvrungjal2vf4tht5torcwfl6exgno2ow4ynma":{"value_cid":"bagaaieramm3kz5cu4bw4rx45bqdvunoc766s5tiqq57kedlgohklidri22wa","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"1zhzoi14gLACPYcePf64bun2VwayjXP4b9THmazJ8NLx2vhe1zXeVZx1T2MJY2Ve78JhQZeaniBGWgXn6EEJ8y1R"}}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"version":"0.7.0","interpreter_version":"0.39.0","trace":[{"call":{"executed":{"scalar":"bagaaieralvgoep7cg4zpsc7zb57xmf3gw5amoj53qgk4i3m5yi4uc2kpmjva"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaieraoft5qanrf4ofex3agido463fnnr4cdmiy2pjepl5ajdx4x5sawgq":["12D3KooWQ8ZKGDbSPp33JLaum9bQ3afhLinWr8vdfKHaorTdBeTw","12D3KooWKdFJFg5FPo1ygEJd5uMf6dzpaMC7HqLgvirYnSjmBxcZ","12D3KooWRwuE9mscEw6aZeWoTtkFazxUsLqmmkvecxF1yTNuoskn","12D3KooWShXhXkEaUVvXAJVVV5SLQc5zPJv1hdwcMxkVynaDRGCy","12D3KooWRVTWjeg8GDY5zYqM5owEcvRu9zEqDsd7WM8fcr2Vd38v"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaieralvgoep7cg4zpsc7zb57xmf3gw5amoj53qgk4i3m5yi4uc2kpmjva":{"value_cid":"bagaaieraoft5qanrf4ofex3agido463fnnr4cdmiy2pjepl5ajdx4x5sawgq","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"13S3GJqcvVxRh61JNwxnmWP7rcfwtNedfew328pGaG2JzrZpj7QFUvwgMTZijymbHeBV5oym19nNRUhkqtmVh7Piv"}}
{"version":"0.8.0","interpreter_version":"0.40.0","trace":[{"call":{"executed":{"scalar":"bagaaieralvgoep7cg4zpsc7zb57xmf3gw5amoj53qgk4i3m5yi4uc2kpmjva"}}},{"call":{"sent_by":{"PeerId":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m"}}}],"streams":{},"r_streams":{},"lcid":1,"cid_info":{"value_store":{"bagaaieraoft5qanrf4ofex3agido463fnnr4cdmiy2pjepl5ajdx4x5sawgq":["12D3KooWQ8ZKGDbSPp33JLaum9bQ3afhLinWr8vdfKHaorTdBeTw","12D3KooWKdFJFg5FPo1ygEJd5uMf6dzpaMC7HqLgvirYnSjmBxcZ","12D3KooWRwuE9mscEw6aZeWoTtkFazxUsLqmmkvecxF1yTNuoskn","12D3KooWShXhXkEaUVvXAJVVV5SLQc5zPJv1hdwcMxkVynaDRGCy","12D3KooWRVTWjeg8GDY5zYqM5owEcvRu9zEqDsd7WM8fcr2Vd38v"]},"tetraplet_store":{"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q":{"peer_pk":"12D3KooWPeUMWXdtEveZonecW8hhFdt4wfT4AyYpp4yrFGti7w5m","service_id":"..0","function_name":"init","json_path":""}},"canon_element_store":{},"canon_result_store":{},"service_result_store":{"bagaaieralvgoep7cg4zpsc7zb57xmf3gw5amoj53qgk4i3m5yi4uc2kpmjva":{"value_cid":"bagaaieraoft5qanrf4ofex3agido463fnnr4cdmiy2pjepl5ajdx4x5sawgq","argument_hash":"bagaaieraj5j43immfovaya2uxnpzupwl4xwrfk2nryi3vbz4f4irmeqcxfcq","tetraplet_cid":"bagaaierazalcvolvfdovxuklvznoyrhn5gg4drlbbplrf7rrwullfw2zjd7q"}}},"signatures":{"1Eq7BmQ4B42P5Pu9BsXxMUqoETLQR9HULrUcpsHjpDzMq":"13S3GJqcvVxRh61JNwxnmWP7rcfwtNedfew328pGaG2JzrZpj7QFUvwgMTZijymbHeBV5oym19nNRUhkqtmVh7Piv"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -31,10 +31,8 @@ pub mod executed_state;
pub mod key_utils;
pub mod test_runner;
#[cfg(feature = "test_with_native_code")]
mod native_test_runner;
#[cfg(not(feature = "test_with_native_code"))]
mod wasm_test_runner;
pub mod native_test_runner;
pub mod wasm_test_runner;
pub use air::interpreter_data::*;
use air::ExecutionCidState;

View File

@ -16,9 +16,13 @@
use crate::key_utils::derive_dummy_keypair;
#[cfg(feature = "test_with_native_code")]
use crate::native_test_runner::NativeAirRunner as AirRunnerImpl;
pub use crate::native_test_runner::NativeAirRunner as DefaultAirRunner;
#[cfg(not(feature = "test_with_native_code"))]
use crate::wasm_test_runner::WasmAirRunner as AirRunnerImpl;
pub use crate::wasm_test_runner::WasmAirRunner as DefaultAirRunner;
pub use crate::native_test_runner::NativeAirRunner;
pub use crate::wasm_test_runner::ReleaseWasmAirRunner;
pub use crate::wasm_test_runner::WasmAirRunner;
use super::CallServiceClosure;
@ -47,7 +51,7 @@ pub trait AirRunner {
) -> Result<RawAVMOutcome, Box<dyn std::error::Error>>;
}
pub struct TestRunner<R = AirRunnerImpl> {
pub struct TestRunner<R = DefaultAirRunner> {
pub runner: R,
call_service: CallServiceClosure,
keypair: KeyPair,
@ -155,11 +159,18 @@ pub fn create_avm(
call_service: CallServiceClosure,
current_peer_id: impl Into<String>,
) -> TestRunner {
create_custom_avm(call_service, current_peer_id)
}
pub fn create_custom_avm<R: AirRunner>(
call_service: CallServiceClosure,
current_peer_id: impl Into<String>,
) -> TestRunner<R> {
let current_peer_id = current_peer_id.into();
let (keypair, _) = derive_dummy_keypair(&current_peer_id);
let runner = AirRunnerImpl::new(current_peer_id);
let runner = R::new(current_peer_id);
TestRunner {
runner,
@ -212,15 +223,13 @@ mod tests {
use crate::call_services::{set_variables_call_service, VariableOptionSource};
use avm_interface::CallRequestParams;
use fstrings::f;
use fstrings::format_args_f;
use serde_json::json;
#[test]
fn test_override_current_peer_id() {
let spell_id = "spell_id";
let host_peer_id = "host_peer_id";
let script = f!(r#"(call "{}" ("service" "func") [])"#, spell_id);
let script = format!(r#"(call "{spell_id}" ("service" "func") [])"#);
let variables = maplit::hashmap! {
"func".to_owned() => json!("success"),
@ -230,7 +239,7 @@ mod tests {
let keypair = KeyPair::generate(key_format);
let keypair2 = KeyPair::generate(key_format);
let mut client = create_avm(
let mut client = create_custom_avm::<NativeAirRunner>(
set_variables_call_service(variables, VariableOptionSource::FunctionName),
host_peer_id,
);

View File

@ -25,6 +25,7 @@ use std::path::PathBuf;
// 10 Mb
const AVM_MAX_HEAP_SIZE: u64 = 10 * 1024 * 1024;
const AIR_WASM_PATH: &str = "../target/wasm32-wasi/debug/air_interpreter_server.wasm";
const RELEASE_AIR_WASM_PATH: &str = "../target/wasm32-wasi/release/air_interpreter_server.wasm";
pub struct WasmAirRunner {
current_peer_id: String,
@ -92,3 +93,58 @@ impl AirRunner for WasmAirRunner {
)?)
}
}
/// WASM runner that runs release build form benchmarking.
pub struct ReleaseWasmAirRunner {
current_peer_id: String,
// these instances are not cached, as benches create relatively small number of instances
runner: AVMRunner,
}
impl AirRunner for ReleaseWasmAirRunner {
fn new(current_peer_id: impl Into<String>) -> Self {
let logging_mask = i32::MAX;
let runner = AVMRunner::new(
PathBuf::from(RELEASE_AIR_WASM_PATH),
Some(AVM_MAX_HEAP_SIZE),
logging_mask,
)
.expect("vm should be created");
Self {
current_peer_id: current_peer_id.into(),
runner,
}
}
fn call(
&mut self,
air: impl Into<String>,
prev_data: impl Into<Vec<u8>>,
data: impl Into<Vec<u8>>,
init_peer_id: impl Into<String>,
timestamp: u64,
ttl: u32,
override_current_peer_id: Option<String>,
call_results: avm_server::CallResults,
keypair: &KeyPair,
particle_id: String,
) -> Result<RawAVMOutcome, Box<dyn std::error::Error>> {
let current_peer_id =
override_current_peer_id.unwrap_or_else(|| self.current_peer_id.clone());
Ok(self.runner.call(
air,
prev_data,
data,
init_peer_id,
timestamp,
ttl,
current_peer_id,
call_results,
keypair,
particle_id,
)?)
}
}

View File

@ -26,6 +26,3 @@ serde_json = "1.0.95"
[dev-dependencies]
maplit = "1.0.2"
pretty_assertions = "1.3.0"
# We do not want to depend on wasm binary path
air-test-utils = { version = "0.6.0", path = "../air-lib/test-utils", features = ["test_with_native_code"] }

View File

@ -23,7 +23,7 @@ use crate::{
};
use air_test_utils::{
test_runner::{create_avm, TestRunParameters, TestRunner},
test_runner::{create_custom_avm, AirRunner, DefaultAirRunner, TestRunParameters, TestRunner},
RawAVMOutcome,
};
@ -57,16 +57,16 @@ impl Borrow<str> for PeerId {
pub type Data = Vec<u8>;
pub struct Peer {
pub struct Peer<R> {
pub(crate) peer_id: PeerId,
runner: TestRunner,
runner: TestRunner<R>,
}
impl Peer {
impl<R: AirRunner> Peer<R> {
pub fn new(peer_id: impl Into<PeerId>, services: Rc<[MarineServiceHandle]>) -> Self {
let peer_id = Into::into(peer_id);
let call_service = services_to_call_service_closure(services);
let runner = create_avm(call_service, &*peer_id.0);
let runner = create_custom_avm(call_service, &*peer_id.0);
Self { peer_id, runner }
}
@ -87,7 +87,7 @@ impl Peer {
}
}
impl std::fmt::Debug for Peer {
impl<R: AirRunner> std::fmt::Debug for Peer<R> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Peer")
.field("peer_id", &self.peer_id)
@ -96,16 +96,21 @@ impl std::fmt::Debug for Peer {
}
}
pub struct Network {
peers: RefCell<HashMap<PeerId, Rc<RefCell<PeerEnv>>>>,
pub struct Network<R = DefaultAirRunner> {
peers: RefCell<HashMap<PeerId, Rc<RefCell<PeerEnv<R>>>>>,
services: Rc<NetworkServices>,
}
impl Network {
// it is implemented only for the default runner for compatibility reasons
// Rust fails to deduce type for `Network::empty()` without
// extencive test code changes
impl Network<DefaultAirRunner> {
pub fn empty() -> Rc<Self> {
Self::new(std::iter::empty::<PeerId>(), vec![])
}
}
impl<R: AirRunner> Network<R> {
pub fn new(
peers: impl Iterator<Item = impl Into<PeerId>>,
common_services: Vec<MarineServiceHandle>,
@ -120,8 +125,8 @@ impl Network {
network
}
pub fn from_peers(nodes: Vec<Peer>) -> Rc<Self> {
let network = Self::empty();
pub fn from_peers(nodes: Vec<Peer<R>>) -> Rc<Self> {
let network = Self::new(std::iter::empty::<PeerId>(), vec![]);
let neighborhood: PeerSet = nodes.iter().map(|peer| peer.peer_id.clone()).collect();
for peer in nodes {
network.add_peer_env(peer, neighborhood.iter().cloned());
@ -131,7 +136,7 @@ impl Network {
pub fn add_peer_env(
self: &Rc<Self>,
peer: Peer,
peer: Peer<R>,
neighborhood: impl IntoIterator<Item = impl Into<PeerId>>,
) {
let peer_id = peer.peer_id.clone();
@ -153,13 +158,13 @@ impl Network {
}
/// Add a peer with default neighborhood.
pub fn add_peer(self: &Rc<Self>, peer: Peer) {
pub fn add_peer(self: &Rc<Self>, peer: Peer<R>) {
let peer_id = peer.peer_id.clone();
let peer_env = PeerEnv::new(peer, self);
self.insert_peer_env_entry(peer_id, peer_env);
}
fn insert_peer_env_entry(&self, peer_id: PeerId, peer_env: PeerEnv) {
fn insert_peer_env_entry(&self, peer_id: PeerId, peer_env: PeerEnv<R>) {
let mut peers_ref = self.peers.borrow_mut();
let peer_env = Rc::new(peer_env.into());
// It will be simplified with entry_insert stabilization
@ -222,7 +227,7 @@ impl Network {
// TODO there is some kind of unsymmetry between these methods and the fail/unfail:
// the latters panic on unknown peer; perhaps, it's OK
pub fn get_peer_env<Id>(&self, peer_id: &Id) -> Option<Rc<RefCell<PeerEnv>>>
pub fn get_peer_env<Id>(&self, peer_id: &Id) -> Option<Rc<RefCell<PeerEnv<R>>>>
where
PeerId: Borrow<Id>,
Id: Hash + Eq + ?Sized,

View File

@ -17,7 +17,7 @@
use super::{Network, Peer, PeerId};
use crate::queue::ExecutionQueue;
use air_test_utils::test_runner::TestRunParameters;
use air_test_utils::test_runner::{AirRunner, DefaultAirRunner, TestRunParameters};
use std::{
borrow::Borrow,
@ -39,15 +39,15 @@ pub enum AlterState {
/// Neighbors of particular node, including set of nodes unreachable from this one (but they might be
/// reachable from others).
pub struct Neighborhood {
pub struct Neighborhood<R = DefaultAirRunner> {
// the value is true is link from this peer to neighbor is failng
network: Weak<Network>,
network: Weak<Network<R>>,
unreachable: HashSet<PeerId>,
altered: HashMap<PeerId, AlterState>,
}
impl Neighborhood {
pub fn new(network: &Rc<Network>) -> Self {
impl<R: AirRunner> Neighborhood<R> {
pub fn new(network: &Rc<Network<R>>) -> Self {
Self {
network: Rc::downgrade(network),
unreachable: <_>::default(),
@ -109,7 +109,7 @@ impl Neighborhood {
}
}
impl std::iter::IntoIterator for &Neighborhood {
impl<R: AirRunner> std::iter::IntoIterator for &Neighborhood<R> {
type Item = PeerId;
type IntoIter = std::collections::hash_set::IntoIter<PeerId>;
@ -129,15 +129,15 @@ impl std::iter::IntoIterator for &Neighborhood {
}
}
pub struct PeerEnv {
pub(crate) peer: Peer,
pub struct PeerEnv<R> {
pub(crate) peer: Peer<R>,
// failed for everyone
failed: bool,
neighborhood: Neighborhood,
neighborhood: Neighborhood<R>,
}
impl PeerEnv {
pub fn new(peer: Peer, network: &Rc<Network>) -> Self {
impl<R: AirRunner> PeerEnv<R> {
pub fn new(peer: Peer<R>, network: &Rc<Network<R>>) -> Self {
Self {
peer,
failed: false,
@ -180,11 +180,11 @@ impl PeerEnv {
}
}
pub fn get_neighborhood(&self) -> &Neighborhood {
pub fn get_neighborhood(&self) -> &Neighborhood<R> {
&self.neighborhood
}
pub fn get_neighborhood_mut(&mut self) -> &mut Neighborhood {
pub fn get_neighborhood_mut(&mut self) -> &mut Neighborhood<R> {
&mut self.neighborhood
}
@ -195,7 +195,7 @@ impl PeerEnv {
pub(crate) fn execute_once(
&mut self,
air: impl Into<String>,
network: &Network,
network: &Network<R>,
queue: &ExecutionQueue,
test_parameters: &TestRunParameters,
) -> Option<Result<air_test_utils::RawAVMOutcome, String>> {
@ -217,9 +217,9 @@ impl PeerEnv {
}
}
impl<'a> IntoIterator for &'a PeerEnv {
type Item = <&'a Neighborhood as IntoIterator>::Item;
type IntoIter = <&'a Neighborhood as IntoIterator>::IntoIter;
impl<'a, R: AirRunner> IntoIterator for &'a PeerEnv<R> {
type Item = <&'a Neighborhood<R> as IntoIterator>::Item;
type IntoIter = <&'a Neighborhood<R> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.neighborhood.into_iter()
@ -228,13 +228,15 @@ impl<'a> IntoIterator for &'a PeerEnv {
#[cfg(test)]
mod tests {
use std::{iter::FromIterator, rc::Rc};
use super::*;
use air_test_utils::prelude::*;
use std::{iter::FromIterator, rc::Rc};
#[test]
fn test_empty_neighborhood() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id: PeerId = "other".into();
let penv = PeerEnv::new(Peer::new(peer_id.clone(), Rc::from(vec![])), &network);
@ -244,7 +246,7 @@ mod tests {
#[test]
fn test_no_self_disconnect() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id: PeerId = "other".into();
let mut penv = PeerEnv::new(Peer::new(peer_id.clone(), Rc::from(vec![])), &network);
@ -268,7 +270,7 @@ mod tests {
let peer_id: PeerId = "someone".into();
let other_id1: PeerId = "other1".into();
let other_id2: PeerId = "other2".into();
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
// iter is empty
@ -282,7 +284,7 @@ mod tests {
#[test]
fn test_insert() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id1: PeerId = "other1".into();
let other_id2: PeerId = "other2".into();
@ -299,7 +301,7 @@ mod tests {
#[test]
fn test_ensure() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id1: PeerId = "other1".into();
let other_id2: PeerId = "other2".into();
@ -317,7 +319,7 @@ mod tests {
#[test]
fn test_insert_insert() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id1: PeerId = "other1".into();
let mut penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
@ -335,7 +337,7 @@ mod tests {
#[test]
fn test_extend_neighborhood() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let mut penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
penv.get_neighborhood_mut()
@ -350,7 +352,7 @@ mod tests {
#[test]
fn test_remove_from_neiborhood() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let mut penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
penv.get_neighborhood_mut()
@ -367,7 +369,7 @@ mod tests {
}
#[test]
fn test_fail() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id: PeerId = "other".into();
let mut penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
@ -383,7 +385,7 @@ mod tests {
#[test]
fn test_fail_remove() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id: PeerId = "other".into();
let mut penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
@ -404,7 +406,7 @@ mod tests {
#[test]
fn test_fail_unfail() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id: PeerId = "other".into();
let mut penv = PeerEnv::new(Peer::new(peer_id, Rc::from(vec![])), &network);
@ -421,7 +423,7 @@ mod tests {
#[test]
fn test_failed() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let peer_id: PeerId = "someone".into();
let other_id: PeerId = "other".into();
let remote_id: PeerId = "remote".into();

View File

@ -21,22 +21,43 @@ use crate::{
transform::walker::TransformedAirScript,
};
use air_test_utils::{test_runner::TestRunParameters, RawAVMOutcome};
use air_test_utils::{
test_runner::{AirRunner, DefaultAirRunner, TestRunParameters},
RawAVMOutcome,
};
use std::{borrow::Borrow, hash::Hash, rc::Rc};
/// A executor for an AIR script. Several executors may share same TransformedAirScript
/// and its state.
pub struct AirScriptExecutor {
transformed_air_script: TransformedAirScript,
pub struct AirScriptExecutor<R = DefaultAirRunner> {
transformed_air_script: TransformedAirScript<R>,
test_parameters: TestRunParameters,
queue: ExecutionQueue,
}
impl AirScriptExecutor {
// it is implemented only for the default runner for compatibility reasons
// Rust fails to deduce type for `AirScriptExecutor::simple()` without
// extencive test code changes
impl AirScriptExecutor<DefaultAirRunner> {
/// Simple constructor where everything is generated from the annotated_air_script.
pub fn from_annotated(
test_parameters: TestRunParameters,
annotated_air_script: &str,
) -> Result<Self, String> {
Self::new(
test_parameters,
vec![],
std::iter::empty(),
annotated_air_script,
)
}
}
impl<R: AirRunner> AirScriptExecutor<R> {
pub fn from_transformed_air_script(
test_parameters: TestRunParameters,
transformed_air_script: TransformedAirScript,
transformed_air_script: TransformedAirScript<R>,
) -> Result<Self, String> {
let network = transformed_air_script.get_network();
let init_peer_id = test_parameters.init_peer_id.as_str();
@ -69,22 +90,9 @@ impl AirScriptExecutor {
Self::from_transformed_air_script(test_parameters, transformed)
}
/// Simple constructor where everything is generated from the annotated_air_script.
pub fn simple(
test_parameters: TestRunParameters,
annotated_air_script: &str,
) -> Result<Self, String> {
Self::new(
test_parameters,
vec![],
std::iter::empty(),
annotated_air_script,
)
}
pub fn from_network(
test_parameters: TestRunParameters,
network: Rc<Network>,
network: Rc<Network<R>>,
annotated_air_script: &str,
) -> Result<Self, String> {
let transformed = TransformedAirScript::new(annotated_air_script, network)?;
@ -142,7 +150,7 @@ mod tests {
#[test]
fn test_execution() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
std::iter::empty(),
@ -173,7 +181,7 @@ mod tests {
#[test]
fn test_call_result_success() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
std::iter::empty(),
@ -202,7 +210,7 @@ mod tests {
#[test]
fn test_call_result_error() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
std::iter::empty(),
@ -240,7 +248,7 @@ mod tests {
#[test]
fn test_seq_ok() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
IntoIterator::into_iter(["peer2", "peer3"]).map(Into::into),
@ -337,7 +345,7 @@ mod tests {
#[test]
fn test_map() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("peer1"),
vec![],
IntoIterator::into_iter(["peer2", "peer3"]).map(Into::into),
@ -403,7 +411,7 @@ mod tests {
#[test]
#[should_panic]
fn test_map_no_arg() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("peer1"),
vec![],
IntoIterator::into_iter(["peer2", "peer3"]).map(Into::into),
@ -417,7 +425,7 @@ mod tests {
#[test]
fn test_seq_error() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
IntoIterator::into_iter(["peer2", "peer3"]).map(Into::into),
@ -515,7 +523,7 @@ mod tests {
#[test]
fn test_echo() {
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
std::iter::empty(),
@ -559,7 +567,7 @@ mod tests {
#[test]
fn test_transformed_distinct() {
let peer = "peer1";
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let transformed1 = TransformedAirScript::new(
&f!(r#"(call "{}" ("service" "function") []) ; ok = 42"#, peer),
@ -621,7 +629,10 @@ mod tests {
let service = Service {
state: vec![json!(42), json!(24)].into_iter().into(),
};
let network = Network::new(std::iter::empty::<PeerId>(), vec![service.to_handle()]);
let network = Network::<NativeAirRunner>::new(
std::iter::empty::<PeerId>(),
vec![service.to_handle()],
);
let peer = "peer1";
let air_script = f!(r#"(call "{}" ("service" "function") [])"#, peer);
@ -664,7 +675,7 @@ mod tests {
#[test]
fn test_invalid_air() {
let res = AirScriptExecutor::new(
let res = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id("init_peer_id"),
vec![],
std::iter::empty(),
@ -690,7 +701,7 @@ mod tests {
#[test]
fn test_behaviour_service() {
let peer = "peer1";
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id(peer),
vec![],
std::iter::empty(),
@ -720,7 +731,7 @@ mod tests {
#[test]
fn test_behaviour_function() {
let peer = "peer1";
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id(peer),
vec![],
std::iter::empty(),
@ -750,7 +761,7 @@ mod tests {
#[test]
fn test_behaviour_arg() {
let peer = "peer1";
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id(peer),
vec![],
std::iter::empty(),
@ -780,7 +791,7 @@ mod tests {
#[test]
fn test_behaviour_tetraplet() {
let peer = "peer1";
let exec = AirScriptExecutor::new(
let exec = AirScriptExecutor::<NativeAirRunner>::new(
TestRunParameters::from_init_peer_id(peer),
vec![],
std::iter::empty(),

View File

@ -16,7 +16,10 @@
use crate::ephemeral::{Data, Network, PeerId};
use air_test_utils::{test_runner::TestRunParameters, RawAVMOutcome};
use air_test_utils::{
test_runner::{AirRunner, TestRunParameters},
RawAVMOutcome,
};
use std::{
borrow::Borrow,
@ -74,10 +77,10 @@ impl ExecutionQueue {
/// Iterator for handling al the queued data. It borrows peer env's `RefCell` only temporarily.
/// Following test-utils' call_vm macro, it panics on failed VM.
pub fn execution_iter<'ctx, Id>(
pub fn execution_iter<'ctx, Id, R: AirRunner + 'ctx>(
&'ctx self,
air: &'ctx str,
network: Rc<Network>,
network: Rc<Network<R>>,
test_parameters: &'ctx TestRunParameters,
peer_id: &Id,
) -> Option<impl Iterator<Item = RawAVMOutcome> + 'ctx>
@ -97,8 +100,12 @@ impl ExecutionQueue {
})
}
pub fn distribute_to_peers<Id>(&self, network: &Network, peers: &[Id], data: &Data)
where
pub fn distribute_to_peers<Id, R: AirRunner>(
&self,
network: &Network<R>,
peers: &[Id],
data: &Data,
) where
Id: Deref<Target = str>,
{
for peer_id in peers {

View File

@ -14,6 +14,8 @@
* limitations under the License.
*/
use air_test_utils::test_runner::{AirRunner, DefaultAirRunner};
use super::{Call, Sexp};
use crate::ephemeral::Network;
@ -23,13 +25,13 @@ use std::{fmt::Write, ops::Deref, rc::Rc, str::FromStr};
/// Executions that use the same transformed script share same generated services' state.
/// This struct is cheap to clone, and cloned copies share same internal state.
#[derive(Clone)]
pub struct TransformedAirScript {
network: Rc<Network>,
pub struct TransformedAirScript<R = DefaultAirRunner> {
network: Rc<Network<R>>,
tranformed: Rc<str>,
}
impl TransformedAirScript {
pub fn new(annotated_air_script: &str, network: Rc<Network>) -> Result<Self, String> {
impl<R: AirRunner> TransformedAirScript<R> {
pub fn new(annotated_air_script: &str, network: Rc<Network<R>>) -> Result<Self, String> {
// validate the AIR script with the standard parser first
air_parser::parse(annotated_air_script)?;
@ -38,7 +40,7 @@ impl TransformedAirScript {
pub(crate) fn new_unvalidated(
annotated_air_script: &str,
network: Rc<Network>,
network: Rc<Network<R>>,
) -> Result<Self, String> {
let transformer = Transformer { network: &network };
let mut sexp = Sexp::from_str(annotated_air_script)?;
@ -50,12 +52,12 @@ impl TransformedAirScript {
})
}
pub(crate) fn get_network(&self) -> Rc<Network> {
pub(crate) fn get_network(&self) -> Rc<Network<R>> {
self.network.clone()
}
}
impl Deref for TransformedAirScript {
impl<R> Deref for TransformedAirScript<R> {
type Target = str;
fn deref(&self) -> &Self::Target {
@ -63,11 +65,11 @@ impl Deref for TransformedAirScript {
}
}
struct Transformer<'net> {
network: &'net Rc<Network>,
struct Transformer<'net, R> {
network: &'net Rc<Network<R>>,
}
impl Transformer<'_> {
impl<R: AirRunner> Transformer<'_, R> {
pub(crate) fn transform(&self, sexp: &mut Sexp) {
match sexp {
Sexp::Call(call) => self.handle_call(call),
@ -106,6 +108,7 @@ impl Transformer<'_> {
mod tests {
use super::*;
use crate::{asserts::ServiceDefinition, ephemeral::PeerId, services::results::ResultStore};
use air_test_utils::test_runner::NativeAirRunner;
use std::{
collections::{HashMap, HashSet},
@ -120,14 +123,14 @@ mod tests {
#[test]
fn test_translate_null() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let transformed = TransformedAirScript::new("(null)", network).unwrap();
assert_eq!(&*transformed, "(null)");
}
#[test]
fn test_translate_call_no_result() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let script = r#"(call peer_id ("service_id" func) [])"#;
let transformed = TransformedAirScript::new_unvalidated(script, network).unwrap();
assert_eq!(&*transformed, script);
@ -136,7 +139,7 @@ mod tests {
#[test]
#[should_panic]
fn test_translate_call_no_string() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let script = r#"(call "peer_id" (service_id func) [])"#;
let transformed = TransformedAirScript::new(script, network);
assert_eq!(transformed.as_deref(), Ok(script));
@ -144,7 +147,7 @@ mod tests {
#[test]
fn test_translate_call_result() {
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let script = r#"(call "peer_id" ("service_id" func) []) ; ok = 42"#;
let transformer = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
assert_eq!(
@ -176,7 +179,7 @@ mod tests {
(call peer_id ("service_id" func) [1]) ; ok=true
))"#;
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let transformed = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
assert_eq!(
&*transformed,
@ -215,7 +218,7 @@ mod tests {
(call peer_id3 ("service_id" func) [b])
))"#;
let network = Network::empty();
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
let _ = TransformedAirScript::new_unvalidated(script, network.clone());
assert_eq!(