use std::thread; use swctx::{mkpair, Error}; #[derive(Clone, Debug, Default, PartialEq)] enum State { #[default] Abort, NoReply } // Trigger an abortion error before wait is called (hopefully). #[test] fn abort_before_wait() { let tokrt = tokio::runtime::Runtime::new().unwrap(); let (sctx, wctx) = mkpair::<(), State, ()>(); let jh = thread::spawn(move || { let _sctx2 = sctx; }); jh.join().unwrap(); tokrt.block_on(async { assert_eq!(wctx.wait_async().await, Err(Error::Aborted(State::Abort))); }); } // Trigger an abortion error after wait is called (hopefully). #[test] fn abort_after_wait() { let tokrt = tokio::runtime::Runtime::new().unwrap(); let (sctx, wctx) = mkpair::<(), State, ()>(); let jh = thread::spawn(move || { std::thread::sleep(std::time::Duration::from_millis(500)); let _sctx2 = sctx; }); tokrt.block_on(async { assert_eq!(wctx.wait_async().await, Err(Error::Aborted(State::Abort))); }); jh.join().unwrap(); } // Trigger a no-reply error before wait is called (hopefully). #[test] fn noreply_before_wait() { let tokrt = tokio::runtime::Runtime::new().unwrap(); let (sctx, wctx) = mkpair::<(), State, ()>(); let jh = thread::spawn(move || { sctx.set_state(State::NoReply).unwrap(); }); jh.join().unwrap(); tokrt.block_on(async { assert_eq!(wctx.wait_async().await, Err(Error::Aborted(State::NoReply))); }); } // Trigger an no-reply error after wait is called (hopefully). #[test] fn noreply_after_wait() { let tokrt = tokio::runtime::Runtime::new().unwrap(); let (sctx, wctx) = mkpair::<(), State, ()>(); let jh = thread::spawn(move || { sctx.set_state(State::NoReply).unwrap(); std::thread::sleep(std::time::Duration::from_millis(500)); }); tokrt.block_on(async { assert_eq!(wctx.wait_async().await, Err(Error::Aborted(State::NoReply))); }); jh.join().unwrap(); } // Trigger an no-reply error before wait is called (hopefully). #[test] fn apperr_before_wait() { let tokrt = tokio::runtime::Runtime::new().unwrap(); let (sctx, wctx) = mkpair::<(), State, &str>(); let jh = thread::spawn(move || { sctx.fail("yikes").unwrap(); }); jh.join().unwrap(); tokrt.block_on(async { assert_eq!(wctx.wait_async().await, Err(Error::App("yikes"))); }); } // Trigger an no-reply error after wait is called (hopefully). #[test] fn apperr_after_wait() { let tokrt = tokio::runtime::Runtime::new().unwrap(); let (sctx, wctx) = mkpair::<(), State, &str>(); let jh = thread::spawn(move || { std::thread::sleep(std::time::Duration::from_millis(500)); sctx.fail("yikes").unwrap(); }); tokrt.block_on(async { assert_eq!(wctx.wait_async().await, Err(Error::App("yikes"))); }); jh.join().unwrap(); } // vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :