mirror of
https://github.com/fluencelabs/aquavm
synced 2025-06-29 06:31:36 +00:00
WIP
This commit is contained in:
@ -62,9 +62,6 @@ pub use polyplets::SecurityTetraplet;
|
|||||||
pub use preparation_step::interpreter_version;
|
pub use preparation_step::interpreter_version;
|
||||||
pub use preparation_step::min_supported_version;
|
pub use preparation_step::min_supported_version;
|
||||||
pub use preparation_step::PreparationError;
|
pub use preparation_step::PreparationError;
|
||||||
pub use preparation_step::MAX_AIR_SIZE;
|
|
||||||
pub use preparation_step::MAX_CALL_RESULTS_SIZE;
|
|
||||||
pub use preparation_step::MAX_PARTICLE_SIZE;
|
|
||||||
|
|
||||||
pub use utils::ToErrorCode;
|
pub use utils::ToErrorCode;
|
||||||
|
|
||||||
|
@ -93,15 +93,15 @@ pub enum PreparationError {
|
|||||||
|
|
||||||
/// AIR script size is bigger than the allowed limit.
|
/// AIR script size is bigger than the allowed limit.
|
||||||
#[error("air size: {0} bytes is bigger than a limit allowed: {1} bytes")]
|
#[error("air size: {0} bytes is bigger than a limit allowed: {1} bytes")]
|
||||||
AIRSizeLimitReached(usize, usize),
|
AIRSizeLimitReached(usize, u64),
|
||||||
|
|
||||||
/// Current_data particle size is bigger than the allowed limit.
|
/// Current_data particle size is bigger than the allowed limit.
|
||||||
#[error("Current_data particle size: {0} bytes is bigger than a limit allowed: {1} bytes")]
|
#[error("Current_data particle size: {0} bytes is bigger than a limit allowed: {1} bytes")]
|
||||||
ParticleSizeLimitReached(usize, usize),
|
ParticleSizeLimitReached(usize, u64),
|
||||||
|
|
||||||
/// CallResults cummulative size is bigger than the allowed limit.
|
/// CallResult size is bigger than the allowed limit.
|
||||||
#[error("Call results cummulative size: {0} bytes is bigger than a limit allowed: {1} bytes")]
|
#[error("Call result size is bigger than the limit allowed: {0} bytes")]
|
||||||
CallResultsSizeLimitReached(usize, usize),
|
CallResultSizeLimitReached(u64),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToErrorCode for PreparationError {
|
impl ToErrorCode for PreparationError {
|
||||||
@ -135,15 +135,15 @@ impl PreparationError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn air_size_limit(actual_size: usize, limit: usize) -> Self {
|
pub fn air_size_limit(actual_size: usize, limit: u64) -> Self {
|
||||||
Self::AIRSizeLimitReached(actual_size, limit)
|
Self::AIRSizeLimitReached(actual_size, limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn particle_size_limit(actual_size: usize, limit: usize) -> Self {
|
pub fn particle_size_limit(actual_size: usize, limit: u64) -> Self {
|
||||||
Self::ParticleSizeLimitReached(actual_size, limit)
|
Self::ParticleSizeLimitReached(actual_size, limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn call_results_size_limit(actual_size: usize, limit: usize) -> Self {
|
pub fn call_result_size_limit(limit: u64) -> Self {
|
||||||
Self::CallResultsSizeLimitReached(actual_size, limit)
|
Self::CallResultSizeLimitReached(limit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,6 @@ mod sizes_limits_check;
|
|||||||
pub use errors::PreparationError;
|
pub use errors::PreparationError;
|
||||||
pub use interpreter_versions::interpreter_version;
|
pub use interpreter_versions::interpreter_version;
|
||||||
pub use interpreter_versions::min_supported_version;
|
pub use interpreter_versions::min_supported_version;
|
||||||
pub use sizes_limits_check::MAX_AIR_SIZE;
|
|
||||||
pub use sizes_limits_check::MAX_CALL_RESULTS_SIZE;
|
|
||||||
pub use sizes_limits_check::MAX_PARTICLE_SIZE;
|
|
||||||
|
|
||||||
pub(crate) use preparation::check_version_compatibility;
|
pub(crate) use preparation::check_version_compatibility;
|
||||||
pub(crate) use preparation::parse_data;
|
pub(crate) use preparation::parse_data;
|
||||||
|
@ -152,6 +152,16 @@ fn make_exec_ctx(
|
|||||||
"CallResultsRepr.deserialize",
|
"CallResultsRepr.deserialize",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// This is a part of argument size limit check where we check the size of every call results.
|
||||||
|
if call_results
|
||||||
|
.values()
|
||||||
|
.any(|call_result| call_result.result.len() > run_parameters.call_result_size_limit as usize)
|
||||||
|
{
|
||||||
|
return Err(PreparationError::call_result_size_limit(
|
||||||
|
run_parameters.call_result_size_limit,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
let ctx = ExecutionCtx::new(
|
let ctx = ExecutionCtx::new(
|
||||||
prev_ingredients,
|
prev_ingredients,
|
||||||
current_ingredients,
|
current_ingredients,
|
||||||
|
@ -14,36 +14,27 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use air_interpreter_interface::SerializedCallResults;
|
|
||||||
|
|
||||||
use super::preparation::PreparationResult;
|
use super::preparation::PreparationResult;
|
||||||
use crate::PreparationError;
|
use crate::PreparationError;
|
||||||
|
|
||||||
const MB: usize = 1024 * 1024;
|
use air_interpreter_interface::RunParameters;
|
||||||
pub const MAX_AIR_SIZE: usize = 16 * MB;
|
|
||||||
pub const MAX_PARTICLE_SIZE: usize = 64 * MB;
|
|
||||||
pub const MAX_CALL_RESULTS_SIZE: usize = 32 * MB;
|
|
||||||
|
|
||||||
pub(crate) fn check_against_size_limits(
|
pub(crate) fn check_against_size_limits(
|
||||||
|
run_parameters: &RunParameters,
|
||||||
air: &str,
|
air: &str,
|
||||||
raw_current_data: &[u8],
|
raw_current_data: &[u8],
|
||||||
call_results: &SerializedCallResults,
|
|
||||||
) -> PreparationResult<()> {
|
) -> PreparationResult<()> {
|
||||||
if air.len() > MAX_AIR_SIZE {
|
if air.len() > run_parameters.air_size_limit as usize {
|
||||||
return Err(PreparationError::air_size_limit(air.len(), MAX_AIR_SIZE));
|
return Err(PreparationError::air_size_limit(
|
||||||
}
|
air.len(),
|
||||||
|
run_parameters.air_size_limit,
|
||||||
if raw_current_data.len() > MAX_PARTICLE_SIZE {
|
|
||||||
return Err(PreparationError::particle_size_limit(
|
|
||||||
raw_current_data.len(),
|
|
||||||
MAX_PARTICLE_SIZE,
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
if call_results.len() > MAX_CALL_RESULTS_SIZE {
|
if raw_current_data.len() > run_parameters.particle_size_limit as usize {
|
||||||
return Err(PreparationError::call_results_size_limit(
|
return Err(PreparationError::particle_size_limit(
|
||||||
call_results.len(),
|
raw_current_data.len(),
|
||||||
MAX_CALL_RESULTS_SIZE,
|
run_parameters.particle_size_limit,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ fn execute_air_impl(
|
|||||||
use crate::preparation_step::check_against_size_limits;
|
use crate::preparation_step::check_against_size_limits;
|
||||||
|
|
||||||
farewell_if_fail!(
|
farewell_if_fail!(
|
||||||
check_against_size_limits(&air, &raw_current_data, &call_results),
|
check_against_size_limits(¶ms, &air, &raw_current_data),
|
||||||
raw_prev_data
|
raw_prev_data
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ fn test_banned_signing_key() {
|
|||||||
let air_script = "(null)";
|
let air_script = "(null)";
|
||||||
let bad_algo_keypair = fluence_keypair::KeyPair::generate_secp256k1();
|
let bad_algo_keypair = fluence_keypair::KeyPair::generate_secp256k1();
|
||||||
|
|
||||||
let mut avm = create_avm_with_key::<NativeAirRunner>(bad_algo_keypair, unit_call_service());
|
let mut avm = create_avm_with_key::<NativeAirRunner>(bad_algo_keypair, unit_call_service(), <_>::default());
|
||||||
let res = avm
|
let res = avm
|
||||||
.call(air_script, "", "", TestRunParameters::from_init_peer_id("init_peer_id"))
|
.call(air_script, "", "", TestRunParameters::from_init_peer_id("init_peer_id"))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -80,7 +80,7 @@ fn test_attack_injection_current_peer_scalar() {
|
|||||||
Version::new(1, 1, 1),
|
Version::new(1, 1, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, unit_call_service());
|
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, unit_call_service(), <_>::default());
|
||||||
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
||||||
let prev_data = alice_data.serialize().unwrap();
|
let prev_data = alice_data.serialize().unwrap();
|
||||||
let cur_data = mallory_data.serialize().unwrap();
|
let cur_data = mallory_data.serialize().unwrap();
|
||||||
@ -151,7 +151,7 @@ fn test_attack_injection_current_peer_stream() {
|
|||||||
Version::new(1, 1, 1),
|
Version::new(1, 1, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, unit_call_service());
|
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, unit_call_service(), <_>::default());
|
||||||
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
||||||
let prev_data = alice_data.serialize().unwrap();
|
let prev_data = alice_data.serialize().unwrap();
|
||||||
let cur_data = mallory_data.serialize().unwrap();
|
let cur_data = mallory_data.serialize().unwrap();
|
||||||
@ -220,7 +220,7 @@ fn test_attack_injection_current_injection_unused() {
|
|||||||
Version::new(1, 1, 1),
|
Version::new(1, 1, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, unit_call_service());
|
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, unit_call_service(), <_>::default());
|
||||||
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
||||||
let prev_data = alice_data.serialize().unwrap();
|
let prev_data = alice_data.serialize().unwrap();
|
||||||
let cur_data = mallory_data.serialize().unwrap();
|
let cur_data = mallory_data.serialize().unwrap();
|
||||||
@ -281,7 +281,7 @@ fn test_attack_injection_other_peer_scalar() {
|
|||||||
Version::new(1, 1, 1),
|
Version::new(1, 1, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, unit_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, unit_call_service(), <_>::default());
|
||||||
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
||||||
let prev_data = "";
|
let prev_data = "";
|
||||||
let cur_data = mallory_data.serialize().unwrap();
|
let cur_data = mallory_data.serialize().unwrap();
|
||||||
@ -339,7 +339,7 @@ fn test_attack_injection_other_peer_stream() {
|
|||||||
Version::new(1, 1, 1),
|
Version::new(1, 1, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, unit_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, unit_call_service(), <_>::default());
|
||||||
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
||||||
let prev_data = "";
|
let prev_data = "";
|
||||||
let cur_data = mallory_data.serialize().unwrap();
|
let cur_data = mallory_data.serialize().unwrap();
|
||||||
@ -397,7 +397,7 @@ fn test_attack_injection_other_peer_unused() {
|
|||||||
Version::new(1, 1, 1),
|
Version::new(1, 1, 1),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, unit_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, unit_call_service(), <_>::default());
|
||||||
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
let test_run_params = TestRunParameters::from_init_peer_id(alice_peer_id);
|
||||||
let prev_data = "";
|
let prev_data = "";
|
||||||
let cur_data = mallory_data.serialize().unwrap();
|
let cur_data = mallory_data.serialize().unwrap();
|
||||||
@ -420,8 +420,9 @@ fn test_attack_replay() {
|
|||||||
(call "bob" ("" "") [] z))"#
|
(call "bob" ("" "") [] z))"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair.clone(), unit_call_service());
|
let mut alice_avm =
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair.clone(), unit_call_service());
|
create_avm_with_key::<NativeAirRunner>(alice_keypair.clone(), unit_call_service(), <_>::default());
|
||||||
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair.clone(), unit_call_service(), <_>::default());
|
||||||
|
|
||||||
let run_params1 = TestRunParameters::from_init_peer_id(&alice_peer_id).with_particle_id("first_particle");
|
let run_params1 = TestRunParameters::from_init_peer_id(&alice_peer_id).with_particle_id("first_particle");
|
||||||
let run_params2 = run_params1.clone();
|
let run_params2 = run_params1.clone();
|
||||||
|
@ -47,9 +47,9 @@ fn test_runtime_executed_call_argument_hash() {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, echo_call_service());
|
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, echo_call_service(), <_>::default());
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service(), <_>::default());
|
||||||
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service());
|
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service(), <_>::default());
|
||||||
|
|
||||||
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
||||||
let mallory_res = mallory_avm
|
let mallory_res = mallory_avm
|
||||||
@ -103,9 +103,9 @@ fn test_runtime_executed_call_tetraplet() {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, echo_call_service());
|
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, echo_call_service(), <_>::default());
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service(), <_>::default());
|
||||||
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service());
|
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service(), <_>::default());
|
||||||
|
|
||||||
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
||||||
let mallory_res = mallory_avm
|
let mallory_res = mallory_avm
|
||||||
@ -177,9 +177,10 @@ fn test_runtime_executed_failed_argument_hash() {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, fallible_call_service_by_arg(43));
|
let mut alice_avm =
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service());
|
create_avm_with_key::<NativeAirRunner>(alice_keypair, fallible_call_service_by_arg(43), <_>::default());
|
||||||
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service(), <_>::default());
|
||||||
|
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service(), <_>::default());
|
||||||
|
|
||||||
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
||||||
let mallory_res = mallory_avm
|
let mallory_res = mallory_avm
|
||||||
@ -237,9 +238,10 @@ fn test_runtime_failed_call_tetraplet() {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, fallible_call_service("service1"));
|
let mut alice_avm =
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service());
|
create_avm_with_key::<NativeAirRunner>(alice_keypair, fallible_call_service("service1"), <_>::default());
|
||||||
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service(), <_>::default());
|
||||||
|
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service(), <_>::default());
|
||||||
|
|
||||||
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
||||||
let mallory_res = mallory_avm
|
let mallory_res = mallory_avm
|
||||||
@ -309,9 +311,10 @@ fn test_runtime_canon_tetraplet() {
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut alice_avm = create_avm_with_key::<NativeAirRunner>(alice_keypair, fallible_call_service("service1"));
|
let mut alice_avm =
|
||||||
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service());
|
create_avm_with_key::<NativeAirRunner>(alice_keypair, fallible_call_service("service1"), <_>::default());
|
||||||
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service());
|
let mut bob_avm = create_avm_with_key::<NativeAirRunner>(bob_keypair, echo_call_service(), <_>::default());
|
||||||
|
let mut mallory_avm = create_avm_with_key::<NativeAirRunner>(mallory_keypair, echo_call_service(), <_>::default());
|
||||||
|
|
||||||
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
let alice_res = alice_avm.call(&air_script, "", "", test_run_params.clone()).unwrap();
|
||||||
let mallory_res = mallory_avm
|
let mallory_res = mallory_avm
|
||||||
|
@ -34,7 +34,7 @@ fn issue_310() {
|
|||||||
)
|
)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
let mut runner = DefaultAirRunner::new(&peer_id);
|
let mut runner = DefaultAirRunner::new(&peer_id, <_>::default());
|
||||||
let mut call = |prev_data, call_results| {
|
let mut call = |prev_data, call_results| {
|
||||||
runner
|
runner
|
||||||
.call(
|
.call(
|
||||||
|
@ -18,6 +18,9 @@ use air::PreparationError;
|
|||||||
use air_interpreter_interface::CallResultsFormat;
|
use air_interpreter_interface::CallResultsFormat;
|
||||||
use air_interpreter_interface::CallResultsRepr;
|
use air_interpreter_interface::CallResultsRepr;
|
||||||
use air_interpreter_interface::RunParameters;
|
use air_interpreter_interface::RunParameters;
|
||||||
|
use air_interpreter_interface::MAX_AIR_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_PARTICLE_SIZE;
|
||||||
use air_interpreter_sede::FromSerialized;
|
use air_interpreter_sede::FromSerialized;
|
||||||
use air_test_utils::prelude::*;
|
use air_test_utils::prelude::*;
|
||||||
|
|
||||||
@ -96,6 +99,10 @@ fn invalid_callresults() {
|
|||||||
let vec = Vec::<u8>::new();
|
let vec = Vec::<u8>::new();
|
||||||
let wrong_call_results = CallResultsFormat::default().to_vec(&vec).unwrap();
|
let wrong_call_results = CallResultsFormat::default().to_vec(&vec).unwrap();
|
||||||
let keypair = fluence_keypair::KeyPair::generate_ed25519();
|
let keypair = fluence_keypair::KeyPair::generate_ed25519();
|
||||||
|
let air_size_limit = MAX_AIR_SIZE;
|
||||||
|
let particle_size_limit = MAX_PARTICLE_SIZE;
|
||||||
|
let call_result_size_limit = MAX_CALL_RESULT_SIZE;
|
||||||
|
|
||||||
let run_parameters = RunParameters::new(
|
let run_parameters = RunParameters::new(
|
||||||
client_peer_id.clone(),
|
client_peer_id.clone(),
|
||||||
client_peer_id.clone(),
|
client_peer_id.clone(),
|
||||||
@ -104,6 +111,9 @@ fn invalid_callresults() {
|
|||||||
keypair.key_format().into(),
|
keypair.key_format().into(),
|
||||||
keypair.secret().unwrap(),
|
keypair.secret().unwrap(),
|
||||||
"".to_owned(),
|
"".to_owned(),
|
||||||
|
air_size_limit,
|
||||||
|
particle_size_limit,
|
||||||
|
call_result_size_limit,
|
||||||
);
|
);
|
||||||
|
|
||||||
let result = air::execute_air(air, prev_data, data, run_parameters, wrong_call_results.clone().into());
|
let result = air::execute_air(air, prev_data, data, run_parameters, wrong_call_results.clone().into());
|
||||||
@ -119,44 +129,41 @@ fn invalid_callresults() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn air_size_limit() {
|
fn air_size_limit() {
|
||||||
use air::MAX_AIR_SIZE;
|
let script = "a".repeat((MAX_AIR_SIZE + 1) as usize);
|
||||||
|
|
||||||
let script = "a".repeat(MAX_AIR_SIZE + 1);
|
|
||||||
let mut vm = create_avm(unit_call_service(), "some_peer_id");
|
let mut vm = create_avm(unit_call_service(), "some_peer_id");
|
||||||
let result = vm.call(script, "", "", <_>::default()).unwrap();
|
let result = vm.call(script, "", "", <_>::default()).unwrap();
|
||||||
|
|
||||||
let expected_error = PreparationError::AIRSizeLimitReached(MAX_AIR_SIZE + 1, MAX_AIR_SIZE);
|
let expected_error = PreparationError::AIRSizeLimitReached((MAX_AIR_SIZE + 1) as usize, MAX_AIR_SIZE);
|
||||||
|
|
||||||
assert!(check_error(&result, expected_error));
|
assert!(check_error(&result, expected_error));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn particle_size_limit() {
|
fn particle_size_limit() {
|
||||||
use air::MAX_PARTICLE_SIZE;
|
|
||||||
|
|
||||||
let script = "(null)";
|
let script = "(null)";
|
||||||
let mut vm = create_avm(unit_call_service(), "some_peer_id");
|
let mut vm = create_avm(unit_call_service(), "some_peer_id");
|
||||||
let cur_data = vec![0; MAX_PARTICLE_SIZE + 1];
|
let cur_data = vec![0; (MAX_PARTICLE_SIZE + 1) as usize];
|
||||||
let result = vm.call(script, "", cur_data, <_>::default()).unwrap();
|
let result = vm.call(script, "", cur_data, <_>::default()).unwrap();
|
||||||
|
|
||||||
let expected_error = PreparationError::ParticleSizeLimitReached(MAX_PARTICLE_SIZE + 1, MAX_PARTICLE_SIZE);
|
let expected_error =
|
||||||
|
PreparationError::ParticleSizeLimitReached((MAX_PARTICLE_SIZE + 1) as usize, MAX_PARTICLE_SIZE);
|
||||||
|
|
||||||
assert!(check_error(&result, expected_error));
|
assert!(check_error(&result, expected_error));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn call_results_size_limit() {
|
fn call_result_size_limit() {
|
||||||
use maplit::hashmap;
|
use maplit::hashmap;
|
||||||
|
|
||||||
use air::ToErrorCode;
|
use air::ToErrorCode;
|
||||||
use air::MAX_CALL_RESULTS_SIZE;
|
use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
|
||||||
|
|
||||||
let peer_id = "some_peer_id";
|
let peer_id = "some_peer_id";
|
||||||
let mut vm = create_avm(unit_call_service(), "some_peer_id");
|
let mut vm = create_avm(unit_call_service(), "some_peer_id");
|
||||||
|
|
||||||
let script = "(null)";
|
let script = "(null)";
|
||||||
let result_1 = "a".repeat(MAX_CALL_RESULTS_SIZE / 2 + 1);
|
let result_1 = "a".repeat((MAX_CALL_RESULT_SIZE / 2 + 1) as usize);
|
||||||
let result_2 = "b".repeat(MAX_CALL_RESULTS_SIZE / 2 + 1);
|
let result_2 = "b".repeat((MAX_CALL_RESULT_SIZE + 1) as usize);
|
||||||
let call_results: CallResults =
|
let call_results: CallResults =
|
||||||
hashmap! {0 => CallServiceResult::ok(result_1.into()), 1 => CallServiceResult::ok(result_2.into())};
|
hashmap! {0 => CallServiceResult::ok(result_1.into()), 1 => CallServiceResult::ok(result_2.into())};
|
||||||
|
|
||||||
@ -164,7 +171,7 @@ fn call_results_size_limit() {
|
|||||||
.call_single(script, "", "", peer_id, 0, 64, None, call_results, "particle_id")
|
.call_single(script, "", "", peer_id, 0, 64, None, call_results, "particle_id")
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let expected_error =
|
let expected_error = PreparationError::CallResultSizeLimitReached(MAX_CALL_RESULT_SIZE);
|
||||||
PreparationError::CallResultsSizeLimitReached(MAX_CALL_RESULTS_SIZE + 1, MAX_CALL_RESULTS_SIZE);
|
|
||||||
assert_eq!(result.ret_code, expected_error.to_error_code());
|
assert_eq!(result.ret_code, expected_error.to_error_code());
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@ mod call_service_result;
|
|||||||
mod outcome;
|
mod outcome;
|
||||||
mod particle_parameters;
|
mod particle_parameters;
|
||||||
pub mod raw_outcome;
|
pub mod raw_outcome;
|
||||||
mod runtime_parameters;
|
|
||||||
|
|
||||||
use air_interpreter_interface::CallArgumentsDeserializeError;
|
use air_interpreter_interface::CallArgumentsDeserializeError;
|
||||||
use air_interpreter_interface::CallRequestsDeserializeError;
|
use air_interpreter_interface::CallRequestsDeserializeError;
|
||||||
@ -82,4 +81,3 @@ pub use call_request_parameters::*;
|
|||||||
pub use call_service_result::*;
|
pub use call_service_result::*;
|
||||||
pub use outcome::*;
|
pub use outcome::*;
|
||||||
pub use particle_parameters::*;
|
pub use particle_parameters::*;
|
||||||
pub use runtime_parameters::*;
|
|
||||||
|
@ -45,25 +45,3 @@ impl<'ctx> ParticleParameters<'ctx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents parameters obtained from a particle.
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
||||||
pub struct AquaVMRuntimeParameters {
|
|
||||||
air_size_limit: u32,
|
|
||||||
particle_size_limit: u32,
|
|
||||||
call_results_size_limit: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AquaVMRuntimeParameters {
|
|
||||||
pub fn new(
|
|
||||||
air_size_limit: u32,
|
|
||||||
particle_size_limit: u32,
|
|
||||||
call_results_size_limit: u32,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
air_size_limit,
|
|
||||||
particle_size_limit,
|
|
||||||
call_results_size_limit,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -70,7 +70,7 @@ impl<E> AVM<E> {
|
|||||||
|
|
||||||
data_store.initialize()?;
|
data_store.initialize()?;
|
||||||
|
|
||||||
let runner = AVMRunner::new(air_wasm_path, max_heap_size, logging_mask)
|
let runner = AVMRunner::new(air_wasm_path, max_heap_size, None, None, None, logging_mask)
|
||||||
.map_err(AVMError::RunnerError)?;
|
.map_err(AVMError::RunnerError)?;
|
||||||
let runner = SendSafeRunner(runner);
|
let runner = SendSafeRunner(runner);
|
||||||
let avm = Self { runner, data_store };
|
let avm = Self { runner, data_store };
|
||||||
|
@ -38,6 +38,12 @@ pub struct AVMRunner {
|
|||||||
wasm_filename: String,
|
wasm_filename: String,
|
||||||
/// The memory limit provided by constructor
|
/// The memory limit provided by constructor
|
||||||
total_memory_limit: Option<u64>,
|
total_memory_limit: Option<u64>,
|
||||||
|
/// The AIR script size limit.
|
||||||
|
pub air_size_limit: u64,
|
||||||
|
/// The particle data size limit.
|
||||||
|
pub particle_size_limit: u64,
|
||||||
|
// This is the limit for the size of service call result.
|
||||||
|
pub call_result_size_limit: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return statistic of AVM server Wasm module heap footprint.
|
/// Return statistic of AVM server Wasm module heap footprint.
|
||||||
@ -57,18 +63,32 @@ impl AVMRunner {
|
|||||||
pub fn new(
|
pub fn new(
|
||||||
air_wasm_path: PathBuf,
|
air_wasm_path: PathBuf,
|
||||||
total_memory_limit: Option<u64>,
|
total_memory_limit: Option<u64>,
|
||||||
|
air_size_limit: Option<u64>,
|
||||||
|
particle_size_limit: Option<u64>,
|
||||||
|
call_result_size_limit: Option<u64>,
|
||||||
logging_mask: i32,
|
logging_mask: i32,
|
||||||
) -> RunnerResult<Self> {
|
) -> RunnerResult<Self> {
|
||||||
|
use air_interpreter_interface::MAX_AIR_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_PARTICLE_SIZE;
|
||||||
|
|
||||||
let (wasm_dir, wasm_filename) = split_dirname(air_wasm_path)?;
|
let (wasm_dir, wasm_filename) = split_dirname(air_wasm_path)?;
|
||||||
|
|
||||||
let marine_config =
|
let marine_config =
|
||||||
make_marine_config(wasm_dir, &wasm_filename, total_memory_limit, logging_mask);
|
make_marine_config(wasm_dir, &wasm_filename, total_memory_limit, logging_mask);
|
||||||
let marine = Marine::with_raw_config(marine_config)?;
|
let marine = Marine::with_raw_config(marine_config)?;
|
||||||
|
|
||||||
|
let air_size_limit = air_size_limit.unwrap_or(MAX_AIR_SIZE);
|
||||||
|
let particle_size_limit = particle_size_limit.unwrap_or(MAX_PARTICLE_SIZE);
|
||||||
|
let call_result_size_limit = call_result_size_limit.unwrap_or(MAX_CALL_RESULT_SIZE);
|
||||||
|
|
||||||
let avm = Self {
|
let avm = Self {
|
||||||
marine,
|
marine,
|
||||||
wasm_filename,
|
wasm_filename,
|
||||||
total_memory_limit,
|
total_memory_limit,
|
||||||
|
air_size_limit,
|
||||||
|
particle_size_limit,
|
||||||
|
call_result_size_limit,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(avm)
|
Ok(avm)
|
||||||
@ -102,6 +122,9 @@ impl AVMRunner {
|
|||||||
init_peer_id.into(),
|
init_peer_id.into(),
|
||||||
timestamp,
|
timestamp,
|
||||||
ttl,
|
ttl,
|
||||||
|
self.air_size_limit,
|
||||||
|
self.particle_size_limit,
|
||||||
|
self.call_result_size_limit,
|
||||||
call_results,
|
call_results,
|
||||||
key_format.into(),
|
key_format.into(),
|
||||||
secret_key_bytes,
|
secret_key_bytes,
|
||||||
@ -150,6 +173,9 @@ impl AVMRunner {
|
|||||||
init_peer_id.into(),
|
init_peer_id.into(),
|
||||||
timestamp,
|
timestamp,
|
||||||
ttl,
|
ttl,
|
||||||
|
self.air_size_limit,
|
||||||
|
self.particle_size_limit,
|
||||||
|
self.call_result_size_limit,
|
||||||
call_results,
|
call_results,
|
||||||
key_format,
|
key_format,
|
||||||
secret_key_bytes,
|
secret_key_bytes,
|
||||||
@ -216,6 +242,9 @@ fn prepare_args(
|
|||||||
init_peer_id: String,
|
init_peer_id: String,
|
||||||
timestamp: u64,
|
timestamp: u64,
|
||||||
ttl: u32,
|
ttl: u32,
|
||||||
|
air_size_limit: u64,
|
||||||
|
particle_size_limit: u64,
|
||||||
|
call_result_size_limit: u64,
|
||||||
call_results: CallResults,
|
call_results: CallResults,
|
||||||
key_format: u8,
|
key_format: u8,
|
||||||
secret_key_bytes: Vec<u8>,
|
secret_key_bytes: Vec<u8>,
|
||||||
@ -229,6 +258,9 @@ fn prepare_args(
|
|||||||
key_format,
|
key_format,
|
||||||
secret_key_bytes,
|
secret_key_bytes,
|
||||||
particle_id,
|
particle_id,
|
||||||
|
air_size_limit,
|
||||||
|
particle_size_limit,
|
||||||
|
call_result_size_limit,
|
||||||
)
|
)
|
||||||
.into_ivalue();
|
.into_ivalue();
|
||||||
|
|
||||||
|
@ -29,9 +29,11 @@
|
|||||||
mod call_request_parameters;
|
mod call_request_parameters;
|
||||||
mod call_service_result;
|
mod call_service_result;
|
||||||
mod interpreter_outcome;
|
mod interpreter_outcome;
|
||||||
|
mod run_args_memory_limits;
|
||||||
mod run_parameters;
|
mod run_parameters;
|
||||||
|
|
||||||
pub use call_request_parameters::*;
|
pub use call_request_parameters::*;
|
||||||
pub use call_service_result::*;
|
pub use call_service_result::*;
|
||||||
pub use interpreter_outcome::*;
|
pub use interpreter_outcome::*;
|
||||||
|
pub use run_args_memory_limits::*;
|
||||||
pub use run_parameters::*;
|
pub use run_parameters::*;
|
||||||
|
@ -14,27 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use serde::Deserialize;
|
const MB: u64 = 1024 * 1024;
|
||||||
use serde::Serialize;
|
pub static MAX_AIR_SIZE: u64 = 16 * MB;
|
||||||
|
pub static MAX_PARTICLE_SIZE: u64 = 64 * MB;
|
||||||
/// Represents runtime parameters to hand over to AquaVM.
|
pub static MAX_CALL_RESULT_SIZE: u64 = 32 * MB;
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
||||||
pub struct RuntimeParameters {
|
|
||||||
air_size_limit: u32,
|
|
||||||
particle_size_limit: u32,
|
|
||||||
call_results_size_limit: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl RuntimeParameters {
|
|
||||||
pub fn new(
|
|
||||||
air_size_limit: u32,
|
|
||||||
particle_size_limit: u32,
|
|
||||||
call_results_size_limit: u32,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
air_size_limit,
|
|
||||||
particle_size_limit,
|
|
||||||
call_results_size_limit,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -53,6 +53,15 @@ pub struct RunParameters {
|
|||||||
|
|
||||||
/// Unique particle ID.
|
/// Unique particle ID.
|
||||||
pub particle_id: String,
|
pub particle_id: String,
|
||||||
|
|
||||||
|
/// The AIR script size limit.
|
||||||
|
pub air_size_limit: u64,
|
||||||
|
|
||||||
|
/// The particle data size limit.
|
||||||
|
pub particle_size_limit: u64,
|
||||||
|
|
||||||
|
/// This is the limit for the size of service call result.
|
||||||
|
pub call_result_size_limit: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RunParameters {
|
impl RunParameters {
|
||||||
@ -64,6 +73,9 @@ impl RunParameters {
|
|||||||
key_format: u8,
|
key_format: u8,
|
||||||
secret_key_bytes: Vec<u8>,
|
secret_key_bytes: Vec<u8>,
|
||||||
particle_id: String,
|
particle_id: String,
|
||||||
|
air_size_limit: u64,
|
||||||
|
particle_size_limit: u64,
|
||||||
|
call_result_size_limit: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
init_peer_id,
|
init_peer_id,
|
||||||
@ -73,6 +85,9 @@ impl RunParameters {
|
|||||||
key_format,
|
key_format,
|
||||||
secret_key_bytes,
|
secret_key_bytes,
|
||||||
particle_id,
|
particle_id,
|
||||||
|
air_size_limit,
|
||||||
|
particle_size_limit,
|
||||||
|
call_result_size_limit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +101,9 @@ impl RunParameters {
|
|||||||
IValue::U8(self.key_format),
|
IValue::U8(self.key_format),
|
||||||
IValue::ByteArray(self.secret_key_bytes),
|
IValue::ByteArray(self.secret_key_bytes),
|
||||||
IValue::String(self.particle_id),
|
IValue::String(self.particle_id),
|
||||||
|
IValue::U64(self.air_size_limit),
|
||||||
|
IValue::U64(self.particle_size_limit),
|
||||||
|
IValue::U64(self.call_result_size_limit),
|
||||||
];
|
];
|
||||||
// unwrap is safe here because run_parameters is non-empty array
|
// unwrap is safe here because run_parameters is non-empty array
|
||||||
let run_parameters = NEVec::new(run_parameters).unwrap();
|
let run_parameters = NEVec::new(run_parameters).unwrap();
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use crate::prelude::TestInitParameters;
|
||||||
use crate::test_runner::AirRunner;
|
use crate::test_runner::AirRunner;
|
||||||
use air_interpreter_interface::CallResultsRepr;
|
use air_interpreter_interface::CallResultsRepr;
|
||||||
use air_interpreter_interface::RunParameters;
|
use air_interpreter_interface::RunParameters;
|
||||||
@ -24,12 +25,14 @@ use fluence_keypair::KeyPair;
|
|||||||
|
|
||||||
pub struct NativeAirRunner {
|
pub struct NativeAirRunner {
|
||||||
current_peer_id: String,
|
current_peer_id: String,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AirRunner for NativeAirRunner {
|
impl AirRunner for NativeAirRunner {
|
||||||
fn new(current_peer_id: impl Into<String>) -> Self {
|
fn new(current_peer_id: impl Into<String>, test_init_parameters: TestInitParameters) -> Self {
|
||||||
Self {
|
Self {
|
||||||
current_peer_id: current_peer_id.into(),
|
current_peer_id: current_peer_id.into(),
|
||||||
|
test_init_parameters,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,6 +59,9 @@ impl AirRunner for NativeAirRunner {
|
|||||||
let key_format = keypair.key_format().into();
|
let key_format = keypair.key_format().into();
|
||||||
let secret_key_bytes = keypair.secret().unwrap();
|
let secret_key_bytes = keypair.secret().unwrap();
|
||||||
|
|
||||||
|
let (air_size_limit, particle_size_limit, call_result_size_limit) =
|
||||||
|
self.test_init_parameters.to_attributes_w_default();
|
||||||
|
|
||||||
let outcome = air::execute_air(
|
let outcome = air::execute_air(
|
||||||
air.into(),
|
air.into(),
|
||||||
prev_data.into(),
|
prev_data.into(),
|
||||||
@ -68,6 +74,9 @@ impl AirRunner for NativeAirRunner {
|
|||||||
key_format,
|
key_format,
|
||||||
secret_key_bytes,
|
secret_key_bytes,
|
||||||
particle_id,
|
particle_id,
|
||||||
|
air_size_limit,
|
||||||
|
particle_size_limit,
|
||||||
|
call_result_size_limit,
|
||||||
},
|
},
|
||||||
raw_call_results,
|
raw_call_results,
|
||||||
);
|
);
|
||||||
|
@ -33,7 +33,7 @@ use std::collections::HashMap;
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
pub trait AirRunner {
|
pub trait AirRunner {
|
||||||
fn new(current_call_id: impl Into<String>) -> Self;
|
fn new(current_call_id: impl Into<String>, test_init_parameters: TestInitParameters) -> Self;
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn call(
|
fn call(
|
||||||
@ -68,6 +68,14 @@ pub struct TestRunParameters {
|
|||||||
pub particle_id: String,
|
pub particle_id: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This struct is used to set limits for the test runner creating AVMRunner.
|
||||||
|
#[derive(Debug, Default, Clone)]
|
||||||
|
pub struct TestInitParameters {
|
||||||
|
pub air_size_limit: Option<u64>,
|
||||||
|
pub particle_size_limit: Option<u64>,
|
||||||
|
pub call_result_size_limit: Option<u64>,
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: AirRunner> TestRunner<R> {
|
impl<R: AirRunner> TestRunner<R> {
|
||||||
pub fn call(
|
pub fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
@ -169,10 +177,8 @@ pub fn create_custom_avm<R: AirRunner>(
|
|||||||
current_peer_id: impl Into<String>,
|
current_peer_id: impl Into<String>,
|
||||||
) -> TestRunner<R> {
|
) -> TestRunner<R> {
|
||||||
let current_peer_id = current_peer_id.into();
|
let current_peer_id = current_peer_id.into();
|
||||||
|
|
||||||
let (keypair, _) = derive_dummy_keypair(¤t_peer_id);
|
let (keypair, _) = derive_dummy_keypair(¤t_peer_id);
|
||||||
|
let runner = R::new(current_peer_id, <_>::default());
|
||||||
let runner = R::new(current_peer_id);
|
|
||||||
|
|
||||||
TestRunner {
|
TestRunner {
|
||||||
runner,
|
runner,
|
||||||
@ -184,10 +190,11 @@ pub fn create_custom_avm<R: AirRunner>(
|
|||||||
pub fn create_avm_with_key<R: AirRunner>(
|
pub fn create_avm_with_key<R: AirRunner>(
|
||||||
keypair: impl Into<KeyPair>,
|
keypair: impl Into<KeyPair>,
|
||||||
call_service: CallServiceClosure,
|
call_service: CallServiceClosure,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
) -> TestRunner<R> {
|
) -> TestRunner<R> {
|
||||||
let keypair = keypair.into();
|
let keypair = keypair.into();
|
||||||
let current_peer_id = keypair.public().to_peer_id().to_string();
|
let current_peer_id = keypair.public().to_peer_id().to_string();
|
||||||
let runner = R::new(current_peer_id);
|
let runner = R::new(current_peer_id, test_init_parameters);
|
||||||
|
|
||||||
TestRunner {
|
TestRunner {
|
||||||
runner,
|
runner,
|
||||||
@ -239,6 +246,35 @@ impl TestRunParameters {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TestInitParameters {
|
||||||
|
pub fn new(air_size_limit: u64, particle_size_limit: u64, call_result_size_limit: u64) -> Self {
|
||||||
|
Self {
|
||||||
|
air_size_limit: Some(air_size_limit),
|
||||||
|
particle_size_limit: Some(particle_size_limit),
|
||||||
|
call_result_size_limit: Some(call_result_size_limit),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn no_limits() -> Self {
|
||||||
|
Self {
|
||||||
|
air_size_limit: Some(u64::MAX),
|
||||||
|
particle_size_limit: Some(u64::MAX),
|
||||||
|
call_result_size_limit: Some(u64::MAX),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn to_attributes_w_default(&self) -> (u64, u64, u64) {
|
||||||
|
use air_interpreter_interface::MAX_AIR_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_PARTICLE_SIZE;
|
||||||
|
|
||||||
|
let air_size_limit = self.air_size_limit.unwrap_or(MAX_AIR_SIZE);
|
||||||
|
let particle_size_limit: u64 = self.particle_size_limit.unwrap_or(MAX_PARTICLE_SIZE);
|
||||||
|
let call_result_size_limit = self.call_result_size_limit.unwrap_or(MAX_CALL_RESULT_SIZE);
|
||||||
|
(air_size_limit, particle_size_limit, call_result_size_limit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use crate::prelude::TestInitParameters;
|
||||||
use crate::test_runner::AirRunner;
|
use crate::test_runner::AirRunner;
|
||||||
|
|
||||||
use avm_server::avm_runner::*;
|
use avm_server::avm_runner::*;
|
||||||
@ -32,19 +33,24 @@ pub struct WasmAirRunner {
|
|||||||
runner: object_pool::Reusable<'static, AVMRunner>,
|
runner: object_pool::Reusable<'static, AVMRunner>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_pooled_avm_runner() -> AVMRunner {
|
fn make_pooled_avm_runner(test_init_parameters: TestInitParameters) -> AVMRunner {
|
||||||
let logging_mask = i32::MAX;
|
let logging_mask = i32::MAX;
|
||||||
|
let (air_size_limit, particle_size_limit, call_result_size_limit) =
|
||||||
|
test_init_parameters.to_attributes_w_default();
|
||||||
|
|
||||||
AVMRunner::new(
|
AVMRunner::new(
|
||||||
PathBuf::from(AIR_WASM_PATH),
|
PathBuf::from(AIR_WASM_PATH),
|
||||||
Some(AVM_MAX_HEAP_SIZE),
|
Some(AVM_MAX_HEAP_SIZE),
|
||||||
|
Some(air_size_limit),
|
||||||
|
Some(particle_size_limit),
|
||||||
|
Some(call_result_size_limit),
|
||||||
logging_mask,
|
logging_mask,
|
||||||
)
|
)
|
||||||
.expect("vm should be created")
|
.expect("vm should be created")
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AirRunner for WasmAirRunner {
|
impl AirRunner for WasmAirRunner {
|
||||||
fn new(current_peer_id: impl Into<String>) -> Self {
|
fn new(current_peer_id: impl Into<String>, test_init_parameters: TestInitParameters) -> Self {
|
||||||
static POOL_CELL: OnceCell<object_pool::Pool<AVMRunner>> = OnceCell::new();
|
static POOL_CELL: OnceCell<object_pool::Pool<AVMRunner>> = OnceCell::new();
|
||||||
|
|
||||||
let pool = POOL_CELL.get_or_init(|| {
|
let pool = POOL_CELL.get_or_init(|| {
|
||||||
@ -55,7 +61,7 @@ impl AirRunner for WasmAirRunner {
|
|||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
let runner = pool.pull(make_pooled_avm_runner);
|
let runner = pool.pull(|| make_pooled_avm_runner(test_init_parameters.clone()));
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
current_peer_id: current_peer_id.into(),
|
current_peer_id: current_peer_id.into(),
|
||||||
@ -106,12 +112,17 @@ pub struct ReleaseWasmAirRunner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AirRunner for ReleaseWasmAirRunner {
|
impl AirRunner for ReleaseWasmAirRunner {
|
||||||
fn new(current_peer_id: impl Into<String>) -> Self {
|
fn new(current_peer_id: impl Into<String>, test_init_parameters: TestInitParameters) -> Self {
|
||||||
let logging_mask = i32::MAX;
|
let logging_mask = i32::MAX;
|
||||||
|
let (air_size_limit, particle_size_limit, call_result_size_limit) =
|
||||||
|
test_init_parameters.to_attributes_w_default();
|
||||||
|
|
||||||
let runner = AVMRunner::new(
|
let runner = AVMRunner::new(
|
||||||
PathBuf::from(RELEASE_AIR_WASM_PATH),
|
PathBuf::from(RELEASE_AIR_WASM_PATH),
|
||||||
Some(AVM_MAX_HEAP_SIZE),
|
Some(AVM_MAX_HEAP_SIZE),
|
||||||
|
Some(air_size_limit),
|
||||||
|
Some(particle_size_limit),
|
||||||
|
Some(call_result_size_limit),
|
||||||
logging_mask,
|
logging_mask,
|
||||||
)
|
)
|
||||||
.expect("vm should be created");
|
.expect("vm should be created");
|
||||||
@ -135,6 +146,7 @@ impl AirRunner for ReleaseWasmAirRunner {
|
|||||||
keypair: &KeyPair,
|
keypair: &KeyPair,
|
||||||
particle_id: String,
|
particle_id: String,
|
||||||
) -> Result<RawAVMOutcome, Box<dyn std::error::Error>> {
|
) -> Result<RawAVMOutcome, Box<dyn std::error::Error>> {
|
||||||
|
println!("running release wasm runner#####");
|
||||||
let current_peer_id =
|
let current_peer_id =
|
||||||
override_current_peer_id.unwrap_or_else(|| self.current_peer_id.clone());
|
override_current_peer_id.unwrap_or_else(|| self.current_peer_id.clone());
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ use crate::{
|
|||||||
use air_test_utils::{
|
use air_test_utils::{
|
||||||
key_utils::derive_dummy_keypair,
|
key_utils::derive_dummy_keypair,
|
||||||
test_runner::{
|
test_runner::{
|
||||||
create_avm_with_key, AirRunner, DefaultAirRunner, TestRunParameters, TestRunner,
|
create_avm_with_key, AirRunner, DefaultAirRunner, TestInitParameters, TestRunParameters,
|
||||||
|
TestRunner,
|
||||||
},
|
},
|
||||||
RawAVMOutcome,
|
RawAVMOutcome,
|
||||||
};
|
};
|
||||||
@ -86,10 +87,14 @@ pub struct Peer<R> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<R: AirRunner> Peer<R> {
|
impl<R: AirRunner> Peer<R> {
|
||||||
pub fn new(keypair: impl Into<KeyPair>, services: Rc<[MarineServiceHandle]>) -> Self {
|
pub fn new(
|
||||||
|
keypair: impl Into<KeyPair>,
|
||||||
|
services: Rc<[MarineServiceHandle]>,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
|
) -> Self {
|
||||||
let call_service = services_to_call_service_closure(services);
|
let call_service = services_to_call_service_closure(services);
|
||||||
|
|
||||||
let runner = create_avm_with_key::<R>(keypair, call_service);
|
let runner = create_avm_with_key::<R>(keypair, call_service, test_init_parameters);
|
||||||
let peer_id = runner.runner.get_current_peer_id().into();
|
let peer_id = runner.runner.get_current_peer_id().into();
|
||||||
|
|
||||||
Self { peer_id, runner }
|
Self { peer_id, runner }
|
||||||
@ -143,7 +148,8 @@ pub struct Network<R = DefaultAirRunner> {
|
|||||||
// extencive test code changes
|
// extencive test code changes
|
||||||
impl Network<DefaultAirRunner> {
|
impl Network<DefaultAirRunner> {
|
||||||
pub fn empty() -> Rc<Self> {
|
pub fn empty() -> Rc<Self> {
|
||||||
Self::new(std::iter::empty::<PeerId>(), vec![])
|
let test_init_parameters = TestInitParameters::default();
|
||||||
|
Self::new(std::iter::empty::<PeerId>(), vec![], test_init_parameters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +157,7 @@ impl<R: AirRunner> Network<R> {
|
|||||||
pub fn new(
|
pub fn new(
|
||||||
named_peers: impl Iterator<Item = impl Into<PeerId>>,
|
named_peers: impl Iterator<Item = impl Into<PeerId>>,
|
||||||
common_services: Vec<MarineServiceHandle>,
|
common_services: Vec<MarineServiceHandle>,
|
||||||
|
test_init_params: TestInitParameters,
|
||||||
) -> Rc<Self> {
|
) -> Rc<Self> {
|
||||||
let network = Rc::new(Self {
|
let network = Rc::new(Self {
|
||||||
peers: Default::default(),
|
peers: Default::default(),
|
||||||
@ -158,13 +165,13 @@ impl<R: AirRunner> Network<R> {
|
|||||||
resolver: Default::default(),
|
resolver: Default::default(),
|
||||||
});
|
});
|
||||||
for peer_name in named_peers {
|
for peer_name in named_peers {
|
||||||
network.ensure_named_peer(peer_name);
|
network.ensure_named_peer(peer_name, test_init_params.clone());
|
||||||
}
|
}
|
||||||
network
|
network
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_peers(nodes: Vec<Peer<R>>) -> Rc<Self> {
|
pub fn from_peers(nodes: Vec<Peer<R>>, test_init_params: TestInitParameters) -> Rc<Self> {
|
||||||
let network = Self::new(std::iter::empty::<PeerId>(), vec![]);
|
let network = Self::new(std::iter::empty::<PeerId>(), vec![], test_init_params);
|
||||||
let neighborhood: PeerSet = nodes.iter().map(|peer| peer.peer_id.clone()).collect();
|
let neighborhood: PeerSet = nodes.iter().map(|peer| peer.peer_id.clone()).collect();
|
||||||
for peer in nodes {
|
for peer in nodes {
|
||||||
network.add_peer_env(peer, neighborhood.iter().cloned());
|
network.add_peer_env(peer, neighborhood.iter().cloned());
|
||||||
@ -183,7 +190,11 @@ impl<R: AirRunner> Network<R> {
|
|||||||
self.insert_peer_env_entry(peer_id, peer_env);
|
self.insert_peer_env_entry(peer_id, peer_env);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ensure_named_peer(self: &Rc<Self>, name: impl Into<PeerId>) -> PeerId {
|
pub fn ensure_named_peer(
|
||||||
|
self: &Rc<Self>,
|
||||||
|
name: impl Into<PeerId>,
|
||||||
|
test_init_params: TestInitParameters,
|
||||||
|
) -> PeerId {
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
|
|
||||||
let name = name.into();
|
let name = name.into();
|
||||||
@ -192,7 +203,7 @@ impl<R: AirRunner> Network<R> {
|
|||||||
Entry::Occupied(entry) => entry.get().clone(),
|
Entry::Occupied(entry) => entry.get().clone(),
|
||||||
Entry::Vacant(empty) => {
|
Entry::Vacant(empty) => {
|
||||||
let (keypair, _) = derive_dummy_keypair(&name);
|
let (keypair, _) = derive_dummy_keypair(&name);
|
||||||
let peer = Peer::new(keypair, self.services.get_services());
|
let peer = Peer::new(keypair, self.services.get_services(), test_init_params);
|
||||||
let peer_id = peer.get_peer_id().clone();
|
let peer_id = peer.get_peer_id().clone();
|
||||||
self.add_peer(peer);
|
self.add_peer(peer);
|
||||||
|
|
||||||
|
@ -243,9 +243,13 @@ mod tests {
|
|||||||
let (_other_pk1, other_id) = derive_dummy_keypair(other_name);
|
let (_other_pk1, other_id) = derive_dummy_keypair(other_name);
|
||||||
let peer_id = PeerId::from(peer_id);
|
let peer_id = PeerId::from(peer_id);
|
||||||
let other_id = PeerId::from(other_id);
|
let other_id = PeerId::from(other_id);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
assert!(penv.is_reachable(&peer_id));
|
assert!(penv.is_reachable(&peer_id));
|
||||||
assert!(!penv.is_reachable(&other_id));
|
assert!(!penv.is_reachable(&other_id));
|
||||||
}
|
}
|
||||||
@ -258,9 +262,13 @@ mod tests {
|
|||||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name);
|
let (_other_pk, other_id) = derive_dummy_keypair(other_name);
|
||||||
let peer_id = PeerId::from(peer_id);
|
let peer_id = PeerId::from(peer_id);
|
||||||
let other_id = PeerId::from(other_id);
|
let other_id = PeerId::from(other_id);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
{
|
{
|
||||||
let nei = penv.get_neighborhood_mut();
|
let nei = penv.get_neighborhood_mut();
|
||||||
|
|
||||||
@ -286,15 +294,19 @@ mod tests {
|
|||||||
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
||||||
let other_id1 = PeerId::from(other_id1);
|
let other_id1 = PeerId::from(other_id1);
|
||||||
let other_id2 = PeerId::from(other_id2);
|
let other_id2 = PeerId::from(other_id2);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
// iter is empty
|
// iter is empty
|
||||||
assert!(penv.iter().next().is_none());
|
assert!(penv.iter().next().is_none());
|
||||||
|
|
||||||
network.ensure_named_peer(other_name1);
|
network.ensure_named_peer(other_name1, <_>::default());
|
||||||
network.ensure_named_peer(other_name1);
|
network.ensure_named_peer(other_name1, <_>::default());
|
||||||
network.ensure_named_peer(other_name2);
|
network.ensure_named_peer(other_name2, <_>::default());
|
||||||
let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
|
let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
|
||||||
assert_eq!(penv.iter().collect::<PeerSet>(), expected_neighborhood);
|
assert_eq!(penv.iter().collect::<PeerSet>(), expected_neighborhood);
|
||||||
}
|
}
|
||||||
@ -309,15 +321,19 @@ mod tests {
|
|||||||
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
||||||
let other_id1 = PeerId::from(other_id1);
|
let other_id1 = PeerId::from(other_id1);
|
||||||
let other_id2 = PeerId::from(other_id2);
|
let other_id2 = PeerId::from(other_id2);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
|
|
||||||
// iter is empty
|
// iter is empty
|
||||||
assert!(penv.iter().next().is_none());
|
assert!(penv.iter().next().is_none());
|
||||||
|
|
||||||
network.ensure_named_peer(other_name1);
|
network.ensure_named_peer(other_name1, <_>::default());
|
||||||
network.ensure_named_peer(other_name2);
|
network.ensure_named_peer(other_name2, <_>::default());
|
||||||
let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
|
let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
|
||||||
assert_eq!(PeerSet::from_iter(penv.iter()), expected_neighborhood);
|
assert_eq!(PeerSet::from_iter(penv.iter()), expected_neighborhood);
|
||||||
}
|
}
|
||||||
@ -332,9 +348,13 @@ mod tests {
|
|||||||
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
||||||
let other_id1 = PeerId::from(other_id1);
|
let other_id1 = PeerId::from(other_id1);
|
||||||
let other_id2 = PeerId::from(other_id2);
|
let other_id2 = PeerId::from(other_id2);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
|
|
||||||
// iter is empty
|
// iter is empty
|
||||||
assert!(penv.iter().next().is_none());
|
assert!(penv.iter().next().is_none());
|
||||||
@ -353,9 +373,13 @@ mod tests {
|
|||||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||||
let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
|
let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
|
||||||
let other_id1 = PeerId::from(other_id1);
|
let other_id1 = PeerId::from(other_id1);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
|
|
||||||
// iter is empty
|
// iter is empty
|
||||||
assert!(penv.iter().next().is_none());
|
assert!(penv.iter().next().is_none());
|
||||||
@ -373,9 +397,13 @@ mod tests {
|
|||||||
let peer_name = "peer";
|
let peer_name = "peer";
|
||||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||||
|
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
penv.get_neighborhood_mut()
|
penv.get_neighborhood_mut()
|
||||||
.alter(PeerId::from("zero"), AlterState::Added);
|
.alter(PeerId::from("zero"), AlterState::Added);
|
||||||
penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
|
penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
|
||||||
@ -388,10 +416,14 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove_from_neiborhood() {
|
fn test_remove_from_neiborhood() {
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
let (peer_pk, _peer_id) = derive_dummy_keypair("someone");
|
let (peer_pk, _peer_id) = derive_dummy_keypair("someone");
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
penv.get_neighborhood_mut()
|
penv.get_neighborhood_mut()
|
||||||
.alter(PeerId::from("zero"), AlterState::Added);
|
.alter(PeerId::from("zero"), AlterState::Added);
|
||||||
penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
|
penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
|
||||||
@ -411,8 +443,12 @@ mod tests {
|
|||||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
||||||
let other_id = PeerId::from(other_id);
|
let other_id = PeerId::from(other_id);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
|
|
||||||
let nei = penv.get_neighborhood_mut();
|
let nei = penv.get_neighborhood_mut();
|
||||||
nei.alter(other_id.clone(), AlterState::Added);
|
nei.alter(other_id.clone(), AlterState::Added);
|
||||||
@ -430,9 +466,13 @@ mod tests {
|
|||||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
||||||
let other_id = PeerId::from(other_id);
|
let other_id = PeerId::from(other_id);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
|
|
||||||
let nei = penv.get_neighborhood_mut();
|
let nei = penv.get_neighborhood_mut();
|
||||||
nei.alter(other_id.clone(), AlterState::Added);
|
nei.alter(other_id.clone(), AlterState::Added);
|
||||||
@ -455,8 +495,12 @@ mod tests {
|
|||||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
||||||
let other_id = PeerId::from(other_id);
|
let other_id = PeerId::from(other_id);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
|
|
||||||
let nei = penv.get_neighborhood_mut();
|
let nei = penv.get_neighborhood_mut();
|
||||||
nei.alter(other_id.clone(), AlterState::Added);
|
nei.alter(other_id.clone(), AlterState::Added);
|
||||||
@ -479,9 +523,13 @@ mod tests {
|
|||||||
let peer_id = PeerId::from(peer_id);
|
let peer_id = PeerId::from(peer_id);
|
||||||
let other_id = PeerId::from(other_id);
|
let other_id = PeerId::from(other_id);
|
||||||
let remote_id = PeerId::from(remote_id);
|
let remote_id = PeerId::from(remote_id);
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
let mut penv = PeerEnv::new(
|
||||||
|
Peer::new(peer_pk, Rc::from(vec![]), <_>::default()),
|
||||||
|
&network,
|
||||||
|
);
|
||||||
penv.get_neighborhood_mut()
|
penv.get_neighborhood_mut()
|
||||||
.alter(other_id.clone(), AlterState::Added);
|
.alter(other_id.clone(), AlterState::Added);
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use air_test_utils::{
|
use air_test_utils::{
|
||||||
test_runner::{AirRunner, DefaultAirRunner, TestRunParameters},
|
test_runner::{AirRunner, DefaultAirRunner, TestInitParameters, TestRunParameters},
|
||||||
RawAVMOutcome,
|
RawAVMOutcome,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -57,11 +57,13 @@ impl AirScriptExecutor<DefaultAirRunner> {
|
|||||||
impl<R: AirRunner> AirScriptExecutor<R> {
|
impl<R: AirRunner> AirScriptExecutor<R> {
|
||||||
pub fn from_transformed_air_script(
|
pub fn from_transformed_air_script(
|
||||||
mut test_parameters: TestRunParameters,
|
mut test_parameters: TestRunParameters,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
transformed_air_script: TransformedAirScript<R>,
|
transformed_air_script: TransformedAirScript<R>,
|
||||||
) -> Result<Self, String> {
|
) -> Result<Self, String> {
|
||||||
let network = transformed_air_script.get_network();
|
let network = transformed_air_script.get_network();
|
||||||
let init_peer_id = test_parameters.init_peer_id.clone();
|
let init_peer_id = test_parameters.init_peer_id.clone();
|
||||||
let real_init_peer_id = network.ensure_named_peer(init_peer_id.as_str());
|
let real_init_peer_id =
|
||||||
|
network.ensure_named_peer(init_peer_id.as_str(), test_init_parameters);
|
||||||
test_parameters.init_peer_id = real_init_peer_id.to_string();
|
test_parameters.init_peer_id = real_init_peer_id.to_string();
|
||||||
|
|
||||||
let queue = ExecutionQueue::new();
|
let queue = ExecutionQueue::new();
|
||||||
@ -85,20 +87,40 @@ impl<R: AirRunner> AirScriptExecutor<R> {
|
|||||||
extra_peers: impl IntoIterator<Item = PeerId>,
|
extra_peers: impl IntoIterator<Item = PeerId>,
|
||||||
annotated_air_script: &str,
|
annotated_air_script: &str,
|
||||||
) -> Result<Self, String> {
|
) -> Result<Self, String> {
|
||||||
let network = Network::new(extra_peers.into_iter(), common_services);
|
let network = Network::new(extra_peers.into_iter(), common_services, <_>::default());
|
||||||
let transformed = TransformedAirScript::new(annotated_air_script, network)?;
|
let transformed = TransformedAirScript::new(annotated_air_script, network, <_>::default())?;
|
||||||
|
|
||||||
Self::from_transformed_air_script(test_parameters, transformed)
|
Self::from_transformed_air_script(test_parameters, <_>::default(), transformed)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_network(
|
pub fn from_network(
|
||||||
test_parameters: TestRunParameters,
|
test_parameters: TestRunParameters,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
network: Rc<Network<R>>,
|
network: Rc<Network<R>>,
|
||||||
annotated_air_script: &str,
|
annotated_air_script: &str,
|
||||||
) -> Result<Self, String> {
|
) -> Result<Self, String> {
|
||||||
let transformed = TransformedAirScript::new(annotated_air_script, network)?;
|
let transformed =
|
||||||
|
TransformedAirScript::new(annotated_air_script, network, test_init_parameters.clone())?;
|
||||||
|
|
||||||
Self::from_transformed_air_script(test_parameters, transformed)
|
Self::from_transformed_air_script(test_parameters, test_init_parameters, transformed)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_with_init_parameters(
|
||||||
|
test_parameters: TestRunParameters,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
|
common_services: Vec<MarineServiceHandle>,
|
||||||
|
extra_peers: impl IntoIterator<Item = PeerId>,
|
||||||
|
annotated_air_script: &str,
|
||||||
|
) -> Result<Self, String> {
|
||||||
|
let network = Network::new(
|
||||||
|
extra_peers.into_iter(),
|
||||||
|
common_services,
|
||||||
|
test_init_parameters.clone(),
|
||||||
|
);
|
||||||
|
let transformed =
|
||||||
|
TransformedAirScript::new(annotated_air_script, network, test_init_parameters.clone())?;
|
||||||
|
|
||||||
|
Self::from_transformed_air_script(test_parameters, test_init_parameters, transformed)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return Iterator for handling all the queued datas
|
/// Return Iterator for handling all the queued datas
|
||||||
@ -640,15 +662,18 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_transformed_distinct() {
|
fn test_transformed_distinct() {
|
||||||
let peer_name = "peer1";
|
let peer_name = "peer1";
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
|
||||||
let transformed1 = TransformedAirScript::new(
|
let transformed1 = TransformedAirScript::new(
|
||||||
&format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 42"#),
|
&format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 42"#),
|
||||||
network.clone(),
|
network.clone(),
|
||||||
|
<_>::default(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let exectution1 = AirScriptExecutor::from_transformed_air_script(
|
let exectution1 = AirScriptExecutor::from_transformed_air_script(
|
||||||
TestRunParameters::from_init_peer_id(peer_name),
|
TestRunParameters::from_init_peer_id(peer_name),
|
||||||
|
<_>::default(),
|
||||||
transformed1,
|
transformed1,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -656,10 +681,12 @@ mod tests {
|
|||||||
let transformed2 = TransformedAirScript::new(
|
let transformed2 = TransformedAirScript::new(
|
||||||
&format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 24"#,),
|
&format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 24"#,),
|
||||||
network,
|
network,
|
||||||
|
<_>::default(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let exectution2 = AirScriptExecutor::from_transformed_air_script(
|
let exectution2 = AirScriptExecutor::from_transformed_air_script(
|
||||||
TestRunParameters::from_init_peer_id(peer_name),
|
TestRunParameters::from_init_peer_id(peer_name),
|
||||||
|
<_>::default(),
|
||||||
transformed2,
|
transformed2,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -705,20 +732,24 @@ mod tests {
|
|||||||
let network = Network::<NativeAirRunner>::new(
|
let network = Network::<NativeAirRunner>::new(
|
||||||
std::iter::empty::<PeerId>(),
|
std::iter::empty::<PeerId>(),
|
||||||
vec![service.to_handle()],
|
vec![service.to_handle()],
|
||||||
|
<_>::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let peer_name = "peer1";
|
let peer_name = "peer1";
|
||||||
let air_script = format!(r#"(call "{peer_name}" ("service" "function") [])"#);
|
let air_script = format!(r#"(call "{peer_name}" ("service" "function") [])"#);
|
||||||
let transformed1 = TransformedAirScript::new(&air_script, network.clone()).unwrap();
|
let transformed1 =
|
||||||
|
TransformedAirScript::new(&air_script, network.clone(), <_>::default()).unwrap();
|
||||||
let exectution1 = AirScriptExecutor::from_transformed_air_script(
|
let exectution1 = AirScriptExecutor::from_transformed_air_script(
|
||||||
TestRunParameters::from_init_peer_id(peer_name),
|
TestRunParameters::from_init_peer_id(peer_name),
|
||||||
|
<_>::default(),
|
||||||
transformed1,
|
transformed1,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let transformed2 = TransformedAirScript::new(&air_script, network).unwrap();
|
let transformed2 = TransformedAirScript::new(&air_script, network, <_>::default()).unwrap();
|
||||||
let exectution2 = AirScriptExecutor::from_transformed_air_script(
|
let exectution2 = AirScriptExecutor::from_transformed_air_script(
|
||||||
TestRunParameters::from_init_peer_id(peer_name),
|
TestRunParameters::from_init_peer_id(peer_name),
|
||||||
|
<_>::default(),
|
||||||
transformed2,
|
transformed2,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -18,7 +18,9 @@ use super::{Call, Canon, Sexp};
|
|||||||
use crate::ephemeral::Network;
|
use crate::ephemeral::Network;
|
||||||
|
|
||||||
use air_test_utils::key_utils::at;
|
use air_test_utils::key_utils::at;
|
||||||
use air_test_utils::test_runner::{AirRunner, DefaultAirRunner};
|
use air_test_utils::test_runner::AirRunner;
|
||||||
|
use air_test_utils::test_runner::DefaultAirRunner;
|
||||||
|
use air_test_utils::test_runner::TestInitParameters;
|
||||||
|
|
||||||
use std::{borrow::Cow, fmt::Write, ops::Deref, rc::Rc, str::FromStr};
|
use std::{borrow::Cow, fmt::Write, ops::Deref, rc::Rc, str::FromStr};
|
||||||
|
|
||||||
@ -33,22 +35,27 @@ pub struct TransformedAirScript<R = DefaultAirRunner> {
|
|||||||
|
|
||||||
impl<R: AirRunner> TransformedAirScript<R> {
|
impl<R: AirRunner> TransformedAirScript<R> {
|
||||||
// TODO peer transformation mode
|
// TODO peer transformation mode
|
||||||
pub fn new(annotated_air_script: &str, network: Rc<Network<R>>) -> Result<Self, String> {
|
pub fn new(
|
||||||
|
annotated_air_script: &str,
|
||||||
|
network: Rc<Network<R>>,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
|
) -> Result<Self, String> {
|
||||||
let at_transformed_air_script = at_transform(annotated_air_script);
|
let at_transformed_air_script = at_transform(annotated_air_script);
|
||||||
|
|
||||||
// validate the AIR script with the standard parser first
|
// validate the AIR script with the standard parser first
|
||||||
air_parser::parse(&at_transformed_air_script)?;
|
air_parser::parse(&at_transformed_air_script)?;
|
||||||
|
|
||||||
Self::new_unvalidated(&at_transformed_air_script, network)
|
Self::new_unvalidated(&at_transformed_air_script, network, test_init_parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn new_unvalidated(
|
pub(crate) fn new_unvalidated(
|
||||||
at_transformed_air_script: &str,
|
at_transformed_air_script: &str,
|
||||||
network: Rc<Network<R>>,
|
network: Rc<Network<R>>,
|
||||||
|
test_init_parameters: TestInitParameters,
|
||||||
) -> Result<Self, String> {
|
) -> Result<Self, String> {
|
||||||
let transformer = Transformer { network: &network };
|
let transformer = Transformer { network: &network };
|
||||||
let mut sexp = Sexp::from_str(at_transformed_air_script)?;
|
let mut sexp = Sexp::from_str(at_transformed_air_script)?;
|
||||||
transformer.transform(&mut sexp);
|
transformer.transform(&mut sexp, test_init_parameters);
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
network,
|
network,
|
||||||
@ -74,25 +81,25 @@ struct Transformer<'net, R> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<R: AirRunner> Transformer<'_, R> {
|
impl<R: AirRunner> Transformer<'_, R> {
|
||||||
pub(crate) fn transform(&self, sexp: &mut Sexp) {
|
pub(crate) fn transform(&self, sexp: &mut Sexp, test_init_parameters: TestInitParameters) {
|
||||||
match sexp {
|
match sexp {
|
||||||
Sexp::Call(call) => self.handle_call(call),
|
Sexp::Call(call) => self.handle_call(call, test_init_parameters.clone()),
|
||||||
Sexp::Canon(canon) => self.handle_canon(canon),
|
Sexp::Canon(canon) => self.handle_canon(canon, test_init_parameters.clone()),
|
||||||
Sexp::List(children) => {
|
Sexp::List(children) => {
|
||||||
for child in children.iter_mut().skip(1) {
|
for child in children.iter_mut().skip(1) {
|
||||||
self.transform(child);
|
self.transform(child, test_init_parameters.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Sexp::Symbol(_) | Sexp::String(_) => {}
|
Sexp::Symbol(_) | Sexp::String(_) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_call(&self, call: &mut Call) {
|
fn handle_call(&self, call: &mut Call, test_init_parameters: TestInitParameters) {
|
||||||
// collect peers...
|
// collect peers...
|
||||||
if let Sexp::String(ref mut peer_name) = &mut call.triplet.0 {
|
if let Sexp::String(ref mut peer_name) = &mut call.triplet.0 {
|
||||||
*peer_name = self
|
*peer_name = self
|
||||||
.network
|
.network
|
||||||
.ensure_named_peer(peer_name.as_str())
|
.ensure_named_peer(peer_name.as_str(), test_init_parameters)
|
||||||
.to_string();
|
.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,11 +118,11 @@ impl<R: AirRunner> Transformer<'_, R> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_canon(&self, canon: &mut Canon) {
|
fn handle_canon(&self, canon: &mut Canon, test_init_parameters: TestInitParameters) {
|
||||||
if let Sexp::String(ref mut peer_name) = &mut canon.peer {
|
if let Sexp::String(ref mut peer_name) = &mut canon.peer {
|
||||||
*peer_name = self
|
*peer_name = self
|
||||||
.network
|
.network
|
||||||
.ensure_named_peer(peer_name.as_str())
|
.ensure_named_peer(peer_name.as_str(), test_init_parameters)
|
||||||
.to_string();
|
.to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,33 +163,39 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_translate_null() {
|
fn test_translate_null() {
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
let transformed = TransformedAirScript::new("(null)", network).unwrap();
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
let transformed = TransformedAirScript::new("(null)", network, <_>::default()).unwrap();
|
||||||
assert_eq!(&*transformed, "(null)");
|
assert_eq!(&*transformed, "(null)");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_translate_call_no_result() {
|
fn test_translate_call_no_result() {
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
let script = r#"(call peer_id ("service_id" func) [])"#;
|
let script = r#"(call peer_id ("service_id" func) [])"#;
|
||||||
let transformed = TransformedAirScript::new_unvalidated(script, network).unwrap();
|
let transformed =
|
||||||
|
TransformedAirScript::new_unvalidated(script, network, <_>::default()).unwrap();
|
||||||
assert_eq!(&*transformed, script);
|
assert_eq!(&*transformed, script);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic]
|
#[should_panic]
|
||||||
fn test_translate_call_no_string() {
|
fn test_translate_call_no_string() {
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
let script = r#"(call "peer_id" (service_id func) [])"#;
|
let script = r#"(call "peer_id" (service_id func) [])"#;
|
||||||
let transformed = TransformedAirScript::new(script, network);
|
let transformed = TransformedAirScript::new(script, network, <_>::default());
|
||||||
assert_eq!(transformed.as_deref(), Ok(script));
|
assert_eq!(transformed.as_deref(), Ok(script));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_translate_call_result() {
|
fn test_translate_call_result() {
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
let script = r#"(call "peer_id" ("service_id" func) []) ; ok = 42"#;
|
let script = r#"(call "peer_id" ("service_id" func) []) ; ok = 42"#;
|
||||||
let transformer = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
|
let transformer =
|
||||||
|
TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default()).unwrap();
|
||||||
|
|
||||||
let peer_id = at("peer_id");
|
let peer_id = at("peer_id");
|
||||||
|
|
||||||
@ -215,8 +228,10 @@ mod tests {
|
|||||||
(call peer_id ("service_id" func) [1]) ; ok=true
|
(call peer_id ("service_id" func) [1]) ; ok=true
|
||||||
))"#;
|
))"#;
|
||||||
|
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
let transformed = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
let transformed =
|
||||||
|
TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default()).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&*transformed,
|
&*transformed,
|
||||||
concat!(
|
concat!(
|
||||||
@ -255,8 +270,10 @@ mod tests {
|
|||||||
(canon "peer_id4" $stream #canon)
|
(canon "peer_id4" $stream #canon)
|
||||||
))"#;
|
))"#;
|
||||||
|
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
let t = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
let t =
|
||||||
|
TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default()).unwrap();
|
||||||
|
|
||||||
let peer_id1 = at("peer_id1");
|
let peer_id1 = at("peer_id1");
|
||||||
let peer_id2 = at("peer_id2");
|
let peer_id2 = at("peer_id2");
|
||||||
@ -292,8 +309,9 @@ mod tests {
|
|||||||
fn test_at_transform() {
|
fn test_at_transform() {
|
||||||
let script = r#"(call "peer_id1" ("service_id" "func") [1 @"peer_id3"] x) ; ok={"test":@"peer_id2"}"#;
|
let script = r#"(call "peer_id1" ("service_id" "func") [1 @"peer_id3"] x) ; ok={"test":@"peer_id2"}"#;
|
||||||
|
|
||||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
let network =
|
||||||
let t = TransformedAirScript::new(script, network.clone()).unwrap();
|
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||||
|
let t = TransformedAirScript::new(script, network.clone(), <_>::default()).unwrap();
|
||||||
|
|
||||||
let peer_id1 = at("peer_id1");
|
let peer_id1 = at("peer_id1");
|
||||||
let peer_id2 = at("peer_id2");
|
let peer_id2 = at("peer_id2");
|
||||||
@ -309,6 +327,7 @@ mod tests {
|
|||||||
let peer_name1 = "peer_id1";
|
let peer_name1 = "peer_id1";
|
||||||
let exec = AirScriptExecutor::from_transformed_air_script(
|
let exec = AirScriptExecutor::from_transformed_air_script(
|
||||||
TestRunParameters::from_init_peer_id(peer_name1),
|
TestRunParameters::from_init_peer_id(peer_name1),
|
||||||
|
<_>::default(),
|
||||||
t,
|
t,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -24,6 +24,7 @@ pub(crate) fn call_requests(size: usize) -> Data {
|
|||||||
init_peer_keypair.clone(),
|
init_peer_keypair.clone(),
|
||||||
// actually, is not used
|
// actually, is not used
|
||||||
set_variable_call_service(data.clone()),
|
set_variable_call_service(data.clone()),
|
||||||
|
<_>::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let init_call_results: CallResults = <_>::default();
|
let init_call_results: CallResults = <_>::default();
|
||||||
@ -75,6 +76,7 @@ pub(crate) fn call_results(size: usize) -> Data {
|
|||||||
init_peer_keypair.clone(),
|
init_peer_keypair.clone(),
|
||||||
// actually, is not used
|
// actually, is not used
|
||||||
set_variable_call_service(data.clone()),
|
set_variable_call_service(data.clone()),
|
||||||
|
<_>::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let call_results: CallResults = <_>::default();
|
let call_results: CallResults = <_>::default();
|
||||||
|
@ -165,10 +165,12 @@ pub(crate) fn dashboard() -> super::Data {
|
|||||||
let (host_function, all_info) =
|
let (host_function, all_info) =
|
||||||
client_host_function(known_peer_ids.clone(), client_id.clone(), relay_id.clone());
|
client_host_function(known_peer_ids.clone(), client_id.clone(), relay_id.clone());
|
||||||
|
|
||||||
let mut client = create_avm_with_key::<NativeAirRunner>(client_key, host_function);
|
let mut client =
|
||||||
|
create_avm_with_key::<NativeAirRunner>(client_key, host_function, <_>::default());
|
||||||
let mut relay = create_avm_with_key::<NativeAirRunner>(
|
let mut relay = create_avm_with_key::<NativeAirRunner>(
|
||||||
relay_key.clone(),
|
relay_key.clone(),
|
||||||
create_peer_host_function(relay_id.clone(), known_peer_ids.clone()),
|
create_peer_host_function(relay_id.clone(), known_peer_ids.clone()),
|
||||||
|
<_>::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut known_peers = known_peer_keys
|
let mut known_peers = known_peer_keys
|
||||||
@ -178,6 +180,7 @@ pub(crate) fn dashboard() -> super::Data {
|
|||||||
let vm = create_avm_with_key::<NativeAirRunner>(
|
let vm = create_avm_with_key::<NativeAirRunner>(
|
||||||
peer_key,
|
peer_key,
|
||||||
create_peer_host_function(peer_id.clone(), known_peer_ids.clone()),
|
create_peer_host_function(peer_id.clone(), known_peer_ids.clone()),
|
||||||
|
<_>::default(),
|
||||||
);
|
);
|
||||||
AVMState {
|
AVMState {
|
||||||
vm,
|
vm,
|
||||||
|
@ -778,8 +778,9 @@ fn mem_consumption_with_size_in_mb(data_size: usize) -> Data {
|
|||||||
data = format_args!("\"{}\"", hex::encode(random_data))
|
data = format_args!("\"{}\"", hex::encode(random_data))
|
||||||
);
|
);
|
||||||
|
|
||||||
let exec = AirScriptExecutor::<NativeAirRunner>::new(
|
let exec = AirScriptExecutor::<NativeAirRunner>::new_with_init_parameters(
|
||||||
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
||||||
|
TestInitParameters::no_limits(),
|
||||||
vec![],
|
vec![],
|
||||||
vec![],
|
vec![],
|
||||||
&air_script,
|
&air_script,
|
||||||
@ -823,8 +824,9 @@ fn mem_consumption_w_lense_with_size_in_mb(data_size: usize) -> Data {
|
|||||||
data = format_args!("{{\"attrib\": \"{}\"}}", hex::encode(random_data))
|
data = format_args!("{{\"attrib\": \"{}\"}}", hex::encode(random_data))
|
||||||
);
|
);
|
||||||
|
|
||||||
let exec = AirScriptExecutor::<NativeAirRunner>::new(
|
let exec = AirScriptExecutor::<NativeAirRunner>::new_with_init_parameters(
|
||||||
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
||||||
|
TestInitParameters::no_limits(),
|
||||||
vec![],
|
vec![],
|
||||||
vec![],
|
vec![],
|
||||||
&air_script,
|
&air_script,
|
||||||
@ -868,8 +870,9 @@ fn mem_consumption_w_map_2_scalar_with_size_in_mb(data_size: usize) -> Data {
|
|||||||
data = format_args!("\"{}\"", hex::encode(random_data))
|
data = format_args!("\"{}\"", hex::encode(random_data))
|
||||||
);
|
);
|
||||||
|
|
||||||
let exec = AirScriptExecutor::<NativeAirRunner>::new(
|
let exec = AirScriptExecutor::<NativeAirRunner>::new_with_init_parameters(
|
||||||
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
||||||
|
TestInitParameters::no_limits(),
|
||||||
vec![],
|
vec![],
|
||||||
vec![],
|
vec![],
|
||||||
&air_script,
|
&air_script,
|
||||||
@ -913,8 +916,9 @@ fn mem_consumption_w_canon_map_with_size_in_mb(data_size: usize) -> Data {
|
|||||||
data = format_args!("\"{}\"", hex::encode(random_data))
|
data = format_args!("\"{}\"", hex::encode(random_data))
|
||||||
);
|
);
|
||||||
|
|
||||||
let exec = AirScriptExecutor::<NativeAirRunner>::new(
|
let exec = AirScriptExecutor::<NativeAirRunner>::new_with_init_parameters(
|
||||||
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
||||||
|
TestInitParameters::no_limits(),
|
||||||
vec![],
|
vec![],
|
||||||
vec![],
|
vec![],
|
||||||
&air_script,
|
&air_script,
|
||||||
@ -958,8 +962,9 @@ fn mem_consumption_hybrid_with_size_in_mb(data_size: usize) -> Data {
|
|||||||
data = format_args!("{{\"attrib\": \"{}\"}}", hex::encode(random_data))
|
data = format_args!("{{\"attrib\": \"{}\"}}", hex::encode(random_data))
|
||||||
);
|
);
|
||||||
|
|
||||||
let exec = AirScriptExecutor::<NativeAirRunner>::new(
|
let exec = AirScriptExecutor::<NativeAirRunner>::new_with_init_parameters(
|
||||||
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
TestRunParameters::from_init_peer_id("init_peer_id").with_particle_id(PARTICLE_ID),
|
||||||
|
TestInitParameters::no_limits(),
|
||||||
vec![],
|
vec![],
|
||||||
vec![],
|
vec![],
|
||||||
&air_script,
|
&air_script,
|
||||||
|
@ -41,23 +41,31 @@ pub(crate) fn network_explore() -> Data {
|
|||||||
|
|
||||||
let client_call_service =
|
let client_call_service =
|
||||||
set_variables_call_service(set_variables_state, VariableOptionSource::Argument(0));
|
set_variables_call_service(set_variables_state, VariableOptionSource::Argument(0));
|
||||||
let mut client = create_avm_with_key::<NativeAirRunner>(client_key, client_call_service);
|
let mut client =
|
||||||
|
create_avm_with_key::<NativeAirRunner>(client_key, client_call_service, <_>::default());
|
||||||
|
|
||||||
let relay_call_service =
|
let relay_call_service =
|
||||||
set_variable_call_service(json!([&client_1_id, &client_2_id, &client_3_id, &relay_id]));
|
set_variable_call_service(json!([&client_1_id, &client_2_id, &client_3_id, &relay_id]));
|
||||||
let mut relay = create_avm_with_key::<NativeAirRunner>(relay_key.clone(), relay_call_service);
|
let mut relay = create_avm_with_key::<NativeAirRunner>(
|
||||||
|
relay_key.clone(),
|
||||||
|
relay_call_service,
|
||||||
|
<_>::default(),
|
||||||
|
);
|
||||||
|
|
||||||
let client_1_call_service =
|
let client_1_call_service =
|
||||||
set_variable_call_service(json!([&client_1_id, &client_3_id, &relay_id, &client_2_id]));
|
set_variable_call_service(json!([&client_1_id, &client_3_id, &relay_id, &client_2_id]));
|
||||||
let mut client_1 = create_avm_with_key::<NativeAirRunner>(client_1_key, client_1_call_service);
|
let mut client_1 =
|
||||||
|
create_avm_with_key::<NativeAirRunner>(client_1_key, client_1_call_service, <_>::default());
|
||||||
|
|
||||||
let client_2_call_service =
|
let client_2_call_service =
|
||||||
set_variable_call_service(json!([&relay_id, &client_3_id, &client_1_id, &client_2_id]));
|
set_variable_call_service(json!([&relay_id, &client_3_id, &client_1_id, &client_2_id]));
|
||||||
let mut client_2 = create_avm_with_key::<NativeAirRunner>(client_2_key, client_2_call_service);
|
let mut client_2 =
|
||||||
|
create_avm_with_key::<NativeAirRunner>(client_2_key, client_2_call_service, <_>::default());
|
||||||
|
|
||||||
let client_3_call_service =
|
let client_3_call_service =
|
||||||
set_variable_call_service(json!([&relay_id, &client_3_id, &client_1_id, &client_2_id]));
|
set_variable_call_service(json!([&relay_id, &client_3_id, &client_1_id, &client_2_id]));
|
||||||
let mut client_3 = create_avm_with_key::<NativeAirRunner>(client_3_key, client_3_call_service);
|
let mut client_3 =
|
||||||
|
create_avm_with_key::<NativeAirRunner>(client_3_key, client_3_call_service, <_>::default());
|
||||||
|
|
||||||
let raw_script = include_str!("network_explore.air");
|
let raw_script = include_str!("network_explore.air");
|
||||||
|
|
||||||
@ -66,9 +74,11 @@ pub(crate) fn network_explore() -> Data {
|
|||||||
let network = air_test_framework::Network::<NativeAirRunner>::new(
|
let network = air_test_framework::Network::<NativeAirRunner>::new(
|
||||||
std::iter::empty::<air_test_framework::ephemeral::PeerId>(),
|
std::iter::empty::<air_test_framework::ephemeral::PeerId>(),
|
||||||
vec![],
|
vec![],
|
||||||
|
<_>::default(),
|
||||||
);
|
);
|
||||||
let transformed_script =
|
let transformed_script =
|
||||||
air_test_framework::TransformedAirScript::new(raw_script, network).unwrap();
|
air_test_framework::TransformedAirScript::new(raw_script, network, <_>::default())
|
||||||
|
.unwrap();
|
||||||
&(*transformed_script).to_string()
|
&(*transformed_script).to_string()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
use super::runner::AirRunner;
|
use super::runner::AirRunner;
|
||||||
use super::runner::DataToHumanReadable;
|
use super::runner::DataToHumanReadable;
|
||||||
|
|
||||||
use air_interpreter_interface::CallResultsRepr;
|
use air_interpreter_interface::CallResultsRepr;
|
||||||
use air_interpreter_interface::RunParameters;
|
use air_interpreter_interface::RunParameters;
|
||||||
use avm_interface::raw_outcome::RawAVMOutcome;
|
use avm_interface::raw_outcome::RawAVMOutcome;
|
||||||
@ -42,6 +43,9 @@ impl AirRunner for NativeAvmRunner {
|
|||||||
keypair: &KeyPair,
|
keypair: &KeyPair,
|
||||||
particle_id: String,
|
particle_id: String,
|
||||||
) -> eyre::Result<RawAVMOutcome> {
|
) -> eyre::Result<RawAVMOutcome> {
|
||||||
|
use air_interpreter_interface::MAX_AIR_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_CALL_RESULT_SIZE;
|
||||||
|
use air_interpreter_interface::MAX_PARTICLE_SIZE;
|
||||||
use air_interpreter_sede::ToSerialized;
|
use air_interpreter_sede::ToSerialized;
|
||||||
use avm_interface::into_raw_result;
|
use avm_interface::into_raw_result;
|
||||||
|
|
||||||
@ -61,6 +65,9 @@ impl AirRunner for NativeAvmRunner {
|
|||||||
current_peer_id,
|
current_peer_id,
|
||||||
timestamp,
|
timestamp,
|
||||||
ttl,
|
ttl,
|
||||||
|
air_size_limit: MAX_AIR_SIZE,
|
||||||
|
particle_size_limit: MAX_PARTICLE_SIZE,
|
||||||
|
call_result_size_limit: MAX_CALL_RESULT_SIZE,
|
||||||
key_format,
|
key_format,
|
||||||
secret_key_bytes,
|
secret_key_bytes,
|
||||||
particle_id,
|
particle_id,
|
||||||
|
@ -75,6 +75,9 @@ pub(crate) fn create_wasm_avm_runner(
|
|||||||
Ok(Box::new(WasmAvmRunner(AVMRunner::new(
|
Ok(Box::new(WasmAvmRunner(AVMRunner::new(
|
||||||
air_interpreter_wasm_path.to_owned(),
|
air_interpreter_wasm_path.to_owned(),
|
||||||
max_heap_size,
|
max_heap_size,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
0,
|
0,
|
||||||
)?)))
|
)?)))
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user