mirror of
https://github.com/fluencelabs/aquavm
synced 2025-07-30 21:42:04 +00:00
WIP
This commit is contained in:
@@ -25,7 +25,8 @@ use crate::{
|
||||
use air_test_utils::{
|
||||
key_utils::derive_dummy_keypair,
|
||||
test_runner::{
|
||||
create_avm_with_key, AirRunner, DefaultAirRunner, TestRunParameters, TestRunner,
|
||||
create_avm_with_key, AirRunner, DefaultAirRunner, TestInitParameters, TestRunParameters,
|
||||
TestRunner,
|
||||
},
|
||||
RawAVMOutcome,
|
||||
};
|
||||
@@ -86,10 +87,14 @@ pub struct 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 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();
|
||||
|
||||
Self { peer_id, runner }
|
||||
@@ -143,7 +148,8 @@ pub struct Network<R = DefaultAirRunner> {
|
||||
// extencive test code changes
|
||||
impl Network<DefaultAirRunner> {
|
||||
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(
|
||||
named_peers: impl Iterator<Item = impl Into<PeerId>>,
|
||||
common_services: Vec<MarineServiceHandle>,
|
||||
test_init_params: TestInitParameters,
|
||||
) -> Rc<Self> {
|
||||
let network = Rc::new(Self {
|
||||
peers: Default::default(),
|
||||
@@ -158,13 +165,13 @@ impl<R: AirRunner> Network<R> {
|
||||
resolver: Default::default(),
|
||||
});
|
||||
for peer_name in named_peers {
|
||||
network.ensure_named_peer(peer_name);
|
||||
network.ensure_named_peer(peer_name, test_init_params.clone());
|
||||
}
|
||||
network
|
||||
}
|
||||
|
||||
pub fn from_peers(nodes: Vec<Peer<R>>) -> Rc<Self> {
|
||||
let network = Self::new(std::iter::empty::<PeerId>(), vec![]);
|
||||
pub fn from_peers(nodes: Vec<Peer<R>>, test_init_params: TestInitParameters) -> Rc<Self> {
|
||||
let network = Self::new(std::iter::empty::<PeerId>(), vec![], test_init_params);
|
||||
let neighborhood: PeerSet = nodes.iter().map(|peer| peer.peer_id.clone()).collect();
|
||||
for peer in nodes {
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
let name = name.into();
|
||||
@@ -192,7 +203,7 @@ impl<R: AirRunner> Network<R> {
|
||||
Entry::Occupied(entry) => entry.get().clone(),
|
||||
Entry::Vacant(empty) => {
|
||||
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();
|
||||
self.add_peer(peer);
|
||||
|
||||
|
@@ -243,9 +243,13 @@ mod tests {
|
||||
let (_other_pk1, other_id) = derive_dummy_keypair(other_name);
|
||||
let peer_id = PeerId::from(peer_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(&other_id));
|
||||
}
|
||||
@@ -258,9 +262,13 @@ mod tests {
|
||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name);
|
||||
let peer_id = PeerId::from(peer_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();
|
||||
|
||||
@@ -286,15 +294,19 @@ mod tests {
|
||||
let (_other_pk2, other_id2) = derive_dummy_keypair(other_name2);
|
||||
let other_id1 = PeerId::from(other_id1);
|
||||
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
|
||||
assert!(penv.iter().next().is_none());
|
||||
|
||||
network.ensure_named_peer(other_name1);
|
||||
network.ensure_named_peer(other_name1);
|
||||
network.ensure_named_peer(other_name2);
|
||||
network.ensure_named_peer(other_name1, <_>::default());
|
||||
network.ensure_named_peer(other_name1, <_>::default());
|
||||
network.ensure_named_peer(other_name2, <_>::default());
|
||||
let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
|
||||
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_id1 = PeerId::from(other_id1);
|
||||
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
|
||||
assert!(penv.iter().next().is_none());
|
||||
|
||||
network.ensure_named_peer(other_name1);
|
||||
network.ensure_named_peer(other_name2);
|
||||
network.ensure_named_peer(other_name1, <_>::default());
|
||||
network.ensure_named_peer(other_name2, <_>::default());
|
||||
let expected_neighborhood = PeerSet::from([other_id1, other_id2]);
|
||||
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_id1 = PeerId::from(other_id1);
|
||||
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
|
||||
assert!(penv.iter().next().is_none());
|
||||
@@ -353,9 +373,13 @@ mod tests {
|
||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||
let (_other_pk1, other_id1) = derive_dummy_keypair(other_name1);
|
||||
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
|
||||
assert!(penv.iter().next().is_none());
|
||||
@@ -373,9 +397,13 @@ mod tests {
|
||||
let peer_name = "peer";
|
||||
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()
|
||||
.alter(PeerId::from("zero"), AlterState::Added);
|
||||
penv.extend_neighborhood(IntoIterator::into_iter(["one", "two"]));
|
||||
@@ -388,10 +416,14 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 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()
|
||||
.alter(PeerId::from("zero"), AlterState::Added);
|
||||
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 (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
||||
let other_id = PeerId::from(other_id);
|
||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
||||
let 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();
|
||||
nei.alter(other_id.clone(), AlterState::Added);
|
||||
@@ -430,9 +466,13 @@ mod tests {
|
||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
||||
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();
|
||||
nei.alter(other_id.clone(), AlterState::Added);
|
||||
@@ -455,8 +495,12 @@ mod tests {
|
||||
let (peer_pk, _peer_id) = derive_dummy_keypair(peer_name);
|
||||
let (_other_pk, other_id) = derive_dummy_keypair(other_name1);
|
||||
let other_id = PeerId::from(other_id);
|
||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
||||
let mut penv = PeerEnv::new(Peer::new(peer_pk, Rc::from(vec![])), &network);
|
||||
let 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();
|
||||
nei.alter(other_id.clone(), AlterState::Added);
|
||||
@@ -479,9 +523,13 @@ mod tests {
|
||||
let peer_id = PeerId::from(peer_id);
|
||||
let other_id = PeerId::from(other_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()
|
||||
.alter(other_id.clone(), AlterState::Added);
|
||||
|
||||
|
@@ -22,7 +22,7 @@ use crate::{
|
||||
};
|
||||
|
||||
use air_test_utils::{
|
||||
test_runner::{AirRunner, DefaultAirRunner, TestRunParameters},
|
||||
test_runner::{AirRunner, DefaultAirRunner, TestInitParameters, TestRunParameters},
|
||||
RawAVMOutcome,
|
||||
};
|
||||
|
||||
@@ -57,11 +57,13 @@ impl AirScriptExecutor<DefaultAirRunner> {
|
||||
impl<R: AirRunner> AirScriptExecutor<R> {
|
||||
pub fn from_transformed_air_script(
|
||||
mut test_parameters: TestRunParameters,
|
||||
test_init_parameters: TestInitParameters,
|
||||
transformed_air_script: TransformedAirScript<R>,
|
||||
) -> Result<Self, String> {
|
||||
let network = transformed_air_script.get_network();
|
||||
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();
|
||||
|
||||
let queue = ExecutionQueue::new();
|
||||
@@ -85,20 +87,40 @@ impl<R: AirRunner> AirScriptExecutor<R> {
|
||||
extra_peers: impl IntoIterator<Item = PeerId>,
|
||||
annotated_air_script: &str,
|
||||
) -> Result<Self, String> {
|
||||
let network = Network::new(extra_peers.into_iter(), common_services);
|
||||
let transformed = TransformedAirScript::new(annotated_air_script, network)?;
|
||||
let network = Network::new(extra_peers.into_iter(), common_services, <_>::default());
|
||||
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(
|
||||
test_parameters: TestRunParameters,
|
||||
test_init_parameters: TestInitParameters,
|
||||
network: Rc<Network<R>>,
|
||||
annotated_air_script: &str,
|
||||
) -> 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
|
||||
@@ -640,15 +662,18 @@ mod tests {
|
||||
#[test]
|
||||
fn test_transformed_distinct() {
|
||||
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(
|
||||
&format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 42"#),
|
||||
network.clone(),
|
||||
<_>::default(),
|
||||
)
|
||||
.unwrap();
|
||||
let exectution1 = AirScriptExecutor::from_transformed_air_script(
|
||||
TestRunParameters::from_init_peer_id(peer_name),
|
||||
<_>::default(),
|
||||
transformed1,
|
||||
)
|
||||
.unwrap();
|
||||
@@ -656,10 +681,12 @@ mod tests {
|
||||
let transformed2 = TransformedAirScript::new(
|
||||
&format!(r#"(call "{peer_name}" ("service" "function") []) ; ok = 24"#,),
|
||||
network,
|
||||
<_>::default(),
|
||||
)
|
||||
.unwrap();
|
||||
let exectution2 = AirScriptExecutor::from_transformed_air_script(
|
||||
TestRunParameters::from_init_peer_id(peer_name),
|
||||
<_>::default(),
|
||||
transformed2,
|
||||
)
|
||||
.unwrap();
|
||||
@@ -705,20 +732,24 @@ mod tests {
|
||||
let network = Network::<NativeAirRunner>::new(
|
||||
std::iter::empty::<PeerId>(),
|
||||
vec![service.to_handle()],
|
||||
<_>::default(),
|
||||
);
|
||||
|
||||
let peer_name = "peer1";
|
||||
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(
|
||||
TestRunParameters::from_init_peer_id(peer_name),
|
||||
<_>::default(),
|
||||
transformed1,
|
||||
)
|
||||
.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(
|
||||
TestRunParameters::from_init_peer_id(peer_name),
|
||||
<_>::default(),
|
||||
transformed2,
|
||||
)
|
||||
.unwrap();
|
||||
|
@@ -18,7 +18,9 @@ use super::{Call, Canon, Sexp};
|
||||
use crate::ephemeral::Network;
|
||||
|
||||
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};
|
||||
|
||||
@@ -33,22 +35,27 @@ pub struct TransformedAirScript<R = DefaultAirRunner> {
|
||||
|
||||
impl<R: AirRunner> TransformedAirScript<R> {
|
||||
// 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);
|
||||
|
||||
// validate the AIR script with the standard parser first
|
||||
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(
|
||||
at_transformed_air_script: &str,
|
||||
network: Rc<Network<R>>,
|
||||
test_init_parameters: TestInitParameters,
|
||||
) -> Result<Self, String> {
|
||||
let transformer = Transformer { network: &network };
|
||||
let mut sexp = Sexp::from_str(at_transformed_air_script)?;
|
||||
transformer.transform(&mut sexp);
|
||||
transformer.transform(&mut sexp, test_init_parameters);
|
||||
|
||||
Ok(Self {
|
||||
network,
|
||||
@@ -74,25 +81,25 @@ struct Transformer<'net, 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 {
|
||||
Sexp::Call(call) => self.handle_call(call),
|
||||
Sexp::Canon(canon) => self.handle_canon(canon),
|
||||
Sexp::Call(call) => self.handle_call(call, test_init_parameters.clone()),
|
||||
Sexp::Canon(canon) => self.handle_canon(canon, test_init_parameters.clone()),
|
||||
Sexp::List(children) => {
|
||||
for child in children.iter_mut().skip(1) {
|
||||
self.transform(child);
|
||||
self.transform(child, test_init_parameters.clone());
|
||||
}
|
||||
}
|
||||
Sexp::Symbol(_) | Sexp::String(_) => {}
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_call(&self, call: &mut Call) {
|
||||
fn handle_call(&self, call: &mut Call, test_init_parameters: TestInitParameters) {
|
||||
// collect peers...
|
||||
if let Sexp::String(ref mut peer_name) = &mut call.triplet.0 {
|
||||
*peer_name = self
|
||||
.network
|
||||
.ensure_named_peer(peer_name.as_str())
|
||||
.ensure_named_peer(peer_name.as_str(), test_init_parameters)
|
||||
.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 {
|
||||
*peer_name = self
|
||||
.network
|
||||
.ensure_named_peer(peer_name.as_str())
|
||||
.ensure_named_peer(peer_name.as_str(), test_init_parameters)
|
||||
.to_string();
|
||||
}
|
||||
}
|
||||
@@ -156,33 +163,39 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_translate_null() {
|
||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
||||
let transformed = TransformedAirScript::new("(null)", network).unwrap();
|
||||
let network =
|
||||
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||
let transformed = TransformedAirScript::new("(null)", network, <_>::default()).unwrap();
|
||||
assert_eq!(&*transformed, "(null)");
|
||||
}
|
||||
|
||||
#[test]
|
||||
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 transformed = TransformedAirScript::new_unvalidated(script, network).unwrap();
|
||||
let transformed =
|
||||
TransformedAirScript::new_unvalidated(script, network, <_>::default()).unwrap();
|
||||
assert_eq!(&*transformed, script);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
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 transformed = TransformedAirScript::new(script, network);
|
||||
let transformed = TransformedAirScript::new(script, network, <_>::default());
|
||||
assert_eq!(transformed.as_deref(), Ok(script));
|
||||
}
|
||||
|
||||
#[test]
|
||||
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 transformer = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
|
||||
let transformer =
|
||||
TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default()).unwrap();
|
||||
|
||||
let peer_id = at("peer_id");
|
||||
|
||||
@@ -215,8 +228,10 @@ mod tests {
|
||||
(call peer_id ("service_id" func) [1]) ; ok=true
|
||||
))"#;
|
||||
|
||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
||||
let transformed = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
|
||||
let network =
|
||||
Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![], <_>::default());
|
||||
let transformed =
|
||||
TransformedAirScript::new_unvalidated(script, network.clone(), <_>::default()).unwrap();
|
||||
assert_eq!(
|
||||
&*transformed,
|
||||
concat!(
|
||||
@@ -255,8 +270,10 @@ mod tests {
|
||||
(canon "peer_id4" $stream #canon)
|
||||
))"#;
|
||||
|
||||
let network = Network::<NativeAirRunner>::new(std::iter::empty::<PeerId>(), vec![]);
|
||||
let t = TransformedAirScript::new_unvalidated(script, network.clone()).unwrap();
|
||||
let network =
|
||||
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_id2 = at("peer_id2");
|
||||
@@ -292,8 +309,9 @@ mod tests {
|
||||
fn test_at_transform() {
|
||||
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 t = TransformedAirScript::new(script, network.clone()).unwrap();
|
||||
let network =
|
||||
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_id2 = at("peer_id2");
|
||||
@@ -309,6 +327,7 @@ mod tests {
|
||||
let peer_name1 = "peer_id1";
|
||||
let exec = AirScriptExecutor::from_transformed_air_script(
|
||||
TestRunParameters::from_init_peer_id(peer_name1),
|
||||
<_>::default(),
|
||||
t,
|
||||
)
|
||||
.unwrap();
|
||||
|
Reference in New Issue
Block a user