245 lines
9.4 KiB
Rust
Raw Normal View History

2020-10-23 12:41:58 +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.
*/
2020-10-30 20:29:05 +03:00
use aqua_test_utils::call_vm;
2020-10-23 12:41:58 +03:00
use aqua_test_utils::create_aqua_vm;
use aqua_test_utils::unit_call_service;
use aquamarine_vm::vec1::Vec1;
use aquamarine_vm::HostExportedFunc;
use aquamarine_vm::IValue;
use pretty_assertions::assert_eq;
use serde_json::json;
type JValue = serde_json::Value;
#[test]
fn join_chat() {
use std::collections::HashSet;
let members_call_service1: HostExportedFunc = Box::new(|_, _| -> Option<IValue> {
Some(IValue::Record(
Vec1::new(vec![
IValue::S32(0),
IValue::String(String::from(r#"[["A", "Relay1"], ["B", "Relay2"]]"#)),
])
.unwrap(),
))
});
let mut relay_1 = create_aqua_vm(unit_call_service(), "Relay1");
let mut relay_2 = create_aqua_vm(unit_call_service(), "Relay2");
let mut remote = create_aqua_vm(members_call_service1, "Remote");
let mut client_1 = create_aqua_vm(unit_call_service(), "A");
let mut client_2 = create_aqua_vm(unit_call_service(), "B");
let script = String::from(
r#"
(seq (
(call ("Relay1" ("identity" "") () void1[]))
(seq (
(call ("Remote" ("552196ea-b9b2-4761-98d4-8e7dba77fac4" "add") () void2[]))
(seq (
(call ("Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") () members))
(fold (members m
(par (
(seq (
(call (m.$.[1] ("identity" "") () void[]))
(call (m.$.[0] ("fgemb3" "add") () void3[]))
))
(next m)
))
))
))
))
))
"#,
);
2020-10-30 20:29:05 +03:00
let client_1_res = call_vm!(client_1, "asd", script.clone(), "[]", "[]");
2020-10-23 12:41:58 +03:00
let client_1_res_json: JValue = serde_json::from_str(&client_1_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let client_1_right_json = json!([
{ "call": {"request_sent": "A" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(client_1_res_json, client_1_right_json);
assert_eq!(client_1_res.next_peer_pks, vec![String::from("Relay1")]);
2020-10-30 20:29:05 +03:00
let relay_1_res = call_vm!(relay_1, "asd", script.clone(), client_1_res.data, "[]");
2020-10-23 12:41:58 +03:00
let relay_1_res_json: JValue = serde_json::from_str(&relay_1_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let relay_1_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "request_sent": "Relay1" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(relay_1_res_json, relay_1_right_json);
assert_eq!(relay_1_res.next_peer_pks, vec![String::from("Remote")]);
2020-10-30 20:29:05 +03:00
let remote_res = call_vm!(remote, "asd", script.clone(), relay_1_res.data, "[]");
2020-10-23 12:41:58 +03:00
let remote_res_json: JValue = serde_json::from_str(&remote_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let remote_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "par": [1, 2] },
{ "call": { "request_sent" : "Remote" } },
{ "par": [1, 0] },
{ "call": { "request_sent" : "Remote" } },
]);
2020-10-23 12:41:58 +03:00
let remote_res_next_peer_pks: HashSet<_> = remote_res.next_peer_pks.iter().map(|s| s.as_str()).collect();
let next_peer_pks_right = maplit::hashset! {
"Relay1",
"Relay2",
};
assert_eq!(remote_res_json, remote_right_json);
assert_eq!(remote_res_next_peer_pks, next_peer_pks_right);
2020-10-30 20:29:05 +03:00
let relay_1_res = call_vm!(relay_1, "asd", script.clone(), remote_res.data.clone(), "[]");
2020-10-23 12:41:58 +03:00
let relay_1_res_json: JValue = serde_json::from_str(&relay_1_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let relay_1_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "par": [2, 2] },
{ "call": { "executed" : "test" } },
{ "call": { "request_sent" : "Relay1" } },
{ "par": [1, 0] },
{ "call": { "request_sent" : "Remote" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(relay_1_res_json, relay_1_right_json);
assert_eq!(relay_1_res.next_peer_pks, vec![String::from("A")]);
2020-10-30 20:29:05 +03:00
let client_1_res = call_vm!(client_1, "asd", script.clone(), relay_1_res.data, "[]");
2020-10-23 12:41:58 +03:00
let client_1_res_json: JValue = serde_json::from_str(&client_1_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let client_1_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "par": [2, 2] },
{ "call": { "executed" : "test" } },
{ "call": { "executed" : "test" } },
{ "par": [1, 0] },
{ "call": { "request_sent" : "Remote" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(client_1_res_json, client_1_right_json);
assert_eq!(client_1_res.next_peer_pks, Vec::<String>::new());
2020-10-30 20:29:05 +03:00
let relay_2_res = call_vm!(relay_2, "asd", script.clone(), remote_res.data, "[]");
2020-10-23 12:41:58 +03:00
let relay_2_res_json: JValue = serde_json::from_str(&relay_2_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let relay_2_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "par": [1, 3] },
{ "call": { "request_sent" : "Remote" } },
{ "par": [2, 0] },
{ "call": { "executed" : "test" } },
{ "call": { "request_sent" : "Relay2" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(relay_2_res_json, relay_2_right_json);
assert_eq!(relay_2_res.next_peer_pks, vec![String::from("B")]);
2020-10-30 20:29:05 +03:00
let client_2_res = call_vm!(client_2, "asd", script, relay_2_res.data, "[]");
2020-10-23 12:41:58 +03:00
let client_2_res_json: JValue = serde_json::from_str(&client_2_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let client_2_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "call": { "executed" : [["A", "Relay1"], ["B", "Relay2"]]} },
{ "par": [1, 3] },
{ "call": { "request_sent" : "Remote" } },
{ "par": [2, 0] },
{ "call": { "executed" : "test" } },
{ "call": { "executed" : "test" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(client_2_res_json, client_2_right_json);
assert_eq!(client_2_res.next_peer_pks, Vec::<String>::new());
}
#[test]
fn join() {
let members_call_service1: HostExportedFunc = Box::new(|_, _| -> Option<IValue> {
Some(IValue::Record(
Vec1::new(vec![IValue::S32(0), IValue::String(String::from(r#"[["A"], ["B"]]"#))]).unwrap(),
))
});
let mut relay_1 = create_aqua_vm(unit_call_service(), "Relay1");
let mut remote = create_aqua_vm(members_call_service1, "Remote");
let mut client_1 = create_aqua_vm(unit_call_service(), "A");
let script = String::from(
r#"
(seq (
(call ("Relay1" ("identity" "") () void1[]))
(seq (
(call ("Remote" ("920e3ba3-cbdf-4ae3-8972-0fa2f31fffd9" "get_users") () members))
(fold (members m
(par (
(seq (
(call ("Relay1" ("identity" "") () void[]))
(call ("A" ("fgemb3" "add") (m) void3[]))
))
(next m)
))
))
))
))
"#,
);
2020-10-30 20:29:05 +03:00
let client_1_res = call_vm!(client_1, "asd", script.clone(), "[]", "[]");
let relay_1_res = call_vm!(relay_1, "asd", script.clone(), client_1_res.data, "[]");
let remote_res = call_vm!(remote, "asd", script.clone(), relay_1_res.data, "[]");
let relay_1_res = call_vm!(relay_1, "asd", script.clone(), remote_res.data, "[]");
let client_1_res = call_vm!(client_1, "asd", script, relay_1_res.data, "[]");
2020-10-23 12:41:58 +03:00
let client_1_res_json: JValue = serde_json::from_str(&client_1_res.data).expect("stepper should return valid json");
2020-10-30 20:29:05 +03:00
let client_1_right_json = json!( [
{ "call": { "executed" : "test" } },
{ "call": { "executed" : [["A"], ["B"]]} },
{ "par": [2, 3] },
{ "call": { "executed" : "test" } },
{ "call": { "executed" : "test" } },
{ "par": [2, 0] },
{ "call": { "executed" : "test" } },
{ "call": { "executed" : "test" } },
]);
2020-10-23 12:41:58 +03:00
assert_eq!(client_1_res_json, client_1_right_json);
assert_eq!(client_1_res.next_peer_pks, Vec::<String>::new());
}