test: Cycle 24 — mass spawn/stop (100), echo-to-stopping, Send/Sync trait checks
Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
This commit is contained in:
parent
56bb9085d3
commit
185c7ed046
1 changed files with 69 additions and 1 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
use swactor::actor::{ActorAddress, ActorInterface};
|
use swactor::actor::{ActorAddress, ActorInterface};
|
||||||
use swactor::runtime::{Ctx, Runtime, RuntimeConfig};
|
use swactor::runtime::{Ctx, Runtime, RuntimeConfig};
|
||||||
use swactor_wasm_actor::{ByteMessage, SharedEngine, WasmActorBuilder, WasmActorError};
|
use swactor_wasm_actor::{ByteMessage, SharedEngine, WasmActor, WasmActorBuilder, WasmActorError};
|
||||||
|
|
||||||
use proptest::prelude::*;
|
use proptest::prelude::*;
|
||||||
|
|
||||||
|
|
@ -3912,3 +3912,71 @@ fn echo_processes_500_sequential_messages() {
|
||||||
// all 500 messages should fit. Verify all echoed correctly.
|
// all 500 messages should fit. Verify all echoed correctly.
|
||||||
assert_eq!(received_count, 500, "all 500 messages should echo");
|
assert_eq!(received_count, 500, "all 500 messages should echo");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Mass spawn and stop: 100 WASM actors ────────────────────────────────────
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mass_spawn_and_stop_100_actors() {
|
||||||
|
let engine = SharedEngine::new().unwrap();
|
||||||
|
let wasm_bytes = guest_wasm("silent");
|
||||||
|
let rt = Runtime::new(RuntimeConfig::default());
|
||||||
|
|
||||||
|
let mut addrs = Vec::new();
|
||||||
|
for _ in 0..100 {
|
||||||
|
let actor = WasmActorBuilder::new(engine.clone(), wasm_bytes.clone())
|
||||||
|
.build().unwrap();
|
||||||
|
addrs.push(rt.spawn(actor).unwrap());
|
||||||
|
}
|
||||||
|
rt.tick();
|
||||||
|
|
||||||
|
for addr in &addrs {
|
||||||
|
rt.stop_actor(*addr).unwrap();
|
||||||
|
}
|
||||||
|
rt.tick();
|
||||||
|
rt.tick();
|
||||||
|
|
||||||
|
for addr in &addrs {
|
||||||
|
assert!(rt.send_to(*addr, ByteMessage(vec![1])).is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Echo to stopping actor: send silently fails ─────────────────────────────
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn echo_to_stopping_actor_silently_fails() {
|
||||||
|
let engine = SharedEngine::new().unwrap();
|
||||||
|
let wasm_bytes = guest_wasm("echo");
|
||||||
|
|
||||||
|
let actor_a = WasmActorBuilder::new(engine.clone(), wasm_bytes.clone()).build().unwrap();
|
||||||
|
let actor_b = WasmActorBuilder::new(engine, wasm_bytes).build().unwrap();
|
||||||
|
|
||||||
|
let rt = Runtime::new(RuntimeConfig::default());
|
||||||
|
let addr_a = rt.spawn(actor_a).unwrap();
|
||||||
|
let addr_b = rt.spawn(actor_b).unwrap();
|
||||||
|
rt.tick();
|
||||||
|
|
||||||
|
rt.send_to(addr_a, framed_msg(&addr_b, b"to-dying-b")).unwrap();
|
||||||
|
rt.stop_actor(addr_b).unwrap();
|
||||||
|
rt.tick(); // A echoes to B (stopping) — silently fails
|
||||||
|
rt.tick();
|
||||||
|
|
||||||
|
// A should still be alive
|
||||||
|
let inbox = rt.new_inbox::<ByteMessage>().unwrap();
|
||||||
|
rt.send_to(addr_a, framed_msg(inbox.addr(), b"still-alive")).unwrap();
|
||||||
|
rt.tick();
|
||||||
|
assert!(inbox.try_recv().is_some(), "actor A should survive");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Compile-time trait checks ───────────────────────────────────────────────
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn shared_engine_is_send_and_sync() {
|
||||||
|
fn assert_send_sync<T: Send + Sync>() {}
|
||||||
|
assert_send_sync::<SharedEngine>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn wasm_actor_is_send() {
|
||||||
|
fn assert_send<T: Send>() {}
|
||||||
|
assert_send::<WasmActor>();
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue