rpi-extensions 0.5.0

Rust-native (cdylib) plugin loader + AgentTool adapter for rpi — libloading + spawn_blocking ABI bridge
Documentation
use super::*;

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn cancelled_parent_can_reclaim_children_but_never_start_more_work() {
    let host = Arc::new(Host::default());
    let root = ActionBridge::new(Handle::current(), host.clone());
    let plugin = root.for_plugin("research");
    let signal = CancellationToken::new();
    let parent = plugin.for_invocation(false, signal.clone());
    let child = plugin.for_invocation(true, CancellationToken::new());
    signal.cancel();
    for op in ["poll", "cancel", "dispose"] {
        for (bridge, key, expected) in [
            (&parent, parent.invocation_key().unwrap(), 0),
            (&parent, "guessed", 1),
            (&child, child.invocation_key().unwrap(), 1),
        ] {
            let reply = call(
                bridge.user_data() as usize,
                json!({"op":op,"childId":"retained","__rpiRuntimeKey":key}),
            );
            assert_eq!(reply.0, expected, "{op}: {reply:?}");
        }
    }
    assert_eq!(
        call(
            parent.user_data() as usize,
            json!({"op":"start","__rpiRuntimeKey":parent.invocation_key()})
        )
        .0,
        1
    );
    assert_eq!(host.calls.load(Ordering::SeqCst), 3);
}