mirror of
https://github.com/fluencelabs/aquavm
synced 2025-03-15 20:40:50 +00:00
Fix a bug on json path on empty stream (#133)
This commit is contained in:
parent
35d53756ec
commit
1502cd6f45
6
.cargo/config.toml
Normal file
6
.cargo/config.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[http]
|
||||||
|
timeout = 30 # timeout for each HTTP request, in seconds
|
||||||
|
multiplexing = false # HTTP/2 multiplexing
|
||||||
|
|
||||||
|
[net]
|
||||||
|
retry = 50 # network retries
|
@ -26,7 +26,7 @@ use super::ExecutionError;
|
|||||||
use super::ExecutionResult;
|
use super::ExecutionResult;
|
||||||
use super::LastErrorDescriptor;
|
use super::LastErrorDescriptor;
|
||||||
use super::TraceHandler;
|
use super::TraceHandler;
|
||||||
use crate::execution_step::joinable::Joinable;
|
use crate::execution_step::Joinable;
|
||||||
use crate::execution_step::RSecurityTetraplet;
|
use crate::execution_step::RSecurityTetraplet;
|
||||||
use crate::joinable_call;
|
use crate::joinable_call;
|
||||||
use crate::log_instruction;
|
use crate::log_instruction;
|
||||||
|
@ -19,7 +19,7 @@ use super::ExecutionCtx;
|
|||||||
use super::ExecutionError;
|
use super::ExecutionError;
|
||||||
use super::ExecutionResult;
|
use super::ExecutionResult;
|
||||||
use super::TraceHandler;
|
use super::TraceHandler;
|
||||||
use crate::execution_step::joinable::Joinable;
|
use crate::execution_step::Joinable;
|
||||||
use crate::joinable;
|
use crate::joinable;
|
||||||
use crate::log_instruction;
|
use crate::log_instruction;
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ use super::ExecutionCtx;
|
|||||||
use super::ExecutionError;
|
use super::ExecutionError;
|
||||||
use super::ExecutionResult;
|
use super::ExecutionResult;
|
||||||
use super::TraceHandler;
|
use super::TraceHandler;
|
||||||
use crate::execution_step::joinable::Joinable;
|
use crate::execution_step::Joinable;
|
||||||
use crate::joinable;
|
use crate::joinable;
|
||||||
use crate::log_instruction;
|
use crate::log_instruction;
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
mod cell_vec_resolved_call_result;
|
mod cell_vec_resolved_call_result;
|
||||||
mod empty;
|
mod empty_stream;
|
||||||
mod iterable_item;
|
mod iterable_item;
|
||||||
mod resolved_call_result;
|
mod resolved_call_result;
|
||||||
mod stream;
|
mod stream;
|
||||||
|
@ -14,20 +14,24 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use super::ExecutionError;
|
||||||
use super::ExecutionResult;
|
use super::ExecutionResult;
|
||||||
use super::JValuable;
|
use super::JValuable;
|
||||||
|
use crate::exec_err;
|
||||||
use crate::execution_step::SecurityTetraplets;
|
use crate::execution_step::SecurityTetraplets;
|
||||||
use crate::JValue;
|
use crate::JValue;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
impl JValuable for () {
|
impl JValuable for () {
|
||||||
fn apply_json_path(&self, _json_path: &str) -> ExecutionResult<Vec<&JValue>> {
|
fn apply_json_path(&self, json_path: &str) -> ExecutionResult<Vec<&JValue>> {
|
||||||
Ok(vec![])
|
// applying json path to an empty stream will produce a join behaviour
|
||||||
|
exec_err!(ExecutionError::EmptyStreamJsonPathError(json_path.to_string()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn apply_json_path_with_tetraplets(&self, _json_path: &str) -> ExecutionResult<(Vec<&JValue>, SecurityTetraplets)> {
|
fn apply_json_path_with_tetraplets(&self, json_path: &str) -> ExecutionResult<(Vec<&JValue>, SecurityTetraplets)> {
|
||||||
Ok((vec![], vec![]))
|
// applying json path to an empty stream will produce a join behaviour
|
||||||
|
exec_err!(ExecutionError::EmptyStreamJsonPathError(json_path.to_string()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn as_jvalue(&self) -> Cow<'_, JValue> {
|
fn as_jvalue(&self) -> Cow<'_, JValue> {
|
@ -15,12 +15,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
mod catchable;
|
mod catchable;
|
||||||
|
mod joinable;
|
||||||
|
|
||||||
pub(crate) use catchable::Catchable;
|
pub(crate) use catchable::Catchable;
|
||||||
|
pub(crate) use joinable::Joinable;
|
||||||
|
|
||||||
use super::trace_handler::MergerApResult;
|
use super::trace_handler::MergerApResult;
|
||||||
use super::trace_handler::TraceHandlerError;
|
use super::trace_handler::TraceHandlerError;
|
||||||
use super::Joinable;
|
|
||||||
use super::ResolvedCallResult;
|
use super::ResolvedCallResult;
|
||||||
use super::Stream;
|
use super::Stream;
|
||||||
use crate::build_targets::CallServiceResult;
|
use crate::build_targets::CallServiceResult;
|
||||||
@ -67,6 +68,10 @@ pub(crate) enum ExecutionError {
|
|||||||
#[error("variable with path '{1}' not found in '{0:?}' with error: '{2}'")]
|
#[error("variable with path '{1}' not found in '{0:?}' with error: '{2}'")]
|
||||||
StreamJsonPathError(Stream, String, JsonPathError),
|
StreamJsonPathError(Stream, String, JsonPathError),
|
||||||
|
|
||||||
|
/// An error occurred while trying to apply json path to an empty stream.
|
||||||
|
#[error("json path {0} is applied to an empty stream")]
|
||||||
|
EmptyStreamJsonPathError(String),
|
||||||
|
|
||||||
/// Provided JValue has incompatible with target type.
|
/// Provided JValue has incompatible with target type.
|
||||||
#[error("expected JValue type '{1}', but got '{0}' JValue")]
|
#[error("expected JValue type '{1}', but got '{0}' JValue")]
|
||||||
IncompatibleJValueType(JValue, &'static str),
|
IncompatibleJValueType(JValue, &'static str),
|
||||||
@ -155,7 +160,8 @@ impl ExecutionError {
|
|||||||
StreamJsonPathError(..) => 18,
|
StreamJsonPathError(..) => 18,
|
||||||
StreamDontHaveSuchGeneration(..) => 19,
|
StreamDontHaveSuchGeneration(..) => 19,
|
||||||
ApResultNotCorrespondToInstr(_) => 20,
|
ApResultNotCorrespondToInstr(_) => 20,
|
||||||
TraceError(_) => 21,
|
EmptyStreamJsonPathError(_) => 21,
|
||||||
|
TraceError(_) => 22,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,6 +188,10 @@ impl Joinable for ExecutionError {
|
|||||||
log_join!(" waiting for an argument with path '{}' on stream '{:?}'", json_path, stream);
|
log_join!(" waiting for an argument with path '{}' on stream '{:?}'", json_path, stream);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
EmptyStreamJsonPathError(json_path) => {
|
||||||
|
log_join!(" waiting on empty stream for path '{}'", json_path);
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ mod air;
|
|||||||
mod boxed_value;
|
mod boxed_value;
|
||||||
mod errors;
|
mod errors;
|
||||||
pub(crate) mod execution_context;
|
pub(crate) mod execution_context;
|
||||||
mod joinable;
|
|
||||||
mod trace_handler;
|
mod trace_handler;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
@ -30,8 +29,8 @@ pub(super) use boxed_value::Scalar;
|
|||||||
pub(super) use boxed_value::Stream;
|
pub(super) use boxed_value::Stream;
|
||||||
pub(crate) use errors::Catchable;
|
pub(crate) use errors::Catchable;
|
||||||
pub(super) use errors::ExecutionError;
|
pub(super) use errors::ExecutionError;
|
||||||
|
pub(crate) use errors::Joinable;
|
||||||
pub(crate) use execution_context::ExecutionCtx;
|
pub(crate) use execution_context::ExecutionCtx;
|
||||||
use joinable::Joinable;
|
|
||||||
pub(crate) use trace_handler::TraceHandler;
|
pub(crate) use trace_handler::TraceHandler;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
@ -14,12 +14,12 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use air_test_utils::call_vm;
|
|
||||||
use air_test_utils::checked_call_vm;
|
use air_test_utils::checked_call_vm;
|
||||||
use air_test_utils::create_avm;
|
use air_test_utils::create_avm;
|
||||||
use air_test_utils::set_variables_call_service;
|
use air_test_utils::set_variables_call_service;
|
||||||
use air_test_utils::trace_from_result;
|
use air_test_utils::trace_from_result;
|
||||||
use air_test_utils::unit_call_service;
|
use air_test_utils::unit_call_service;
|
||||||
|
use air_test_utils::{call_vm, echo_call_service};
|
||||||
|
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
@ -108,6 +108,35 @@ fn wait_on_stream_json_path_by_id() {
|
|||||||
assert_eq!(actual_trace.len(), 2); // par and the first call emit traces, second call doesn't
|
assert_eq!(actual_trace.len(), 2); // par and the first call emit traces, second call doesn't
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn wait_on_empty_stream_json_path() {
|
||||||
|
let local_peer_id = "local_peer_id";
|
||||||
|
let mut local_vm = create_avm(echo_call_service(), local_peer_id);
|
||||||
|
|
||||||
|
let join_stream_script = format!(
|
||||||
|
r#"
|
||||||
|
|
||||||
|
(seq
|
||||||
|
(seq
|
||||||
|
(call "{0}" ("" "") [[]] nodes)
|
||||||
|
(fold nodes n
|
||||||
|
(par
|
||||||
|
(call n ("" "") [n] $ns)
|
||||||
|
(next n)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(call "{0}" ("" "") [$ns.$.[0] $ns.$.[1] $ns])
|
||||||
|
)"#,
|
||||||
|
local_peer_id
|
||||||
|
);
|
||||||
|
|
||||||
|
let result = checked_call_vm!(local_vm, "", join_stream_script, "", "");
|
||||||
|
let actual_trace = trace_from_result(&result);
|
||||||
|
|
||||||
|
assert_eq!(actual_trace.len(), 1); // only the first call should produce a trace
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn dont_wait_on_json_path_on_scalars() {
|
fn dont_wait_on_json_path_on_scalars() {
|
||||||
let array = json!([1, 2, 3, 4, 5]);
|
let array = json!([1, 2, 3, 4, 5]);
|
||||||
|
@ -104,7 +104,7 @@ fn par_early_exit() {
|
|||||||
];
|
];
|
||||||
let setter_3_malicious_data = raw_data_from_trace(setter_3_malicious_trace);
|
let setter_3_malicious_data = raw_data_from_trace(setter_3_malicious_trace);
|
||||||
let init_result_5 = call_vm!(init, "", &script, init_result_3.data.clone(), setter_3_malicious_data);
|
let init_result_5 = call_vm!(init, "", &script, init_result_3.data.clone(), setter_3_malicious_data);
|
||||||
assert_eq!(init_result_5.ret_code, 1021);
|
assert_eq!(init_result_5.ret_code, 1022);
|
||||||
|
|
||||||
let actual_trace = trace_from_result(&init_result_5);
|
let actual_trace = trace_from_result(&init_result_5);
|
||||||
let expected_trace = trace_from_result(&init_result_3);
|
let expected_trace = trace_from_result(&init_result_3);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user