2021-08-24 16:14:15 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2021 Fluence Labs Limited
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2021-12-21 11:37:35 +03:00
|
|
|
use air::UncatchableError;
|
2021-10-04 10:58:00 +03:00
|
|
|
use air_test_utils::prelude::*;
|
2021-12-21 11:37:35 +03:00
|
|
|
use air_trace_handler::TraceHandlerError;
|
|
|
|
use air_trace_handler::{CallResultError, MergeError};
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn par_early_exit() {
|
|
|
|
let init_peer_id = "init_peer_id";
|
|
|
|
let setter_1_id = "setter_1";
|
|
|
|
let setter_2_id = "setter_2";
|
|
|
|
let setter_3_id = "setter_3";
|
|
|
|
|
|
|
|
let mut init = create_avm(unit_call_service(), init_peer_id);
|
2021-10-04 10:58:00 +03:00
|
|
|
let mut setter_1 = create_avm(set_variable_call_service(json!("1")), setter_1_id);
|
|
|
|
let mut setter_2 = create_avm(set_variable_call_service(json!("2")), setter_2_id);
|
2021-08-24 16:14:15 +03:00
|
|
|
let mut setter_3 = create_avm(fallible_call_service("error"), setter_3_id);
|
|
|
|
|
|
|
|
let script = format!(
|
|
|
|
include_str!("scripts/par_early_exit.clj"),
|
|
|
|
init_peer_id, setter_1_id, setter_2_id, setter_3_id
|
|
|
|
);
|
|
|
|
|
2022-04-20 23:05:37 +03:00
|
|
|
let init_result_1 = checked_call_vm!(init, <_>::default(), &script, "", "");
|
|
|
|
let setter_1_res = checked_call_vm!(setter_1, <_>::default(), &script, "", init_result_1.data.clone());
|
|
|
|
let setter_2_res = checked_call_vm!(setter_2, <_>::default(), &script, "", init_result_1.data.clone());
|
|
|
|
let setter_3_res_1 = checked_call_vm!(setter_3, <_>::default(), &script, "", init_result_1.data.clone());
|
2021-09-20 14:49:20 +03:00
|
|
|
let actual_trace_1 = trace_from_result(&setter_3_res_1);
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
let expected_trace = vec![
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string("result from unit_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(12, 1),
|
|
|
|
executed_state::par(9, 1),
|
|
|
|
executed_state::par(7, 1),
|
|
|
|
executed_state::par(5, 1),
|
|
|
|
executed_state::par(3, 1),
|
|
|
|
executed_state::par(1, 1),
|
|
|
|
executed_state::request_sent_by(init_peer_id),
|
|
|
|
executed_state::request_sent_by(init_peer_id),
|
|
|
|
executed_state::request_sent_by(init_peer_id),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::request_sent_by(setter_3_id),
|
|
|
|
];
|
2021-09-20 14:49:20 +03:00
|
|
|
assert_eq!(actual_trace_1, expected_trace);
|
|
|
|
|
|
|
|
let setter_3_res_2 = checked_call_vm!(
|
|
|
|
setter_3,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-09-20 14:49:20 +03:00
|
|
|
&script,
|
|
|
|
setter_3_res_1.data.clone(),
|
|
|
|
setter_1_res.data.clone()
|
|
|
|
);
|
|
|
|
let setter_3_res_3 = checked_call_vm!(
|
|
|
|
setter_3,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-09-20 14:49:20 +03:00
|
|
|
&script,
|
|
|
|
setter_3_res_2.data.clone(),
|
|
|
|
setter_2_res.data.clone()
|
|
|
|
);
|
|
|
|
let init_result_2 = checked_call_vm!(
|
|
|
|
init,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-09-20 14:49:20 +03:00
|
|
|
&script,
|
|
|
|
init_result_1.data.clone(),
|
|
|
|
setter_3_res_3.data.clone()
|
|
|
|
);
|
|
|
|
let actual_trace_2 = trace_from_result(&setter_3_res_3);
|
|
|
|
let actual_trace_3 = trace_from_result(&init_result_2);
|
2021-08-24 16:14:15 +03:00
|
|
|
|
2021-09-20 14:49:20 +03:00
|
|
|
let expected_trace = vec![
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string("result from unit_call_service"),
|
2021-09-20 14:49:20 +03:00
|
|
|
executed_state::par(12, 1),
|
|
|
|
executed_state::par(9, 1),
|
|
|
|
executed_state::par(7, 1),
|
|
|
|
executed_state::par(5, 1),
|
|
|
|
executed_state::par(3, 1),
|
|
|
|
executed_state::par(1, 1),
|
|
|
|
executed_state::stream_string("1", 1),
|
|
|
|
executed_state::stream_string("2", 2),
|
|
|
|
executed_state::stream_string("1", 1),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
2021-09-20 14:49:20 +03:00
|
|
|
executed_state::request_sent_by("setter_3"),
|
|
|
|
];
|
|
|
|
assert_eq!(actual_trace_2, expected_trace);
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
let expected_trace = vec![
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string("result from unit_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(12, 1),
|
|
|
|
executed_state::par(9, 1),
|
|
|
|
executed_state::par(7, 1),
|
|
|
|
executed_state::par(5, 1),
|
|
|
|
executed_state::par(3, 1),
|
|
|
|
executed_state::par(1, 1),
|
|
|
|
executed_state::stream_string("1", 0),
|
2021-09-20 14:49:20 +03:00
|
|
|
executed_state::stream_string("2", 0),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::stream_string("1", 0),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
|
|
|
executed_state::scalar_string("result from unit_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
];
|
2021-09-20 14:49:20 +03:00
|
|
|
assert_eq!(actual_trace_3, expected_trace);
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
let setter_3_malicious_trace = vec![
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string("result from unit_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(10, 0),
|
|
|
|
executed_state::par(9, 0),
|
|
|
|
executed_state::par(7, 1),
|
|
|
|
executed_state::par(5, 1),
|
|
|
|
executed_state::par(3, 1),
|
|
|
|
executed_state::par(1, 1),
|
|
|
|
executed_state::request_sent_by(init_peer_id),
|
|
|
|
executed_state::request_sent_by(init_peer_id),
|
|
|
|
executed_state::stream_string("non_exist_value", 0),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::stream_string("success result from fallible_call_service", 0),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::request_sent_by(setter_3_id),
|
|
|
|
];
|
|
|
|
let setter_3_malicious_data = raw_data_from_trace(setter_3_malicious_trace);
|
2022-04-20 23:05:37 +03:00
|
|
|
let init_result_3 = call_vm!(
|
|
|
|
init,
|
|
|
|
<_>::default(),
|
|
|
|
&script,
|
|
|
|
init_result_2.data.clone(),
|
|
|
|
setter_3_malicious_data
|
|
|
|
);
|
2021-12-21 11:37:35 +03:00
|
|
|
|
2021-12-26 22:52:00 +03:00
|
|
|
let expected_error = UncatchableError::TraceError {
|
|
|
|
trace_error: TraceHandlerError::MergeError(MergeError::IncorrectCallResult(CallResultError::ValuesNotEqual {
|
2021-12-21 11:37:35 +03:00
|
|
|
prev_value: Value::Stream {
|
|
|
|
value: rc!(json!("1")),
|
|
|
|
generation: 0,
|
|
|
|
},
|
|
|
|
current_value: Value::Stream {
|
|
|
|
value: rc!(json!("non_exist_value")),
|
|
|
|
generation: 0,
|
|
|
|
},
|
2021-12-26 22:52:00 +03:00
|
|
|
})),
|
|
|
|
instruction: r#"call "setter_1" ("" "") [] $stream"#.to_string(),
|
|
|
|
};
|
2021-12-21 11:37:35 +03:00
|
|
|
assert!(check_error(&init_result_3, expected_error));
|
2021-08-24 16:14:15 +03:00
|
|
|
|
2021-09-20 14:49:20 +03:00
|
|
|
let actual_trace = trace_from_result(&init_result_3);
|
|
|
|
let expected_trace = trace_from_result(&init_result_2);
|
2021-08-24 16:14:15 +03:00
|
|
|
assert_eq!(actual_trace, expected_trace);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2021-10-04 10:58:00 +03:00
|
|
|
fn fold_early_exit() {
|
2021-08-24 16:14:15 +03:00
|
|
|
let variables_setter_id = "set_variable_id";
|
|
|
|
let stream_setter_id = "stream_setter_id";
|
|
|
|
let fold_executor_id = "fold_executor_id";
|
|
|
|
let error_trigger_id = "error_trigger_id";
|
|
|
|
let last_error_receiver_id = "last_error_receiver_id";
|
|
|
|
let last_peer_checker_id = "last_peer_checker_id";
|
|
|
|
|
|
|
|
let variables = maplit::hashmap!(
|
2021-10-04 10:58:00 +03:00
|
|
|
"stream_1".to_string() => json!(["a1", "a2"]),
|
|
|
|
"stream_2".to_string() => json!(["b1", "b2"]),
|
|
|
|
"stream_3".to_string() => json!(["c1", "c2"]),
|
|
|
|
"stream_4".to_string() => json!(["d1", "d2"]),
|
2021-08-24 16:14:15 +03:00
|
|
|
);
|
|
|
|
|
2021-11-29 18:35:11 +03:00
|
|
|
let mut variables_setter = create_avm(
|
|
|
|
set_variables_call_service(variables, VariableOptionSource::Argument(0)),
|
|
|
|
variables_setter_id,
|
|
|
|
);
|
2021-10-04 10:58:00 +03:00
|
|
|
let mut stream_setter = create_avm(echo_call_service(), stream_setter_id);
|
2021-08-24 16:14:15 +03:00
|
|
|
let mut fold_executor = create_avm(unit_call_service(), fold_executor_id);
|
|
|
|
let mut error_trigger = create_avm(fallible_call_service("error"), error_trigger_id);
|
2021-12-02 14:44:10 +03:00
|
|
|
let mut last_error_receiver = create_avm(echo_call_service(), last_error_receiver_id);
|
|
|
|
let mut last_peer_checker = create_avm(echo_call_service(), last_peer_checker_id);
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
let script = format!(
|
|
|
|
include_str!("scripts/fold_early_exit.clj"),
|
|
|
|
variables_setter_id,
|
|
|
|
stream_setter_id,
|
|
|
|
fold_executor_id,
|
|
|
|
error_trigger_id,
|
|
|
|
last_error_receiver_id,
|
|
|
|
last_peer_checker_id
|
|
|
|
);
|
|
|
|
|
2022-04-20 23:05:37 +03:00
|
|
|
let variables_setter_result = checked_call_vm!(variables_setter, <_>::default(), &script, "", "");
|
|
|
|
let stream_setter_result =
|
|
|
|
checked_call_vm!(stream_setter, <_>::default(), &script, "", variables_setter_result.data);
|
|
|
|
let fold_executor_result = checked_call_vm!(fold_executor, <_>::default(), &script, "", stream_setter_result.data);
|
|
|
|
let error_trigger_result = checked_call_vm!(error_trigger, <_>::default(), &script, "", fold_executor_result.data);
|
|
|
|
let last_error_receiver_result = checked_call_vm!(
|
|
|
|
last_error_receiver,
|
|
|
|
<_>::default(),
|
|
|
|
&script,
|
|
|
|
"",
|
|
|
|
error_trigger_result.data
|
|
|
|
);
|
|
|
|
let last_peer_checker_result = checked_call_vm!(
|
|
|
|
last_peer_checker,
|
|
|
|
<_>::default(),
|
|
|
|
&script,
|
|
|
|
"",
|
|
|
|
last_error_receiver_result.data
|
|
|
|
);
|
2021-08-24 16:14:15 +03:00
|
|
|
let actual_trace = trace_from_result(&last_peer_checker_result);
|
|
|
|
|
2021-11-24 18:47:49 +03:00
|
|
|
let unit_call_service_result = "result from unit_call_service";
|
2021-08-24 16:14:15 +03:00
|
|
|
let expected_trace = vec![
|
|
|
|
executed_state::scalar_string_array(vec!["a1", "a2"]),
|
|
|
|
executed_state::scalar_string_array(vec!["b1", "b2"]),
|
|
|
|
executed_state::scalar_string_array(vec!["c1", "c2"]),
|
|
|
|
executed_state::scalar_string_array(vec!["d1", "d2"]),
|
|
|
|
executed_state::stream_string("a1", 0),
|
|
|
|
executed_state::stream_string("a2", 0),
|
|
|
|
executed_state::stream_string("b1", 0),
|
|
|
|
executed_state::stream_string("b2", 0),
|
|
|
|
executed_state::stream_string("c1", 0),
|
|
|
|
executed_state::stream_string("c2", 0),
|
|
|
|
executed_state::stream_string("d1", 0),
|
|
|
|
executed_state::stream_string("d2", 0),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(17, 1),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::fold(vec![executed_state::subtrace_lore(
|
|
|
|
4,
|
2022-09-28 22:03:54 +03:00
|
|
|
subtrace_desc(14, 15),
|
|
|
|
subtrace_desc(29, 0),
|
2021-08-24 16:14:15 +03:00
|
|
|
)]),
|
|
|
|
executed_state::fold(vec![executed_state::subtrace_lore(
|
|
|
|
6,
|
2022-09-28 22:03:54 +03:00
|
|
|
subtrace_desc(15, 14),
|
|
|
|
subtrace_desc(29, 0),
|
2021-08-24 16:14:15 +03:00
|
|
|
)]),
|
|
|
|
executed_state::fold(vec![
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::subtrace_lore(8, subtrace_desc(16, 6), subtrace_desc(28, 0)),
|
|
|
|
executed_state::subtrace_lore(9, subtrace_desc(22, 6), subtrace_desc(28, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(5, 6),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::fold(vec![
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::subtrace_lore(10, subtrace_desc(18, 2), subtrace_desc(22, 0)),
|
|
|
|
executed_state::subtrace_lore(11, subtrace_desc(20, 2), subtrace_desc(22, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(1, 2),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(1, 0),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(5, 0),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::fold(vec![
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::subtrace_lore(10, subtrace_desc(24, 2), subtrace_desc(28, 0)),
|
|
|
|
executed_state::subtrace_lore(11, subtrace_desc(26, 2), subtrace_desc(28, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(1, 2),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
2022-09-28 22:03:54 +03:00
|
|
|
executed_state::par(1, 0),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
2021-12-28 16:59:55 +03:00
|
|
|
executed_state::scalar(json!({
|
|
|
|
"error_code": 10000i64,
|
|
|
|
"instruction" : r#"call "error_trigger_id" ("error" "") [] "#,
|
|
|
|
"message": r#"Local service error, ret_code is 1, error message is '"failed result from fallible_call_service"'"#,
|
|
|
|
"peer_id": "error_trigger_id"})),
|
2021-12-02 14:44:10 +03:00
|
|
|
executed_state::scalar_string("last_peer"),
|
2021-08-24 16:14:15 +03:00
|
|
|
];
|
|
|
|
|
|
|
|
assert_eq!(actual_trace, expected_trace);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn fold_par_early_exit() {
|
|
|
|
let variables_setter_id = "set_variable_id";
|
|
|
|
let stream_setter_id = "stream_setter_id";
|
|
|
|
let fold_executor_id = "fold_executor_id";
|
|
|
|
let error_trigger_id = "error_trigger_id";
|
|
|
|
let last_error_receiver_id = "last_error_receiver_id";
|
|
|
|
let last_peer_checker_id = "last_peer_checker_id";
|
|
|
|
|
|
|
|
let variables = maplit::hashmap!(
|
2021-10-04 10:58:00 +03:00
|
|
|
"stream_1".to_string() => json!(["a1", "a2"]),
|
|
|
|
"stream_2".to_string() => json!(["b1", "b2"]),
|
|
|
|
"stream_3".to_string() => json!(["c1", "c2"]),
|
|
|
|
"stream_4".to_string() => json!(["d1", "d2"]),
|
2021-08-24 16:14:15 +03:00
|
|
|
);
|
|
|
|
|
2021-11-29 18:35:11 +03:00
|
|
|
let mut variables_setter = create_avm(
|
|
|
|
set_variables_call_service(variables, VariableOptionSource::Argument(0)),
|
|
|
|
variables_setter_id,
|
|
|
|
);
|
2021-10-04 10:58:00 +03:00
|
|
|
let mut stream_setter = create_avm(echo_call_service(), stream_setter_id);
|
2021-08-24 16:14:15 +03:00
|
|
|
let mut fold_executor = create_avm(unit_call_service(), fold_executor_id);
|
|
|
|
let mut error_trigger = create_avm(fallible_call_service("error"), error_trigger_id);
|
|
|
|
let mut last_error_receiver = create_avm(unit_call_service(), last_error_receiver_id);
|
|
|
|
let mut last_peer_checker = create_avm(unit_call_service(), last_peer_checker_id);
|
|
|
|
|
|
|
|
let script = format!(
|
|
|
|
include_str!("scripts/fold_par_early_exit.clj"),
|
|
|
|
variables_setter_id,
|
|
|
|
stream_setter_id,
|
|
|
|
fold_executor_id,
|
|
|
|
error_trigger_id,
|
|
|
|
last_error_receiver_id,
|
|
|
|
last_peer_checker_id
|
|
|
|
);
|
|
|
|
|
2022-04-20 23:05:37 +03:00
|
|
|
let variables_setter_result = checked_call_vm!(variables_setter, <_>::default(), &script, "", "");
|
|
|
|
let stream_setter_result =
|
|
|
|
checked_call_vm!(stream_setter, <_>::default(), &script, "", variables_setter_result.data);
|
|
|
|
let fold_executor_result = checked_call_vm!(fold_executor, <_>::default(), &script, "", stream_setter_result.data);
|
|
|
|
let error_trigger_result = checked_call_vm!(error_trigger, <_>::default(), &script, "", fold_executor_result.data);
|
|
|
|
let last_error_receiver_result = checked_call_vm!(
|
|
|
|
last_error_receiver,
|
|
|
|
<_>::default(),
|
|
|
|
&script,
|
|
|
|
"",
|
|
|
|
error_trigger_result.data
|
|
|
|
);
|
|
|
|
let last_peer_checker_result = checked_call_vm!(
|
|
|
|
last_peer_checker,
|
|
|
|
<_>::default(),
|
|
|
|
&script,
|
|
|
|
"",
|
|
|
|
last_error_receiver_result.data
|
|
|
|
);
|
2021-08-24 16:14:15 +03:00
|
|
|
let actual_trace = trace_from_result(&last_peer_checker_result);
|
|
|
|
|
2021-11-24 18:47:49 +03:00
|
|
|
let unit_call_service_result = "result from unit_call_service";
|
2021-08-24 16:14:15 +03:00
|
|
|
let expected_trace = vec![
|
|
|
|
executed_state::scalar_string_array(vec!["a1", "a2"]),
|
|
|
|
executed_state::scalar_string_array(vec!["b1", "b2"]),
|
|
|
|
executed_state::scalar_string_array(vec!["c1", "c2"]),
|
|
|
|
executed_state::scalar_string_array(vec!["d1", "d2"]),
|
|
|
|
executed_state::stream_string("a1", 0),
|
|
|
|
executed_state::stream_string("a2", 0),
|
|
|
|
executed_state::stream_string("b1", 0),
|
|
|
|
executed_state::stream_string("b2", 0),
|
|
|
|
executed_state::stream_string("c1", 0),
|
|
|
|
executed_state::stream_string("c2", 0),
|
|
|
|
executed_state::stream_string("d1", 0),
|
|
|
|
executed_state::stream_string("d2", 0),
|
|
|
|
executed_state::par(69, 1),
|
|
|
|
executed_state::fold(vec![
|
2022-06-10 08:29:56 +03:00
|
|
|
executed_state::subtrace_lore(4, subtrace_desc(14, 34), subtrace_desc(82, 0)),
|
|
|
|
executed_state::subtrace_lore(5, subtrace_desc(48, 34), subtrace_desc(82, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
|
|
|
executed_state::par(33, 34),
|
|
|
|
executed_state::fold(vec![
|
2022-06-10 08:29:56 +03:00
|
|
|
executed_state::subtrace_lore(6, subtrace_desc(16, 16), subtrace_desc(48, 0)),
|
|
|
|
executed_state::subtrace_lore(7, subtrace_desc(32, 16), subtrace_desc(48, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
|
|
|
executed_state::par(15, 16),
|
|
|
|
executed_state::par(13, 1),
|
|
|
|
executed_state::fold(vec![
|
2022-06-10 08:29:56 +03:00
|
|
|
executed_state::subtrace_lore(8, subtrace_desc(19, 6), subtrace_desc(31, 0)),
|
|
|
|
executed_state::subtrace_lore(9, subtrace_desc(25, 6), subtrace_desc(31, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
|
|
|
executed_state::par(5, 6),
|
|
|
|
executed_state::fold(vec![
|
2022-06-10 08:29:56 +03:00
|
|
|
executed_state::subtrace_lore(10, subtrace_desc(21, 2), subtrace_desc(25, 0)),
|
|
|
|
executed_state::subtrace_lore(11, subtrace_desc(23, 2), subtrace_desc(25, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
|
|
|
executed_state::par(1, 2),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(1, 0),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(5, 0),
|
|
|
|
executed_state::fold(vec![
|
2022-06-10 08:29:56 +03:00
|
|
|
executed_state::subtrace_lore(10, subtrace_desc(27, 2), subtrace_desc(31, 0)),
|
|
|
|
executed_state::subtrace_lore(11, subtrace_desc(29, 2), subtrace_desc(31, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
|
|
|
executed_state::par(1, 2),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(1, 0),
|
2021-11-24 18:47:49 +03:00
|
|
|
executed_state::scalar_string(unit_call_service_result),
|
|
|
|
executed_state::service_failed(1, "failed result from fallible_call_service"),
|
2021-08-24 16:14:15 +03:00
|
|
|
executed_state::par(15, 0),
|
|
|
|
executed_state::par(13, 1),
|
|
|
|
executed_state::fold(vec![
|
2022-06-10 08:29:56 +03:00
|
|
|
executed_state::subtrace_lore(8, subtrace_desc(35, 6), subtrace_desc(47, 0)),
|
|
|
|
executed_state::subtrace_lore(9, subtrace_desc(41, 6), subtrace_desc(47, 0)),
|
2021-08-24 16:14:15 +03:00
|
|
|
]),
|
|
|
|
];
|
|
|
|
let trace_len = expected_trace.len();
|
|
|
|
|
2022-06-10 08:29:56 +03:00
|
|
|
assert_eq!((*actual_trace)[0..trace_len], expected_trace);
|
2021-08-24 16:14:15 +03:00
|
|
|
}
|