tower_test/mock/
spawn.rs

1//! Spawn mock services onto a mock task.
2
3use std::task::Poll;
4use tokio_test::task;
5use tower_service::Service;
6
7/// Service spawned on a mock task
8#[derive(Debug)]
9pub struct Spawn<T> {
10    inner: T,
11    task: task::Spawn<()>,
12}
13
14impl<T> Spawn<T> {
15    /// Create a new spawn.
16    pub fn new(inner: T) -> Self {
17        Self {
18            inner,
19            task: task::spawn(()),
20        }
21    }
22
23    /// Check if this service has been woken up.
24    pub fn is_woken(&self) -> bool {
25        self.task.is_woken()
26    }
27
28    /// Get how many futurs are holding onto the waker.
29    pub fn waker_ref_count(&self) -> usize {
30        self.task.waker_ref_count()
31    }
32
33    /// Poll this service ready.
34    pub fn poll_ready<Request>(&mut self) -> Poll<Result<(), T::Error>>
35    where
36        T: Service<Request>,
37    {
38        let task = &mut self.task;
39        let inner = &mut self.inner;
40
41        task.enter(|cx, _| inner.poll_ready(cx))
42    }
43
44    /// Call the inner Service.
45    pub fn call<Request>(&mut self, req: Request) -> T::Future
46    where
47        T: Service<Request>,
48    {
49        self.inner.call(req)
50    }
51
52    /// Get the inner service.
53    pub fn into_inner(self) -> T {
54        self.inner
55    }
56
57    /// Get a reference to the inner service.
58    pub fn get_ref(&self) -> &T {
59        &self.inner
60    }
61
62    /// Get a mutable reference to the inner service.
63    pub fn get_mut(&mut self) -> &mut T {
64        &mut self.inner
65    }
66}
67
68impl<T: Clone> Clone for Spawn<T> {
69    fn clone(&self) -> Self {
70        Spawn::new(self.inner.clone())
71    }
72}