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