extern crate futures; extern crate tokio_mock_task; extern crate tokio_sync; use futures::task::{self, Task}; use tokio_mock_task::*; use tokio_sync::task::AtomicTask; trait AssertSend: Send {} trait AssertSync: Send {} impl AssertSend for AtomicTask {} impl AssertSync for AtomicTask {} impl AssertSend for Task {} impl AssertSync for Task {} #[test] fn register_task() { // AtomicTask::register_task should *always* register the // arbitrary task. let atomic = AtomicTask::new(); let mut mock1 = MockTask::new(); let mut mock2 = MockTask::new(); // Register once... mock1.enter(|| atomic.register()); // Grab the actual 2nd task from the mock... let task2 = mock2.enter(task::current); // Now register the 2nd task, even though in the context where // the first task would be considered 'current'... { // Need a block to grab a reference, so that we only move // task2 into the closure, not the AtomicTask... let atomic = &atomic; mock1.enter(move || { atomic.register_task(task2); }); } // Just proving that they haven't been notified yet... assert!(!mock1.is_notified(), "mock1 shouldn't be notified yet"); assert!(!mock2.is_notified(), "mock2 shouldn't be notified yet"); // Now trigger the notify, and ensure it was task2 atomic.notify(); assert!(!mock1.is_notified(), "mock1 shouldn't be notified"); assert!(mock2.is_notified(), "mock2 should be notified"); }