use std::sync::Arc;
const SCRIPT: &str = "01_local_matmul.mnd";
const PAYLOAD: &str = r#"{"h0": [[3,1],[2,4]]}"#;
fn corpus(name: &str) -> std::path::PathBuf {
let dir = std::env::var("MANED_CONFORMANCE_DIR")
.unwrap_or_else(|_| "/Users/fabianodicheti/Documents/maned/capi-freeze/conformance".into());
std::path::PathBuf::from(dir).join(name)
}
fn payload() -> serde_json::Value {
serde_json::from_str(PAYLOAD).unwrap()
}
#[test]
fn shared_script_is_identical_across_eight_threads() {
let script = maned::load(corpus(SCRIPT))
.unwrap()
.into_shared()
.expect("01_local_matmul is not routed");
assert!(!script.is_routed());
let expected = script.run(&payload()).unwrap().body().to_vec();
assert_eq!(
expected,
br#"{"outputs":{"a":[[7,9],[2,4]]},"notes":[]}"#.to_vec()
);
let script = Arc::new(script);
let mut handles = Vec::new();
for _ in 0..8 {
let script = Arc::clone(&script);
let expected = expected.clone();
handles.push(std::thread::spawn(move || {
for _ in 0..25 {
let r = script.run(&payload()).unwrap();
assert_eq!(r.status(), 200);
assert_eq!(r.body(), expected.as_slice());
}
}));
}
for h in handles {
h.join().expect("no thread panicked");
}
}
#[test]
fn the_send_and_sync_impls_are_what_section_4_3_says() {
fn assert_send<T: Send>() {}
fn assert_sync<T: Sync>() {}
assert_send::<maned::Script>();
assert_sync::<maned::SharedScript>();
assert_send::<maned::SharedScript>();
assert_send::<Arc<maned::SharedScript>>();
assert_send::<maned::Response>();
}
#[test]
fn a_script_can_be_moved_to_another_thread() {
let mut script = maned::load(corpus(SCRIPT)).unwrap();
let body = std::thread::spawn(move || script.run(&payload()).unwrap().body().to_vec())
.join()
.unwrap();
assert!(body.starts_with(br#"{"outputs""#));
}