Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/monetize

crates/monetize-server/src/estate_order/tests/drive_job.rs

//! **B6: the tick drives each estate order as a queued jera job** (owner rule: server background
//! work is a jera ChainQueue job, never a raw thread): one keyed chain PER ESTATE — an estate's
//! drives run one at a time, in order, and two estates never wait for each other; a second tick
//! while a drive is queued or running is that same job.

use super::*;

#[test]
fn the_tick_drives_each_estate_on_its_own_jera_chain() {
    let r = rig("drive-job");
    start(
        &r.state,
        "acme",
        "buyer@example.com",
        "",
        &EstateSizes::default(),
    )
    .expect("ordered");
    start(
        &r.state,
        "bolt",
        "buyer@example.com",
        "",
        &EstateSizes::default(),
    )
    .expect("ordered");
    r.pay.authorize(&handle_of(&r, "acme"));
    r.pay.authorize(&handle_of(&r, "bolt"));
    let rt = tokio::runtime::Builder::new_multi_thread()
        .worker_threads(2)
        .enable_all()
        .build()
        .unwrap();
    let state = r.state.clone();
    rt.block_on(async move {
        // Every lane the ticks made, kept here: a delivered order's lane is let go by the tick.
        let mut seen: BTreeMap<String, Arc<jera::jobs::chain::ChainQueue>> = BTreeMap::new();
        for _ in 0..400 {
            let s = state.clone();
            tokio::task::spawn_blocking(move || {
                // The estates call home, as an installed one does every minute.
                calls_home(&s, "acme");
                calls_home(&s, "bolt");
                super::tick(&s);
            })
            .await
            .unwrap();
            for (c, q) in state.estates.drive_lanes.lock().unwrap().iter() {
                seen.entry(c.clone()).or_insert_with(|| q.clone());
            }
            if ["acme", "bolt"].iter().all(|c| {
                state
                    .estates
                    .get(c)
                    .is_some_and(|r| r.phase == phase::CAPTURED)
            }) {
                break;
            }
            tokio::time::sleep(std::time::Duration::from_millis(25)).await;
        }
        assert_eq!(
            seen.keys().map(String::as_str).collect::<Vec<_>>(),
            ["acme", "bolt"],
            "one jera chain per estate"
        );
        // The drive that delivered an order is still finishing when its phase is read.
        for _ in 0..400 {
            if seen.values().all(|q| q.stats().done > 0) {
                break;
            }
            tokio::time::sleep(std::time::Duration::from_millis(25)).await;
        }
        assert!(
            seen.values().all(|q| q.stats().done > 0),
            "the drives ran as jera jobs"
        );
    });
    for c in ["acme", "bolt"] {
        let run = r.state.estates.get(c).unwrap();
        assert_eq!(run.phase, phase::CAPTURED, "{c}: {:#?}", run.history);
    }
}