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 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 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()); }