1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker use cros_async::sys::ExecutorKindSys; 6*bb4ee6a4SAndroid Build Coastguard Worker use cros_async::Executor; 7*bb4ee6a4SAndroid Build Coastguard Worker use cros_async::ExecutorKind; 8*bb4ee6a4SAndroid Build Coastguard Worker 9*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] all_kinds() -> Vec<ExecutorKind>10*bb4ee6a4SAndroid Build Coastguard Workerfn all_kinds() -> Vec<ExecutorKind> { 11*bb4ee6a4SAndroid Build Coastguard Worker let mut kinds = vec![ExecutorKindSys::Fd.into()]; 12*bb4ee6a4SAndroid Build Coastguard Worker if cros_async::is_uring_stable() { 13*bb4ee6a4SAndroid Build Coastguard Worker kinds.push(ExecutorKindSys::Uring.into()); 14*bb4ee6a4SAndroid Build Coastguard Worker } 15*bb4ee6a4SAndroid Build Coastguard Worker kinds 16*bb4ee6a4SAndroid Build Coastguard Worker } 17*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(windows)] all_kinds() -> Vec<ExecutorKind>18*bb4ee6a4SAndroid Build Coastguard Workerfn all_kinds() -> Vec<ExecutorKind> { 19*bb4ee6a4SAndroid Build Coastguard Worker vec![ExecutorKindSys::Handle.into()] 20*bb4ee6a4SAndroid Build Coastguard Worker } 21*bb4ee6a4SAndroid Build Coastguard Worker 22*bb4ee6a4SAndroid Build Coastguard Worker #[test] cancel_pending_task()23*bb4ee6a4SAndroid Build Coastguard Workerfn cancel_pending_task() { 24*bb4ee6a4SAndroid Build Coastguard Worker for kind in all_kinds() { 25*bb4ee6a4SAndroid Build Coastguard Worker let ex = Executor::with_executor_kind(kind).unwrap(); 26*bb4ee6a4SAndroid Build Coastguard Worker let task = ex.spawn(std::future::pending::<()>()); 27*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(ex.run_until(task.cancel()).unwrap(), None); 28*bb4ee6a4SAndroid Build Coastguard Worker } 29*bb4ee6a4SAndroid Build Coastguard Worker } 30*bb4ee6a4SAndroid Build Coastguard Worker 31*bb4ee6a4SAndroid Build Coastguard Worker // Testing a completed task without relying on implementation details is tricky. We create a future 32*bb4ee6a4SAndroid Build Coastguard Worker // that signals a channel when it is polled so that we can delay the `task.cancel()` call until we 33*bb4ee6a4SAndroid Build Coastguard Worker // know the task has been executed. 34*bb4ee6a4SAndroid Build Coastguard Worker #[test] cancel_ready_task()35*bb4ee6a4SAndroid Build Coastguard Workerfn cancel_ready_task() { 36*bb4ee6a4SAndroid Build Coastguard Worker for kind in all_kinds() { 37*bb4ee6a4SAndroid Build Coastguard Worker let ex = Executor::with_executor_kind(kind).unwrap(); 38*bb4ee6a4SAndroid Build Coastguard Worker let (s, r) = futures::channel::oneshot::channel(); 39*bb4ee6a4SAndroid Build Coastguard Worker let mut s = Some(s); 40*bb4ee6a4SAndroid Build Coastguard Worker let task = ex.spawn(futures::future::poll_fn(move |_| { 41*bb4ee6a4SAndroid Build Coastguard Worker s.take().unwrap().send(()).unwrap(); 42*bb4ee6a4SAndroid Build Coastguard Worker std::task::Poll::Ready(5) 43*bb4ee6a4SAndroid Build Coastguard Worker })); 44*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!( 45*bb4ee6a4SAndroid Build Coastguard Worker ex.run_until(async { 46*bb4ee6a4SAndroid Build Coastguard Worker r.await.unwrap(); 47*bb4ee6a4SAndroid Build Coastguard Worker task.cancel().await 48*bb4ee6a4SAndroid Build Coastguard Worker }) 49*bb4ee6a4SAndroid Build Coastguard Worker .unwrap(), 50*bb4ee6a4SAndroid Build Coastguard Worker Some(5) 51*bb4ee6a4SAndroid Build Coastguard Worker ); 52*bb4ee6a4SAndroid Build Coastguard Worker } 53*bb4ee6a4SAndroid Build Coastguard Worker } 54