mod common;
use wasmtime::component::Val;
use common::{wasi_wit_dir, TestCase};
#[test]
fn test_wasi_random() {
let mut inst = TestCase::new()
.wit_dir(wasi_wit_dir())
.world("wasi-random")
.script(
r#"
const random = globalThis["wasi:random/random@0.2.6"];
function getRandomU64() { return random.getRandomU64(); }
function getRandomBytes(len) { return random.getRandomBytes(len); }
"#,
)
.build()
.expect("should build wasi-random component");
let val = inst.call1("get-random-u64", &[]);
assert!(matches!(val, Val::U64(_)), "Expected u64, got: {:?}", val);
let val2 = inst.call1("get-random-u64", &[]);
assert_ne!(val, val2, "Two random u64 calls returned the same value");
let bytes = inst.call1("get-random-bytes", &[Val::U32(16)]);
match &bytes {
Val::List(items) => assert_eq!(items.len(), 16, "Expected 16 random bytes"),
other => panic!("Expected list, got: {:?}", other),
}
}
#[test]
fn test_wasi_clocks() {
let mut inst = TestCase::new()
.wit_dir(wasi_wit_dir())
.world("wasi-clocks")
.script(
r#"
const clock = globalThis["wasi:clocks/monotonic-clock@0.2.6"];
function getTimeNs() { return clock.now(); }
function elapsedNs() {
const start = clock.now();
// Do some trivial work to burn a tiny bit of time
let x = 0;
for (let i = 0; i < 1000; i++) { x += i; }
return clock.now() - start;
}
"#,
)
.build()
.expect("should build wasi-clocks component");
let time = inst.call1("get-time-ns", &[]);
match time {
Val::U64(ns) => assert!(ns > 0, "Monotonic clock returned 0"),
other => panic!("Expected u64, got: {:?}", other),
}
let time2 = inst.call1("get-time-ns", &[]);
match (&time, &time2) {
(Val::U64(t1), Val::U64(t2)) => assert!(t2 >= t1, "Clock went backwards: {} -> {}", t1, t2),
_ => unreachable!(),
}
let elapsed = inst.call1("elapsed-ns", &[]);
assert!(
matches!(elapsed, Val::U64(_)),
"Expected u64, got: {:?}",
elapsed
);
}
#[test]
fn test_wasi_environment() {
let mut inst = TestCase::new()
.wit_dir(wasi_wit_dir())
.world("wasi-environment")
.env("TEST_KEY", "test_value")
.script(
r#"
const env = globalThis["wasi:cli/environment@0.2.6"];
function getEnvVars() { return env.getEnvironment(); }
"#,
)
.build()
.expect("should build wasi-environment component");
let vars = inst.call1("get-env-vars", &[]);
match &vars {
Val::List(items) => {
let found = items.iter().any(|item| {
matches!(item, Val::Tuple(fields) if
fields.len() == 2
&& fields[0] == Val::String("TEST_KEY".into())
&& fields[1] == Val::String("test_value".into())
)
});
assert!(
found,
"TEST_KEY=test_value not found in env vars: {:?}",
items
);
}
other => panic!("Expected list, got: {:?}", other),
}
}