| #![cfg(feature = "unstable")] |
| use std::sync::Arc; |
| use std::time::Duration; |
| |
| use async_std::sync::{Condvar, Mutex}; |
| use async_std::task::{self, JoinHandle}; |
| |
| #[cfg(not(target_os = "unknown"))] |
| use async_std::task::spawn; |
| #[cfg(target_os = "unknown")] |
| use async_std::task::spawn_local as spawn; |
| |
| #[cfg(target_arch = "wasm32")] |
| wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); |
| |
| #[test] |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| fn wait_timeout_with_lock() { |
| task::block_on(async { |
| let pair = Arc::new((Mutex::new(false), Condvar::new())); |
| let pair2 = pair.clone(); |
| |
| spawn(async move { |
| let (m, c) = &*pair2; |
| let _g = m.lock().await; |
| task::sleep(Duration::from_millis(200)).await; |
| c.notify_one(); |
| }); |
| |
| let (m, c) = &*pair; |
| let (_, wait_result) = c |
| .wait_timeout(m.lock().await, Duration::from_millis(50)) |
| .await; |
| assert!(wait_result.timed_out()); |
| }) |
| } |
| |
| #[test] |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| fn wait_timeout_without_lock() { |
| task::block_on(async { |
| let m = Mutex::new(false); |
| let c = Condvar::new(); |
| |
| let (_, wait_result) = c |
| .wait_timeout(m.lock().await, Duration::from_millis(10)) |
| .await; |
| assert!(wait_result.timed_out()); |
| }) |
| } |
| |
| #[test] |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| fn wait_timeout_until_timed_out() { |
| task::block_on(async { |
| let m = Mutex::new(false); |
| let c = Condvar::new(); |
| |
| let (_, wait_result) = c |
| .wait_timeout_until(m.lock().await, Duration::from_millis(100), |&mut started| { |
| started |
| }) |
| .await; |
| assert!(wait_result.timed_out()); |
| }) |
| } |
| |
| #[test] |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| fn notify_all() { |
| task::block_on(async { |
| let mut tasks: Vec<JoinHandle<()>> = Vec::new(); |
| let pair = Arc::new((Mutex::new(0u32), Condvar::new())); |
| |
| for _ in 0..10 { |
| let pair = pair.clone(); |
| tasks.push(spawn(async move { |
| let (m, c) = &*pair; |
| let mut count = m.lock().await; |
| while *count == 0 { |
| count = c.wait(count).await; |
| } |
| *count += 1; |
| })); |
| } |
| |
| // Give some time for tasks to start up |
| task::sleep(Duration::from_millis(50)).await; |
| |
| let (m, c) = &*pair; |
| { |
| let mut count = m.lock().await; |
| *count += 1; |
| c.notify_all(); |
| } |
| |
| for t in tasks { |
| t.await; |
| } |
| let count = m.lock().await; |
| assert_eq!(11, *count); |
| }) |
| } |