use crate::protocol::*;
use crate::protocol::eval::*;
use crate::runtime2::runtime::*;
use crate::runtime2::component::{CompCtx, CompPDL};
fn create_component(rt: &Runtime, module_name: &str, routine_name: &str, args: ValueGroup) {
let prompt = rt.inner.protocol.new_component(
module_name.as_bytes(), routine_name.as_bytes(), args
).expect("create prompt");
let reserved = rt.inner.start_create_pdl_component();
let ctx = CompCtx::new(&reserved);
let (key, _) = rt.inner.finish_create_pdl_component(reserved, CompPDL::new(prompt, 0), ctx, false);
rt.inner.enqueue_work(key);
}
fn no_args() -> ValueGroup { ValueGroup::new_stack(Vec::new()) }
#[test]
fn test_component_creation() {
let pd = ProtocolDescription::parse(b"
primitive nothing_at_all() {
s32 a = 5;
auto b = 5 + a;
}
").expect("compilation");
let rt = Runtime::new(1, true, pd);
for i in 0..20 {
create_component(&rt, "", "nothing_at_all", no_args());
}
}
#[test]
fn test_component_communication() {
let pd = ProtocolDescription::parse(b"
primitive sender(out<u32> o, u32 outside_loops, u32 inside_loops) {
u32 outside_index = 0;
while (outside_index < outside_loops) {
u32 inside_index = 0;
sync while (inside_index < inside_loops) {
put(o, inside_index);
inside_index += 1;
}
outside_index += 1;
}
}
primitive receiver(in<u32> i, u32 outside_loops, u32 inside_loops) {
u32 outside_index = 0;
while (outside_index < outside_loops) {
u32 inside_index = 0;
sync while (inside_index < inside_loops) {
auto val = get(i);
while (val != inside_index) {} // infinite loop if incorrect value is received
inside_index += 1;
}
outside_index += 1;
}
}
composite constructor() {
channel o_orom -> i_orom;
channel o_mrom -> i_mrom;
channel o_ormm -> i_ormm;
channel o_mrmm -> i_mrmm;
// one round, one message per round
new sender(o_orom, 1, 1);
new receiver(i_orom, 1, 1);
// multiple rounds, one message per round
new sender(o_mrom, 5, 1);
new receiver(i_mrom, 5, 1);
// one round, multiple messages per round
new sender(o_ormm, 1, 5);
new receiver(i_ormm, 1, 5);
// multiple rounds, multiple messages per round
new sender(o_mrmm, 5, 5);
new receiver(i_mrmm, 5, 5);
}").expect("compilation");
let rt = Runtime::new(3, true, pd);
create_component(&rt, "", "constructor", no_args());
}