forked from mirrors/gecko-dev
		
	 46156fb100
			
		
	
	
		46156fb100
		
	
	
	
	
		
			
			At the same time, update mdns_service to socket2 0.4 to avoid a duplicate. Differential Revision: https://phabricator.services.mozilla.com/D147479
		
			
				
	
	
		
			72 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use futures::future::FutureExt;
 | |
| use std::alloc::Layout;
 | |
| use std::future::Future;
 | |
| use std::pin::Pin;
 | |
| use std::task::{Context, Poll};
 | |
| use tokio_util::sync::ReusableBoxFuture;
 | |
| 
 | |
| #[test]
 | |
| fn test_different_futures() {
 | |
|     let fut = async move { 10 };
 | |
|     // Not zero sized!
 | |
|     assert_eq!(Layout::for_value(&fut).size(), 1);
 | |
| 
 | |
|     let mut b = ReusableBoxFuture::new(fut);
 | |
| 
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(10));
 | |
| 
 | |
|     b.try_set(async move { 20 })
 | |
|         .unwrap_or_else(|_| panic!("incorrect size"));
 | |
| 
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(20));
 | |
| 
 | |
|     b.try_set(async move { 30 })
 | |
|         .unwrap_or_else(|_| panic!("incorrect size"));
 | |
| 
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(30));
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_different_sizes() {
 | |
|     let fut1 = async move { 10 };
 | |
|     let val = [0u32; 1000];
 | |
|     let fut2 = async move { val[0] };
 | |
|     let fut3 = ZeroSizedFuture {};
 | |
| 
 | |
|     assert_eq!(Layout::for_value(&fut1).size(), 1);
 | |
|     assert_eq!(Layout::for_value(&fut2).size(), 4004);
 | |
|     assert_eq!(Layout::for_value(&fut3).size(), 0);
 | |
| 
 | |
|     let mut b = ReusableBoxFuture::new(fut1);
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(10));
 | |
|     b.set(fut2);
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(0));
 | |
|     b.set(fut3);
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(5));
 | |
| }
 | |
| 
 | |
| struct ZeroSizedFuture {}
 | |
| impl Future for ZeroSizedFuture {
 | |
|     type Output = u32;
 | |
|     fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<u32> {
 | |
|         Poll::Ready(5)
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_zero_sized() {
 | |
|     let fut = ZeroSizedFuture {};
 | |
|     // Zero sized!
 | |
|     assert_eq!(Layout::for_value(&fut).size(), 0);
 | |
| 
 | |
|     let mut b = ReusableBoxFuture::new(fut);
 | |
| 
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(5));
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(5));
 | |
| 
 | |
|     b.try_set(ZeroSizedFuture {})
 | |
|         .unwrap_or_else(|_| panic!("incorrect size"));
 | |
| 
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(5));
 | |
|     assert_eq!(b.get_pin().now_or_never(), Some(5));
 | |
| }
 |