forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![warn(rust_2018_idioms)]
 | |
| #![cfg(feature = "full")]
 | |
| 
 | |
| use tokio::time::*;
 | |
| 
 | |
| use std::sync::mpsc;
 | |
| 
 | |
| #[cfg(all(feature = "rt-multi-thread", not(tokio_wasi)))] // Wasi doesn't support threads
 | |
| #[test]
 | |
| fn timer_with_threaded_runtime() {
 | |
|     use tokio::runtime::Runtime;
 | |
| 
 | |
|     let rt = Runtime::new().unwrap();
 | |
|     let (tx, rx) = mpsc::channel();
 | |
| 
 | |
|     rt.spawn(async move {
 | |
|         let when = Instant::now() + Duration::from_millis(10);
 | |
| 
 | |
|         sleep_until(when).await;
 | |
|         assert!(Instant::now() >= when);
 | |
| 
 | |
|         tx.send(()).unwrap();
 | |
|     });
 | |
| 
 | |
|     rx.recv().unwrap();
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn timer_with_current_thread_scheduler() {
 | |
|     use tokio::runtime::Builder;
 | |
| 
 | |
|     let rt = Builder::new_current_thread().enable_all().build().unwrap();
 | |
|     let (tx, rx) = mpsc::channel();
 | |
| 
 | |
|     rt.block_on(async move {
 | |
|         let when = Instant::now() + Duration::from_millis(10);
 | |
| 
 | |
|         sleep_until(when).await;
 | |
|         assert!(Instant::now() >= when);
 | |
| 
 | |
|         tx.send(()).unwrap();
 | |
|     });
 | |
| 
 | |
|     rx.recv().unwrap();
 | |
| }
 | |
| 
 | |
| #[tokio::test]
 | |
| async fn starving() {
 | |
|     use std::future::Future;
 | |
|     use std::pin::Pin;
 | |
|     use std::task::{Context, Poll};
 | |
| 
 | |
|     struct Starve<T: Future<Output = ()> + Unpin>(T, u64);
 | |
| 
 | |
|     impl<T: Future<Output = ()> + Unpin> Future for Starve<T> {
 | |
|         type Output = u64;
 | |
| 
 | |
|         fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<u64> {
 | |
|             if Pin::new(&mut self.0).poll(cx).is_ready() {
 | |
|                 return Poll::Ready(self.1);
 | |
|             }
 | |
| 
 | |
|             self.1 += 1;
 | |
| 
 | |
|             cx.waker().wake_by_ref();
 | |
| 
 | |
|             Poll::Pending
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     let when = Instant::now() + Duration::from_millis(10);
 | |
|     let starve = Starve(Box::pin(sleep_until(when)), 0);
 | |
| 
 | |
|     starve.await;
 | |
|     assert!(Instant::now() >= when);
 | |
| }
 | |
| 
 | |
| #[tokio::test]
 | |
| async fn timeout_value() {
 | |
|     use tokio::sync::oneshot;
 | |
| 
 | |
|     let (_tx, rx) = oneshot::channel::<()>();
 | |
| 
 | |
|     let now = Instant::now();
 | |
|     let dur = Duration::from_millis(10);
 | |
| 
 | |
|     let res = timeout(dur, rx).await;
 | |
|     assert!(res.is_err());
 | |
|     assert!(Instant::now() >= now + dur);
 | |
| }
 | 
