Use run_until_parked instead of blocked in tests

This commit is contained in:
Conrad Irwin 2023-11-01 14:17:10 -06:00
parent 3f34a8e7ec
commit cd10ba9e06
4 changed files with 17 additions and 16 deletions

View file

@ -86,7 +86,20 @@ impl BackgroundExecutor {
Task::Spawned(task) Task::Spawned(task)
} }
#[cfg(any(test, feature = "test-support"))]
pub fn block_test<R>(&self, future: impl Future<Output = R>) -> R {
self.block_internal(false, future)
}
pub fn block<R>(&self, future: impl Future<Output = R>) -> R { pub fn block<R>(&self, future: impl Future<Output = R>) -> R {
self.block_internal(true, future)
}
pub(crate) fn block_internal<R>(
&self,
background_only: bool,
future: impl Future<Output = R>,
) -> R {
pin_mut!(future); pin_mut!(future);
let (parker, unparker) = parking::pair(); let (parker, unparker) = parking::pair();
let awoken = Arc::new(AtomicBool::new(false)); let awoken = Arc::new(AtomicBool::new(false));
@ -102,7 +115,7 @@ impl BackgroundExecutor {
match future.as_mut().poll(&mut cx) { match future.as_mut().poll(&mut cx) {
Poll::Ready(result) => return result, Poll::Ready(result) => return result,
Poll::Pending => { Poll::Pending => {
if !self.dispatcher.poll(true) { if !self.dispatcher.poll(background_only) {
if awoken.swap(false, SeqCst) { if awoken.swap(false, SeqCst) {
continue; continue;
} }
@ -184,7 +197,7 @@ impl BackgroundExecutor {
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
pub fn simulate_random_delay(&self) -> impl Future<Output = ()> { pub fn simulate_random_delay(&self) -> impl Future<Output = ()> {
self.spawn(self.dispatcher.as_test().unwrap().simulate_random_delay()) self.dispatcher.as_test().unwrap().simulate_random_delay()
} }
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]

View file

@ -28,7 +28,7 @@ pub fn run_test(
} }
let result = panic::catch_unwind(|| { let result = panic::catch_unwind(|| {
let dispatcher = TestDispatcher::new(StdRng::seed_from_u64(seed)); let dispatcher = TestDispatcher::new(StdRng::seed_from_u64(seed));
test_fn(dispatcher, seed); test_fn(dispatcher.clone(), seed);
}); });
match result { match result {

View file

@ -136,7 +136,7 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
&mut |dispatcher, _seed| { &mut |dispatcher, _seed| {
let executor = gpui2::BackgroundExecutor::new(std::sync::Arc::new(dispatcher.clone())); let executor = gpui2::BackgroundExecutor::new(std::sync::Arc::new(dispatcher.clone()));
#cx_vars #cx_vars
executor.block(#inner_fn_name(#inner_fn_args)); executor.block_test(#inner_fn_name(#inner_fn_args));
#cx_teardowns #cx_teardowns
}, },
#on_failure_fn_name, #on_failure_fn_name,

View file

@ -2942,7 +2942,6 @@ async fn test_buffer_deduping(cx: &mut gpui2::TestAppContext) {
#[gpui2::test] #[gpui2::test]
async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) { async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
init_test(cx); init_test(cx);
dbg!("GAH");
let fs = FakeFs::new(cx.executor().clone()); let fs = FakeFs::new(cx.executor().clone());
fs.insert_tree( fs.insert_tree(
@ -2954,7 +2953,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
}), }),
) )
.await; .await;
dbg!("NOOP");
let project = Project::test(fs.clone(), ["/dir".as_ref()], cx).await; let project = Project::test(fs.clone(), ["/dir".as_ref()], cx).await;
@ -2964,8 +2962,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
.unwrap(); .unwrap();
let events = Arc::new(Mutex::new(Vec::new())); let events = Arc::new(Mutex::new(Vec::new()));
dbg!("BOOP");
// initially, the buffer isn't dirty. // initially, the buffer isn't dirty.
buffer1.update(cx, |buffer, cx| { buffer1.update(cx, |buffer, cx| {
cx.subscribe(&buffer1, { cx.subscribe(&buffer1, {
@ -2982,7 +2978,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
buffer.edit([(1..2, "")], None, cx); buffer.edit([(1..2, "")], None, cx);
}); });
dbg!("ADSASD");
// after the first edit, the buffer is dirty, and emits a dirtied event. // after the first edit, the buffer is dirty, and emits a dirtied event.
buffer1.update(cx, |buffer, cx| { buffer1.update(cx, |buffer, cx| {
@ -3000,7 +2995,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
cx, cx,
); );
}); });
dbg!("1111");
// after saving, the buffer is not dirty, and emits a saved event. // after saving, the buffer is not dirty, and emits a saved event.
buffer1.update(cx, |buffer, cx| { buffer1.update(cx, |buffer, cx| {
@ -3012,8 +3006,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
buffer.edit([(2..2, "D")], None, cx); buffer.edit([(2..2, "D")], None, cx);
}); });
dbg!("5555555");
// after editing again, the buffer is dirty, and emits another dirty event. // after editing again, the buffer is dirty, and emits another dirty event.
buffer1.update(cx, |buffer, cx| { buffer1.update(cx, |buffer, cx| {
assert!(buffer.text() == "aBDc"); assert!(buffer.text() == "aBDc");
@ -3035,7 +3027,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
assert!(!buffer.is_dirty()); assert!(!buffer.is_dirty());
}); });
dbg!("666666");
assert_eq!( assert_eq!(
*events.lock(), *events.lock(),
&[language2::Event::Edited, language2::Event::DirtyChanged] &[language2::Event::Edited, language2::Event::DirtyChanged]
@ -3055,8 +3046,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
.detach(); .detach();
}); });
dbg!("0000000");
fs.remove_file("/dir/file2".as_ref(), Default::default()) fs.remove_file("/dir/file2".as_ref(), Default::default())
.await .await
.unwrap(); .unwrap();
@ -3084,7 +3073,6 @@ async fn test_buffer_is_dirty(cx: &mut gpui2::TestAppContext) {
.detach(); .detach();
}); });
dbg!(";;;;;;");
buffer3.update(cx, |buffer, cx| { buffer3.update(cx, |buffer, cx| {
buffer.edit([(0..0, "x")], None, cx); buffer.edit([(0..0, "x")], None, cx);
}); });