use crate::run;
use anyhow::{bail, Result};
use netidx::publisher::Value;
const DYNAMIC_MODULE0: &str = r#"
{
let source = "
let add = |x| x + 1;
let sub = |x| x - 1;
let cfg = \[1, 2, 3, 4, 5\];
let hidden = 42
";
net::publish("/local/foo", source)?;
let status = mod foo dynamic {
sandbox whitelist [core];
sig {
val add: fn(i64) -> i64 throws Error<ErrChain<`ArithError(string)>>;
val sub: fn(i64) -> i64 throws Error<ErrChain<`ArithError(string)>>;
val cfg: Array<i64>
};
source cast<string>(net::subscribe("/local/foo")$)$
};
select status {
error as e => never(dbg(e)),
null as _ => foo::add(foo::cfg[0]?)
}
}
"#;
run!(dynamic_module0, DYNAMIC_MODULE0, |v: Result<&Value>| match v {
Ok(Value::I64(2)) => true,
_ => false,
});
const DYNAMIC_MODULE1: &str = r#"
{
let source = "
let add = |x| x + 1.;
let sub = |x| x - 1;
let cfg = \[1, 2, 3, 4, 5\];
let hidden = 42
";
net::publish("/local/foo", source)?;
let status = mod foo dynamic {
sandbox whitelist [core];
sig {
val add: fn(i64) -> i64;
val sub: fn(i64) -> i64;
val cfg: Array<i64>
};
source cast<string>(net::subscribe("/local/foo"))
};
select status {
error as e => dbg(e),
null as _ => foo::add(foo::cfg[0]?)
}
}
"#;
run!(dynamic_module1, DYNAMIC_MODULE1, |v: Result<&Value>| match v {
Ok(Value::Error(_)) => true,
_ => false,
});
const DYNAMIC_MODULE2: &str = r#"
{
let source = "let add = 'a: Number |x: 'a| -> 'a x + x";
net::publish("/local/foo", source)?;
let status = mod foo dynamic {
sandbox whitelist [core];
sig {
val add: fn<'a: Number>('a) -> 'a throws Error<ErrChain<`ArithError(string)>>
};
source cast<string>(net::subscribe("/local/foo"))
};
select status {
error as e => dbg(e),
null as _ => foo::add(2)
}
}
"#;
run!(dynamic_module2, DYNAMIC_MODULE2, |v: Result<&Value>| match v {
Ok(Value::I64(4)) => true,
_ => false,
});
const DYNAMIC_MODULE3: &str = r#"
{
let source = "
let foo = never();
let bar = never();
select foo { x => bar <- dbg(x) }
";
net::publish("/local/test", source)?;
let status = mod test dynamic {
sandbox whitelist [core];
sig {
val foo: string;
val bar: string
};
source cast<string>(net::subscribe("/local/test"))
};
select status {
error as e => dbg(e),
null as _ => {
test::foo <- dbg("hello world");
test::bar
}
}
}
"#;
run!(dynamic_module3, DYNAMIC_MODULE3, |v: Result<&Value>| match v {
Ok(Value::String(s)) if s == "hello world" => true,
_ => false,
});
const DYNAMIC_MODULE4: &str = r#"
{
let source = "
let foo = never();
let bar = never();
select foo { x => bar <- dbg(x) }
";
net::publish("/local/test", source)?;
let status = mod test dynamic {
sandbox whitelist [core];
sig {
val foo: string;
val bar: string;
val baz: string
};
source cast<string>(net::subscribe("/local/test"))
};
select status {
error as e => dbg(e),
null as _ => {
test::foo <- dbg("hello world");
test::bar
}
}
}
"#;
run!(dynamic_module4, DYNAMIC_MODULE4, |v: Result<&Value>| match v {
Ok(Value::Error(_)) => true,
_ => false,
});
const DYNAMIC_MODULE5: &str = r#"
{
let source = "
let foo = never();
let bar = never();
select foo { x => bar <- dbg(x) };
net::subscribe(\"/local/test\")
";
net::publish("/local/test", source)?;
let status = mod test dynamic {
sandbox whitelist [core];
sig {
val foo: string;
val bar: string
};
source cast<string>(net::subscribe("/local/test"))
};
select status {
error as e => dbg(e),
null as _ => {
test::foo <- dbg("hello world");
test::bar
}
}
}
"#;
run!(dynamic_module5, DYNAMIC_MODULE5, |v: Result<&Value>| match v {
Ok(Value::Error(_)) => true,
_ => false,
});
const DYNAMIC_MODULE6: &str = r#"
{
let source = "
let foo = never();
let bar = never(); select foo { x => bar <- dbg(x) };
net::subscribe(\"/local/test\")
";
net::publish("/local/test", source)?;
let status = mod test dynamic {
sandbox blacklist [net::publish];
sig {
val foo: string;
val bar: string
};
source cast<string>(net::subscribe("/local/test"))
};
select status {
error as e => dbg(e),
null as _ => {
test::foo <- dbg("hello world");
test::bar
}
}
}
"#;
run!(dynamic_module6, DYNAMIC_MODULE6, |v: Result<&Value>| match v {
Ok(Value::String(s)) if s == "hello world" => true,
_ => false,
});
const DYNAMIC_MODULE7: &str = r#"
{
let source = "
let foo = never();
let bar = never();
select foo { x => bar <- dbg(x) };
net::publish(\"/local/test\", 42)
";
net::publish("/local/test", source)?;
let status = mod test dynamic {
sandbox blacklist [net::publish];
sig {
val foo: string;
val bar: string
};
source cast<string>(net::subscribe("/local/test"))
};
select status {
error as e => dbg(e),
null as _ => {
test::foo <- dbg("hello world");
test::bar
}
}
}
"#;
run!(dynamic_module7, DYNAMIC_MODULE7, |v: Result<&Value>| match v {
Ok(Value::Error(_)) => true,
_ => false,
});
const DYNAMIC_MODULE8: &str = r#"
{
let source = "
let foo = never();
let bar = never();
select foo { x => bar <- dbg(x) };
net::subscribe(\"/local/test\")
";
net::publish("/local/test", source)?;
let status = mod test dynamic {
sandbox whitelist [core, net::subscribe];
sig {
val foo: string;
val bar: string
};
source cast<string>(net::subscribe("/local/test"))
};
select status {
error as e => dbg(e),
null as _ => {
test::foo <- dbg("hello world");
test::bar
}
}
}
"#;
run!(dynamic_module8, DYNAMIC_MODULE8, |v: Result<&Value>| match v {
Ok(Value::String(s)) if s == "hello world" => true,
_ => false,
});