harn-vm 0.10.168

Async bytecode virtual machine for the Harn programming language
use super::{scope_placement, spawn_child};
use crate::vm::subtask::{placement, SubtaskPlacement};

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn scoped_placement_reaches_the_spawn_seam() {
    assert_eq!(placement(), SubtaskPlacement::Worker);
    let observed = scope_placement(SubtaskPlacement::CurrentThread, async { placement() }).await;
    assert_eq!(observed, SubtaskPlacement::CurrentThread);
    assert_eq!(placement(), SubtaskPlacement::Worker);
}

#[test]
fn placement_selects_the_executor_thread() {
    fn observed_thread(
        runtime: &tokio::runtime::Runtime,
        placement: SubtaskPlacement,
    ) -> std::thread::ThreadId {
        runtime.block_on(async {
            tokio::task::LocalSet::new()
                .run_until(scope_placement(placement, async {
                    spawn_child(crate::stdlib::pool::new_pool_registry(), async {
                        std::thread::current().id()
                    })
                    .await
                    .expect("subtask completes")
                }))
                .await
        })
    }
    let runtime = tokio::runtime::Builder::new_multi_thread()
        .worker_threads(2)
        .enable_all()
        .build()
        .expect("test runtime");
    let creating_thread = std::thread::current().id();
    assert_ne!(
        observed_thread(&runtime, SubtaskPlacement::Worker),
        creating_thread
    );
    assert_eq!(
        observed_thread(&runtime, SubtaskPlacement::CurrentThread),
        creating_thread
    );
}