2023-03-16 19:06:26 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2023 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-04-05 11:50:15 +03:00
|
|
|
use air::interpreter_data::ExecutedState;
|
|
|
|
use air::ExecutionCidState;
|
2023-03-16 19:06:26 +03:00
|
|
|
use air::UncatchableError::*;
|
2023-03-21 19:12:04 +07:00
|
|
|
use air_interpreter_cid::CID;
|
2023-03-16 19:06:26 +03:00
|
|
|
use air_interpreter_data::ValueRef;
|
|
|
|
use air_test_utils::prelude::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn fold_state_not_found() {
|
|
|
|
let vm_peer_id_1 = "vm_peer_id_1";
|
|
|
|
let arg = json!([1, 2,]);
|
|
|
|
let mut peer_vm_1 = create_avm(set_variable_call_service(arg), vm_peer_id_1);
|
|
|
|
|
2023-07-14 16:02:19 +03:00
|
|
|
let script = format!(
|
|
|
|
r#"
|
2023-03-21 00:31:36 +03:00
|
|
|
(seq
|
|
|
|
(seq
|
|
|
|
(call "vm_peer_id_1" ("" "") [] some)
|
|
|
|
(fold some i
|
|
|
|
(next i)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
(next i)
|
|
|
|
)
|
2023-07-14 16:02:19 +03:00
|
|
|
"#
|
|
|
|
);
|
2023-03-16 19:06:26 +03:00
|
|
|
|
|
|
|
let result = peer_vm_1.call(script, "", "", <_>::default()).unwrap();
|
|
|
|
let expected_error = FoldStateNotFound(String::from("i"));
|
|
|
|
assert!(check_error(&result, expected_error));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn iterable_shadowing() {
|
|
|
|
let vm_peer_id_1 = "vm_peer_id_1";
|
|
|
|
let arg = json!([1, 2,]);
|
|
|
|
let mut peer_vm_1 = create_avm(set_variable_call_service(arg), vm_peer_id_1);
|
|
|
|
|
2023-07-14 16:02:19 +03:00
|
|
|
let script = format!(
|
|
|
|
r#"
|
2023-03-21 00:31:36 +03:00
|
|
|
(seq
|
|
|
|
(call "vm_peer_id_1" ("" "") [] some)
|
|
|
|
(fold some i
|
|
|
|
(call "vm_peer_id_1" ("" "") [] i)
|
|
|
|
)
|
|
|
|
)
|
2023-07-14 16:02:19 +03:00
|
|
|
"#
|
|
|
|
);
|
2023-03-16 19:06:26 +03:00
|
|
|
|
|
|
|
let result = peer_vm_1.call(script, "", "", <_>::default()).unwrap();
|
|
|
|
let expected_error = IterableShadowing(String::from("i"));
|
|
|
|
assert!(check_error(&result, expected_error));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn call_result_not_correspond_to_instr() {
|
|
|
|
let vm_peer_id_1 = "vm_peer_id_1";
|
|
|
|
let arg = json!([1, 2,]);
|
|
|
|
let mut peer_vm_1 = create_avm(set_variable_call_service(arg.clone()), vm_peer_id_1);
|
|
|
|
|
2023-07-14 16:02:19 +03:00
|
|
|
let script = format!(
|
|
|
|
r#"
|
2023-03-21 00:31:36 +03:00
|
|
|
(call "vm_peer_id_1" ("" "") [] $some)
|
2023-07-14 16:02:19 +03:00
|
|
|
"#
|
|
|
|
);
|
2023-03-16 19:06:26 +03:00
|
|
|
|
|
|
|
let scalar_value = 42;
|
2023-03-21 19:12:04 +07:00
|
|
|
let wrong_trace = vec![scalar!(scalar_value)];
|
2023-03-16 19:06:26 +03:00
|
|
|
let data = raw_data_from_trace(wrong_trace, <_>::default());
|
|
|
|
|
|
|
|
let result = peer_vm_1.call(script, "", data, <_>::default()).unwrap();
|
2023-03-21 19:12:04 +07:00
|
|
|
let value_ref = ValueRef::Scalar(CID::new("bagaaierax2kxw256denmh2rmtot4cnuvz7wrf6e2l7jnxhtv3qb6xvqj2vhq").into());
|
2023-03-16 19:06:26 +03:00
|
|
|
let expected_error = CallResultNotCorrespondToInstr(value_ref);
|
2023-03-21 19:12:04 +07:00
|
|
|
assert!(check_error(&result, expected_error), "{:?}", result);
|
2023-03-16 19:06:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn shadowing_is_not_allowed() {
|
|
|
|
let vm_peer_id_1 = "vm_peer_id_1";
|
|
|
|
let mut peer_vm_1 = create_avm(unit_call_service(), vm_peer_id_1);
|
|
|
|
let var_name = String::from("some");
|
2023-07-14 16:02:19 +03:00
|
|
|
let script = format!(
|
|
|
|
r#"
|
2023-03-21 00:31:36 +03:00
|
|
|
(seq
|
|
|
|
(ap 42 {var_name})
|
|
|
|
(ap 42 {var_name})
|
|
|
|
)
|
2023-07-14 16:02:19 +03:00
|
|
|
"#
|
|
|
|
);
|
2023-03-16 19:06:26 +03:00
|
|
|
|
|
|
|
let result = peer_vm_1.call(script, "", "", <_>::default()).unwrap();
|
|
|
|
let expected_error = ShadowingIsNotAllowed(var_name);
|
|
|
|
assert!(check_error(&result, expected_error));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn value_for_cid_not_found() {
|
|
|
|
let vm_peer_id_1 = "vm_peer_id_1";
|
|
|
|
let arg = json!([1, 2,]);
|
|
|
|
let mut peer_vm_1 = create_avm(set_variable_call_service(arg), vm_peer_id_1);
|
|
|
|
|
2023-07-14 16:02:19 +03:00
|
|
|
let script = format!(
|
|
|
|
r#"
|
2023-03-21 00:31:36 +03:00
|
|
|
(call "vm_peer_id_1" ("" "") [] some)
|
2023-07-14 16:02:19 +03:00
|
|
|
"#
|
|
|
|
);
|
2023-03-16 19:06:26 +03:00
|
|
|
|
2023-03-21 19:12:04 +07:00
|
|
|
let wrong_trace = vec![scalar!(42)];
|
2023-03-16 19:06:26 +03:00
|
|
|
let data = raw_data_from_trace(wrong_trace, <_>::default());
|
|
|
|
let result = peer_vm_1.call(script, "", data, <_>::default()).unwrap();
|
2023-03-21 19:12:04 +07:00
|
|
|
|
|
|
|
let missing_cid = String::from("bagaaierax2kxw256denmh2rmtot4cnuvz7wrf6e2l7jnxhtv3qb6xvqj2vhq");
|
|
|
|
let expected_error = ValueForCidNotFound("service result aggregate", missing_cid);
|
2023-03-16 19:06:26 +03:00
|
|
|
assert!(check_error(&result, expected_error));
|
|
|
|
}
|
2023-04-05 11:50:15 +03:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn malformed_call_service_failed() {
|
|
|
|
let peer_id = "init_peer_id";
|
|
|
|
let mut cid_state = ExecutionCidState::new();
|
|
|
|
|
|
|
|
// Craft an artificial incorrect error result
|
|
|
|
let value = json!("error");
|
|
|
|
let value_cid = cid_state.value_tracker.record_value(value.clone()).unwrap();
|
|
|
|
let tetraplet = SecurityTetraplet::literal_tetraplet(peer_id);
|
|
|
|
let tetraplet_cid = cid_state.tetraplet_tracker.record_value(tetraplet).unwrap();
|
2023-05-08 19:42:41 +07:00
|
|
|
let service_result_agg = ServiceResultCidAggregate {
|
2023-04-05 11:50:15 +03:00
|
|
|
value_cid,
|
|
|
|
argument_hash: "0000000000000".into(),
|
|
|
|
tetraplet_cid,
|
|
|
|
};
|
|
|
|
let service_result_agg_cid = cid_state
|
|
|
|
.service_result_agg_tracker
|
|
|
|
.record_value(service_result_agg)
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let trace = ExecutionTrace::from(vec![ExecutedState::Call(CallResult::Failed(service_result_agg_cid))]);
|
|
|
|
let data = raw_data_from_trace(trace, cid_state);
|
|
|
|
|
|
|
|
let mut vm = create_avm(unit_call_service(), peer_id);
|
|
|
|
let air = format!(r#"(call "{peer_id}" ("" "") [] var)"#);
|
|
|
|
let result = vm.call(&air, vec![], data, TestRunParameters::default()).unwrap();
|
|
|
|
let expected_serde_error = serde_json::from_value::<CallServiceFailed>(value).unwrap_err();
|
|
|
|
let expected_error = MalformedCallServiceFailed(expected_serde_error);
|
|
|
|
assert!(check_error(&result, expected_error));
|
|
|
|
}
|