xref: /aosp_15_r20/external/crosvm/cros_async/tests/executor.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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 Worker fn 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 Worker fn 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 Worker fn 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 Worker fn 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