2020-10-30 20:29:05 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2020 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.
|
|
|
|
*/
|
|
|
|
|
2023-03-21 19:12:04 +07:00
|
|
|
use air::ExecutionCidState;
|
|
|
|
use air_interpreter_data::{ExecutionTrace, InterpreterData};
|
2021-10-04 10:58:00 +03:00
|
|
|
use air_test_utils::prelude::*;
|
2022-03-10 16:06:43 +03:00
|
|
|
|
2022-09-29 23:10:24 +03:00
|
|
|
use pretty_assertions::assert_eq;
|
|
|
|
|
2021-08-24 16:14:15 +03:00
|
|
|
use std::collections::HashMap;
|
2022-09-29 23:10:24 +03:00
|
|
|
use std::ops::Deref;
|
2020-10-30 20:29:05 +03:00
|
|
|
|
|
|
|
#[test]
|
2022-03-10 16:06:43 +03:00
|
|
|
fn merge_streams_in_two_fold() {
|
2021-05-16 22:52:22 +03:00
|
|
|
use executed_state::*;
|
|
|
|
|
2022-03-10 16:06:43 +03:00
|
|
|
let set_variable_peer_id = "set_variable_peer_id";
|
|
|
|
let vm_1_peer_id = "vm_1_peer_id";
|
|
|
|
let vm_2_peer_id = "vm_2_peer_id";
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2022-03-10 16:06:43 +03:00
|
|
|
let mut set_variable = create_avm(
|
|
|
|
set_variable_call_service(json!([vm_1_peer_id, vm_2_peer_id])),
|
|
|
|
set_variable_peer_id,
|
|
|
|
);
|
|
|
|
let mut vm1 = create_avm(return_string_call_service(vm_1_peer_id), vm_1_peer_id);
|
|
|
|
let mut vm2 = create_avm(return_string_call_service(vm_2_peer_id), vm_2_peer_id);
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2023-07-14 16:02:19 +03:00
|
|
|
let script = format!(
|
|
|
|
r#"
|
2020-12-28 00:12:11 +03:00
|
|
|
(seq
|
2022-03-10 16:06:43 +03:00
|
|
|
(call "{set_variable_peer_id}" ("neighborhood" "") [] neighborhood)
|
2020-12-28 00:12:11 +03:00
|
|
|
(seq
|
|
|
|
(seq
|
2020-11-03 17:43:58 +03:00
|
|
|
(fold neighborhood i
|
2020-12-28 00:12:11 +03:00
|
|
|
(par
|
2021-03-26 17:13:28 +03:00
|
|
|
(call i ("add_provider" "") [] $void)
|
2020-10-30 20:29:05 +03:00
|
|
|
(next i)
|
2020-11-03 17:43:58 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
(fold neighborhood i
|
2021-05-16 22:52:22 +03:00
|
|
|
(par
|
2021-03-26 17:13:28 +03:00
|
|
|
(call i ("get_providers" "") [] $providers)
|
2020-10-30 20:29:05 +03:00
|
|
|
(next i)
|
2020-11-03 17:43:58 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
2021-05-16 22:52:22 +03:00
|
|
|
(seq
|
2022-03-10 16:06:43 +03:00
|
|
|
(call "{vm_1_peer_id}" ("identity" "") [] $void)
|
|
|
|
(call "{vm_2_peer_id}" ("" "") [] none)
|
2020-11-03 17:43:58 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
2023-07-14 16:02:19 +03:00
|
|
|
"#
|
|
|
|
);
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2022-04-20 23:05:37 +03:00
|
|
|
let result_0 = checked_call_vm!(set_variable, <_>::default(), &script, "", "");
|
|
|
|
let result_1 = checked_call_vm!(vm1, <_>::default(), &script, "", result_0.data.clone());
|
|
|
|
let result_2 = checked_call_vm!(vm2, <_>::default(), &script, "", result_0.data);
|
|
|
|
let result_3 = checked_call_vm!(
|
|
|
|
vm1,
|
|
|
|
<_>::default(),
|
|
|
|
&script,
|
|
|
|
result_1.data.clone(),
|
|
|
|
result_2.data.clone()
|
|
|
|
);
|
|
|
|
let result_4 = checked_call_vm!(
|
|
|
|
vm2,
|
|
|
|
<_>::default(),
|
|
|
|
script,
|
|
|
|
result_1.data.clone(),
|
|
|
|
result_2.data.clone()
|
|
|
|
);
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2021-08-24 16:14:15 +03:00
|
|
|
let actual_trace_1 = trace_from_result(&result_1);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
2023-03-21 19:12:04 +07:00
|
|
|
let expected_trace_1 = ExecutionTrace::from(vec![
|
|
|
|
scalar!(
|
|
|
|
json!([vm_1_peer_id, vm_2_peer_id]),
|
|
|
|
peer = set_variable_peer_id,
|
|
|
|
service = "neighborhood"
|
|
|
|
),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 0, peer = vm_1_peer_id, service = "add_provider"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(set_variable_peer_id),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 0, peer = vm_1_peer_id, service = "get_providers"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(vm_1_peer_id),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 1, peer = vm_1_peer_id, service = "identity"),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(vm_1_peer_id),
|
2023-03-21 19:12:04 +07:00
|
|
|
]);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
|
|
|
assert_eq!(actual_trace_1, expected_trace_1);
|
2022-03-10 16:06:43 +03:00
|
|
|
assert_eq!(result_1.next_peer_pks, vec![vm_2_peer_id.to_string()]);
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2021-08-24 16:14:15 +03:00
|
|
|
let actual_trace_2 = trace_from_result(&result_2);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
2023-03-21 19:12:04 +07:00
|
|
|
let expected_trace_2 = ExecutionTrace::from(vec![
|
|
|
|
scalar!(
|
|
|
|
json!([vm_1_peer_id, vm_2_peer_id]),
|
|
|
|
peer = set_variable_peer_id,
|
|
|
|
service = "neighborhood"
|
|
|
|
),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(set_variable_peer_id),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_2_peer_id, 0, peer = vm_2_peer_id, service = "add_provider"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(vm_2_peer_id),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_2_peer_id, 0, peer = vm_2_peer_id, service = "get_providers"),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(vm_2_peer_id),
|
2023-03-21 19:12:04 +07:00
|
|
|
]);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
|
|
|
assert_eq!(actual_trace_2, expected_trace_2);
|
2022-03-10 16:06:43 +03:00
|
|
|
assert_eq!(result_2.next_peer_pks, vec![vm_1_peer_id.to_string()]);
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2021-08-24 16:14:15 +03:00
|
|
|
let actual_trace_3 = trace_from_result(&result_3);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
|
|
|
let expected_trace_3 = vec![
|
2023-03-21 19:12:04 +07:00
|
|
|
scalar!(
|
|
|
|
json!([vm_1_peer_id, vm_2_peer_id]),
|
|
|
|
peer = set_variable_peer_id,
|
|
|
|
service = "neighborhood"
|
|
|
|
),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 0, peer = vm_1_peer_id, service = "add_provider"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_2_peer_id, 2, peer = vm_2_peer_id, service = "add_provider"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 0, peer = vm_1_peer_id, service = "get_providers"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_2_peer_id, 1, peer = vm_2_peer_id, service = "get_providers"),
|
|
|
|
stream!(vm_1_peer_id, 1, peer = vm_1_peer_id, service = "identity"),
|
2022-03-10 16:06:43 +03:00
|
|
|
request_sent_by(vm_1_peer_id),
|
2021-05-16 22:52:22 +03:00
|
|
|
];
|
|
|
|
|
2022-09-29 23:10:24 +03:00
|
|
|
assert_eq!(actual_trace_3.deref(), expected_trace_3);
|
2021-08-24 16:14:15 +03:00
|
|
|
assert!(result_3.next_peer_pks.is_empty());
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2021-08-24 16:14:15 +03:00
|
|
|
let actual_trace_4 = trace_from_result(&result_4);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
2023-03-21 19:12:04 +07:00
|
|
|
let expected_trace_4 = ExecutionTrace::from(vec![
|
|
|
|
scalar!(
|
|
|
|
json!([vm_1_peer_id, vm_2_peer_id]),
|
|
|
|
peer = set_variable_peer_id,
|
|
|
|
service = "neighborhood"
|
|
|
|
),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 0, peer = vm_1_peer_id, service = "add_provider"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_2_peer_id, 2, peer = vm_2_peer_id, service = "add_provider"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 2),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_1_peer_id, 0, peer = vm_1_peer_id, service = "get_providers"),
|
2021-05-16 22:52:22 +03:00
|
|
|
par(1, 0),
|
2023-03-21 19:12:04 +07:00
|
|
|
stream!(vm_2_peer_id, 1, peer = vm_2_peer_id, service = "get_providers"),
|
|
|
|
stream!(vm_1_peer_id, 1, peer = vm_1_peer_id, service = "identity"),
|
|
|
|
scalar!(vm_2_peer_id, peer = vm_2_peer_id),
|
|
|
|
]);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
|
|
|
assert_eq!(actual_trace_4, expected_trace_4);
|
2021-08-24 16:14:15 +03:00
|
|
|
assert!(result_4.next_peer_pks.is_empty());
|
2020-10-30 20:29:05 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2022-03-10 16:06:43 +03:00
|
|
|
fn stream_merge() {
|
2021-10-04 10:58:00 +03:00
|
|
|
let neighborhood_call_service: CallServiceClosure = Box::new(|params| -> CallServiceResult {
|
|
|
|
let args_count = (params.function_name.as_bytes()[0] - b'0') as usize;
|
|
|
|
let args: Vec<Vec<JValue>> = serde_json::from_value(JValue::Array(params.arguments)).expect("valid json");
|
|
|
|
assert_eq!(args[0].len(), args_count);
|
|
|
|
|
|
|
|
CallServiceResult::ok(json!(args))
|
2020-10-30 20:29:05 +03:00
|
|
|
});
|
|
|
|
|
2021-10-04 10:58:00 +03:00
|
|
|
let mut vm1 = create_avm(set_variable_call_service(json!("peer_id")), "A");
|
2021-05-10 14:25:34 +03:00
|
|
|
let mut vm2 = create_avm(neighborhood_call_service, "B");
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2022-03-10 16:06:43 +03:00
|
|
|
let script = r#"
|
2020-11-03 17:43:58 +03:00
|
|
|
(seq
|
2021-03-26 17:13:28 +03:00
|
|
|
(call "A" ("add_provider" "") [] $void)
|
2020-11-03 17:43:58 +03:00
|
|
|
(seq
|
2021-03-26 17:13:28 +03:00
|
|
|
(call "A" ("add_provider" "") [] $void)
|
2020-11-03 17:43:58 +03:00
|
|
|
(seq
|
2021-03-26 17:13:28 +03:00
|
|
|
(call "A" ("get_providers" "") [] $providers)
|
2020-11-03 17:43:58 +03:00
|
|
|
(seq
|
2021-03-26 17:13:28 +03:00
|
|
|
(call "A" ("get_providers" "") [] $providers)
|
2022-11-30 17:38:32 +03:00
|
|
|
(seq
|
|
|
|
(seq
|
|
|
|
(canon "B" $providers #providers)
|
|
|
|
(call "B" ("" "2") [#providers] $void)
|
|
|
|
)
|
|
|
|
(seq
|
|
|
|
(canon "B" $void #void)
|
|
|
|
(call "B" ("" "3") [#void] $void)
|
|
|
|
)
|
2020-11-03 17:43:58 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
2022-03-10 16:06:43 +03:00
|
|
|
"#;
|
2020-10-30 20:29:05 +03:00
|
|
|
|
2022-04-20 23:05:37 +03:00
|
|
|
let result = checked_call_vm!(vm1, <_>::default(), script, "", "");
|
|
|
|
checked_call_vm!(vm2, <_>::default(), script, "", result.data);
|
2020-10-30 20:29:05 +03:00
|
|
|
}
|
2021-05-16 22:52:22 +03:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn fold_merge() {
|
|
|
|
let set_variable_vm_id = "set_variable";
|
|
|
|
let local_vm_id = "local_vm";
|
|
|
|
|
|
|
|
let variables = maplit::hashmap! {
|
2021-10-04 10:58:00 +03:00
|
|
|
"stream_1".to_string() => json!(["peer_0", "peer_1", "peer_2", "peer_3"]),
|
|
|
|
"stream_2".to_string() => json!(["peer_4", "peer_5", "peer_6"]),
|
2021-05-16 22:52:22 +03:00
|
|
|
};
|
2021-11-29 18:35:11 +03:00
|
|
|
let mut set_variable_vm = create_avm(
|
|
|
|
set_variables_call_service(variables, VariableOptionSource::Argument(0)),
|
|
|
|
set_variable_vm_id,
|
|
|
|
);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
|
|
|
let script = format!(
|
2022-10-06 15:56:31 +03:00
|
|
|
include_str!("./scripts/inner_folds_v1.air"),
|
2021-05-16 22:52:22 +03:00
|
|
|
set_variable_vm_id, local_vm_id
|
|
|
|
);
|
|
|
|
|
2022-04-20 23:05:37 +03:00
|
|
|
let set_variable_result = checked_call_vm!(set_variable_vm, <_>::default(), &script, "", "");
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
let mut local_vms = Vec::with_capacity(7);
|
|
|
|
let mut local_vms_results = Vec::with_capacity(7);
|
|
|
|
for vm_id in 0..7 {
|
2023-07-14 16:02:19 +03:00
|
|
|
let peer_id = format!("peer_{vm_id}");
|
2021-10-04 10:58:00 +03:00
|
|
|
let mut vm = create_avm(echo_call_service(), peer_id);
|
2021-08-24 16:14:15 +03:00
|
|
|
let result = checked_call_vm!(
|
|
|
|
vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
|
|
|
set_variable_result.data.clone(),
|
|
|
|
set_variable_result.data.clone()
|
|
|
|
);
|
|
|
|
|
|
|
|
local_vms.push(vm);
|
|
|
|
local_vms_results.push(result);
|
|
|
|
}
|
|
|
|
|
2021-10-04 10:58:00 +03:00
|
|
|
let mut local_vm = create_avm(echo_call_service(), local_vm_id);
|
2022-04-20 23:05:37 +03:00
|
|
|
let result_1 = checked_call_vm!(local_vm, <_>::default(), &script, "", local_vms_results[0].data.clone());
|
2021-08-24 16:14:15 +03:00
|
|
|
let result_2 = checked_call_vm!(
|
|
|
|
local_vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
2022-12-12 22:37:05 +07:00
|
|
|
result_1.data,
|
2021-08-24 16:14:15 +03:00
|
|
|
local_vms_results[3].data.clone()
|
|
|
|
);
|
|
|
|
let result_3 = checked_call_vm!(
|
|
|
|
local_vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
2022-12-12 22:37:05 +07:00
|
|
|
result_2.data,
|
2021-08-24 16:14:15 +03:00
|
|
|
local_vms_results[4].data.clone()
|
|
|
|
);
|
|
|
|
let result_4 = checked_call_vm!(
|
|
|
|
local_vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
2022-12-12 22:37:05 +07:00
|
|
|
result_3.data,
|
2021-08-24 16:14:15 +03:00
|
|
|
local_vms_results[5].data.clone()
|
|
|
|
);
|
|
|
|
|
|
|
|
let result_5 = checked_call_vm!(
|
|
|
|
local_vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
2022-12-12 22:37:05 +07:00
|
|
|
result_4.data,
|
2021-08-24 16:14:15 +03:00
|
|
|
local_vms_results[1].data.clone()
|
|
|
|
);
|
|
|
|
|
|
|
|
let result_6 = checked_call_vm!(
|
|
|
|
local_vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
2022-12-12 22:37:05 +07:00
|
|
|
result_5.data,
|
2021-08-24 16:14:15 +03:00
|
|
|
local_vms_results[2].data.clone()
|
|
|
|
);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
2021-08-24 16:14:15 +03:00
|
|
|
let result_7 = checked_call_vm!(
|
|
|
|
local_vm,
|
2022-04-20 23:05:37 +03:00
|
|
|
<_>::default(),
|
2021-08-24 16:14:15 +03:00
|
|
|
&script,
|
2022-12-12 22:37:05 +07:00
|
|
|
result_6.data,
|
2021-08-24 16:14:15 +03:00
|
|
|
local_vms_results[6].data.clone()
|
|
|
|
);
|
2021-05-16 22:52:22 +03:00
|
|
|
|
2023-02-07 21:07:02 +03:00
|
|
|
let data = InterpreterData::try_from_slice(&result_7.data).expect("data should be well-formed");
|
2021-08-24 16:14:15 +03:00
|
|
|
|
|
|
|
let mut fold_states_count = 0;
|
|
|
|
let mut calls_count = HashMap::new();
|
|
|
|
|
|
|
|
for state in data.trace.iter() {
|
|
|
|
if matches!(state, ExecutedState::Fold(_)) {
|
|
|
|
fold_states_count += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if let ExecutedState::Fold(fold) = state {
|
|
|
|
for subtrace_lore in fold.lore.iter() {
|
2022-06-10 08:29:56 +03:00
|
|
|
let value_pos = subtrace_lore.value_pos;
|
2021-08-24 16:14:15 +03:00
|
|
|
if let ExecutedState::Call(CallResult::Executed(value)) = &data.trace[value_pos] {
|
2022-12-26 15:45:14 +07:00
|
|
|
let cid = match value {
|
2023-03-21 19:12:04 +07:00
|
|
|
ValueRef::Scalar(service_result_cid) => service_result_cid,
|
|
|
|
ValueRef::Stream {
|
|
|
|
cid: service_result_cid,
|
|
|
|
..
|
|
|
|
} => service_result_cid,
|
|
|
|
// Cannot resolve
|
|
|
|
ValueRef::Unused(_value_cid) => continue,
|
2021-08-24 16:14:15 +03:00
|
|
|
};
|
|
|
|
|
2023-03-21 19:12:04 +07:00
|
|
|
let service_result_agg = data.cid_info.service_result_store.get(cid).unwrap();
|
|
|
|
let value = data.cid_info.value_store.get(&service_result_agg.value_cid).unwrap();
|
|
|
|
|
2022-12-26 15:45:14 +07:00
|
|
|
if let JValue::String(ref var_name) = &*value {
|
2022-12-12 22:37:05 +07:00
|
|
|
let current_count: usize = calls_count.get(var_name).copied().unwrap_or_default();
|
2022-12-26 15:45:14 +07:00
|
|
|
calls_count.insert(var_name.to_owned(), current_count + 1);
|
2021-08-24 16:14:15 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// $stream_1 contains 4 generation each with 2 elements, it means that inner fold for $stream_2
|
|
|
|
// runs 2*4 times and produces 2*4 fold states, and 1 state comes from fold for $stream_1
|
|
|
|
assert_eq!(fold_states_count, 2 * 4 + 1);
|
|
|
|
|
|
|
|
for (call_result, call_count) in calls_count {
|
|
|
|
if call_result.as_str() < "peer_4" {
|
|
|
|
assert_eq!(call_count, 2);
|
|
|
|
} else {
|
|
|
|
assert_eq!(call_count, 16);
|
|
|
|
}
|
|
|
|
}
|
2021-05-16 22:52:22 +03:00
|
|
|
}
|
2023-03-21 19:12:04 +07:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_scalar_match() {
|
|
|
|
let air = r#"(call "peer" ("" "") [] var)"#;
|
|
|
|
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
let mut cid_store = ExecutionCidState::new();
|
|
|
|
|
|
|
|
let trace = ExecutionTrace::from(vec![scalar_tracked!(42, cid_store, peer = "peer")]);
|
|
|
|
let data = raw_data_from_trace(trace, cid_store);
|
|
|
|
checked_call_vm!(avm, <_>::default(), air, data.clone(), data);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_scalar_mismatch() {
|
|
|
|
let air = r#"(call "peer" ("" "") [] var)"#;
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
|
|
|
|
let mut cid_state1 = ExecutionCidState::default();
|
|
|
|
let mut cid_state2 = ExecutionCidState::default();
|
|
|
|
let trace1 = ExecutionTrace::from(vec![scalar_tracked!(42, cid_state1, peer = "peer")]);
|
|
|
|
let trace2 = ExecutionTrace::from(vec![scalar_tracked!(43, cid_state2, peer = "peer")]);
|
|
|
|
let data1 = raw_data_from_trace(trace1, cid_state1);
|
|
|
|
let data2 = raw_data_from_trace(trace2, cid_state2);
|
|
|
|
|
|
|
|
let result = avm.call(air, data1, data2, <_>::default()).unwrap();
|
|
|
|
assert_eq!(result.ret_code, 20000);
|
|
|
|
assert_eq!(
|
|
|
|
result.error_message,
|
|
|
|
concat!(
|
|
|
|
r#"on instruction 'call "peer" ("" "") [] var' trace handler encountered an error:"#,
|
|
|
|
r#" values in call results are not equal:"#,
|
|
|
|
r#" Scalar(CID("bagaaierautomsqybwfcilogqikd6sxzhaqkrout64cosdlpo7p6wvod4miza"))"#,
|
|
|
|
r#" != Scalar(CID("bagaaieraywolxobx5koykfm7lnjtpci6wt4ccqqehbbhpebomznlzaszhgya"))"#
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_stream_match() {
|
|
|
|
let air = r#"(call "peer" ("" "") [] $var)"#;
|
|
|
|
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
let mut cid_store = ExecutionCidState::new();
|
|
|
|
|
|
|
|
let trace = ExecutionTrace::from(vec![stream_tracked!(42, 0, cid_store, peer = "peer")]);
|
|
|
|
let data = raw_data_from_trace(trace, cid_store);
|
|
|
|
checked_call_vm!(avm, <_>::default(), air, data.clone(), data);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_stream_match_gen() {
|
|
|
|
let air = r#"(call "peer" ("" "") [] $var)"#;
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
|
|
|
|
let mut cid_state1 = ExecutionCidState::default();
|
|
|
|
let mut cid_state2 = ExecutionCidState::default();
|
|
|
|
let trace1 = ExecutionTrace::from(vec![stream_tracked!(42, 0, cid_state1, peer = "peer")]);
|
|
|
|
let trace2 = ExecutionTrace::from(vec![stream_tracked!(42, 1, cid_state2, peer = "peer")]);
|
|
|
|
let data1 = raw_data_from_trace(trace1, cid_state1);
|
|
|
|
let data2 = raw_data_from_trace(trace2, cid_state2);
|
|
|
|
checked_call_vm!(avm, <_>::default(), air, data1, data2);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_stream_mismatch() {
|
|
|
|
let air = r#"(call "peer" ("" "") [] $var)"#;
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
|
|
|
|
let mut cid_state1 = ExecutionCidState::default();
|
|
|
|
let mut cid_state2 = ExecutionCidState::default();
|
|
|
|
let trace1 = ExecutionTrace::from(vec![stream_tracked!(42, 0, cid_state1, peer = "peer")]);
|
|
|
|
let trace2 = ExecutionTrace::from(vec![stream_tracked!(43, 0, cid_state2, peer = "peer")]);
|
|
|
|
let data1 = raw_data_from_trace(trace1, cid_state1);
|
|
|
|
let data2 = raw_data_from_trace(trace2, cid_state2);
|
|
|
|
|
|
|
|
let result = avm.call(air, data1, data2, <_>::default()).unwrap();
|
|
|
|
assert_eq!(result.ret_code, 20000);
|
|
|
|
assert_eq!(
|
|
|
|
result.error_message,
|
|
|
|
concat!(
|
|
|
|
r#"on instruction 'call "peer" ("" "") [] $var' trace handler encountered an error:"#,
|
|
|
|
r#" values in call results are not equal:"#,
|
|
|
|
r#" Stream { cid: CID("bagaaierautomsqybwfcilogqikd6sxzhaqkrout64cosdlpo7p6wvod4miza"), generation: 0 }"#,
|
|
|
|
r#" != Stream { cid: CID("bagaaieraywolxobx5koykfm7lnjtpci6wt4ccqqehbbhpebomznlzaszhgya"), generation: 0 }"#
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_unused_match() {
|
|
|
|
let air = r#"(call "peer" ("" "") [])"#;
|
|
|
|
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
|
|
|
|
let trace = ExecutionTrace::from(vec![unused!(42, peer = "peer")]);
|
|
|
|
let data = raw_data_from_trace(trace, <_>::default());
|
|
|
|
|
|
|
|
checked_call_vm!(avm, <_>::default(), air, data.clone(), data);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_merge_unused_mismatch() {
|
|
|
|
let air = r#"(call "peer" ("" "") [])"#;
|
|
|
|
let mut avm = create_avm(echo_call_service(), "peer");
|
|
|
|
|
|
|
|
let trace1 = ExecutionTrace::from(vec![unused!(42, peer = "peer")]);
|
|
|
|
let trace2 = ExecutionTrace::from(vec![unused!(43, peer = "peer")]);
|
|
|
|
let data1 = raw_data_from_trace(trace1, <_>::default());
|
|
|
|
let data2 = raw_data_from_trace(trace2, <_>::default());
|
|
|
|
|
|
|
|
let result = avm.call(air, data1, data2, <_>::default()).unwrap();
|
|
|
|
assert_eq!(result.ret_code, 20000);
|
|
|
|
assert_eq!(
|
|
|
|
result.error_message,
|
|
|
|
concat!(
|
|
|
|
r#"on instruction 'call "peer" ("" "") [] ' trace handler encountered an error:"#,
|
|
|
|
r#" values in call results are not equal:"#,
|
|
|
|
r#" Unused(CID("bagaaieraondvznakk2hi3kfaixhnceatpykz7cikytniqo3lc7ogkgz2qbeq"))"#,
|
|
|
|
r#" != Unused(CID("bagaaieraitfxgdccasakar33kbnoncxvbd5zb6lm6dwfjrvnc2kj3vbh6e5a"))"#
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|