1 use futures::future::FutureExt;
2 use std::alloc::Layout;
3 use std::future::Future;
4 use std::pin::Pin;
5 use std::task::{Context, Poll};
6 use tokio_util::sync::ReusableBoxFuture;
7 
8 #[test]
test_different_futures()9 fn test_different_futures() {
10     let fut = async move { 10 };
11     // Not zero sized!
12     assert_eq!(Layout::for_value(&fut).size(), 1);
13 
14     let mut b = ReusableBoxFuture::new(fut);
15 
16     assert_eq!(b.get_pin().now_or_never(), Some(10));
17 
18     b.try_set(async move { 20 })
19         .unwrap_or_else(|_| panic!("incorrect size"));
20 
21     assert_eq!(b.get_pin().now_or_never(), Some(20));
22 
23     b.try_set(async move { 30 })
24         .unwrap_or_else(|_| panic!("incorrect size"));
25 
26     assert_eq!(b.get_pin().now_or_never(), Some(30));
27 }
28 
29 #[test]
test_different_sizes()30 fn test_different_sizes() {
31     let fut1 = async move { 10 };
32     let val = [0u32; 1000];
33     let fut2 = async move { val[0] };
34     let fut3 = ZeroSizedFuture {};
35 
36     assert_eq!(Layout::for_value(&fut1).size(), 1);
37     assert_eq!(Layout::for_value(&fut2).size(), 4004);
38     assert_eq!(Layout::for_value(&fut3).size(), 0);
39 
40     let mut b = ReusableBoxFuture::new(fut1);
41     assert_eq!(b.get_pin().now_or_never(), Some(10));
42     b.set(fut2);
43     assert_eq!(b.get_pin().now_or_never(), Some(0));
44     b.set(fut3);
45     assert_eq!(b.get_pin().now_or_never(), Some(5));
46 }
47 
48 struct ZeroSizedFuture {}
49 impl Future for ZeroSizedFuture {
50     type Output = u32;
poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<u32>51     fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<u32> {
52         Poll::Ready(5)
53     }
54 }
55 
56 #[test]
test_zero_sized()57 fn test_zero_sized() {
58     let fut = ZeroSizedFuture {};
59     // Zero sized!
60     assert_eq!(Layout::for_value(&fut).size(), 0);
61 
62     let mut b = ReusableBoxFuture::new(fut);
63 
64     assert_eq!(b.get_pin().now_or_never(), Some(5));
65     assert_eq!(b.get_pin().now_or_never(), Some(5));
66 
67     b.try_set(ZeroSizedFuture {})
68         .unwrap_or_else(|_| panic!("incorrect size"));
69 
70     assert_eq!(b.get_pin().now_or_never(), Some(5));
71     assert_eq!(b.get_pin().now_or_never(), Some(5));
72 }
73