From 7c0a6d6488ed11d1d9d8141e8692184ade447e1c Mon Sep 17 00:00:00 2001 From: Eunchong Yu Date: Fri, 21 Sep 2018 22:48:38 +0900 Subject: [PATCH] Add test about UnsafeFutureObj::into_raw for Pin> --- src/liballoc/boxed_test.rs | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/liballoc/boxed_test.rs b/src/liballoc/boxed_test.rs index 55995742a4a7d..d048446008a76 100644 --- a/src/liballoc/boxed_test.rs +++ b/src/liballoc/boxed_test.rs @@ -16,6 +16,10 @@ use core::result::Result::{Err, Ok}; use core::clone::Clone; use core::f64; use core::i64; +use core::future::{Future, FutureObj}; +use core::pin::Pin; +use core::sync::atomic::{AtomicBool, Ordering}; +use core::task::{self, Poll}; use std::boxed::Box; @@ -140,3 +144,39 @@ fn str_slice() { let boxed: Box = Box::from(s); assert_eq!(&*boxed, s) } + +struct Drops<'a>(&'a AtomicBool); + +impl<'a> Drop for Drops<'a> { + fn drop(&mut self) { + self.0.store(true, Ordering::SeqCst); + } +} + +impl<'a> Future for Drops<'a> { + type Output = (); + + fn poll(self: Pin<&mut Self>, _cx: &mut task::Context) -> Poll<()> { + Poll::Ready(()) + } +} + +#[test] +fn unsafe_future_obj_into_raw() { + let dropped = AtomicBool::new(false); + let drop_box = Box::new(Drops(&dropped)); + let future_obj: FutureObj<'_, _> = drop_box.into(); + assert!(!dropped.load(Ordering::SeqCst), "boxed value should not be dropped"); + drop(future_obj); + assert!(dropped.load(Ordering::SeqCst), "boxed value should be dropped"); +} + +#[test] +fn unsafe_future_obj_into_raw_pinned() { + let dropped = AtomicBool::new(false); + let drop_box = Box::pinned(Drops(&dropped)); + let future_obj: FutureObj<'_, _> = drop_box.into(); + assert!(!dropped.load(Ordering::SeqCst), "pinned value should not be dropped"); + drop(future_obj); + assert!(dropped.load(Ordering::SeqCst), "pinned value should be dropped"); +}