@@ -224,7 +224,7 @@ TEST_P(AsyncQueueTest, CanScheduleOprationsWithRespectsToShutdownState) {
224
224
EXPECT_EQ (steps, " 124" );
225
225
}
226
226
227
- TEST_P (AsyncQueueTest, RestrictedModeBlocksEnqueue ) {
227
+ TEST_P (AsyncQueueTest, RestrictedModePreventsEnqueue ) {
228
228
ASSERT_TRUE (queue->Enqueue ([&] {}));
229
229
ASSERT_TRUE (queue->EnqueueEvenWhileRestricted ([&] {}));
230
230
@@ -233,7 +233,7 @@ TEST_P(AsyncQueueTest, RestrictedModeBlocksEnqueue) {
233
233
ASSERT_TRUE (queue->EnqueueEvenWhileRestricted ([&] {}));
234
234
}
235
235
236
- TEST_P (AsyncQueueTest, DisposeBlocksAllEnqueues ) {
236
+ TEST_P (AsyncQueueTest, DisposePreventsAllEnqueues ) {
237
237
ASSERT_TRUE (queue->Enqueue ([&] {}));
238
238
ASSERT_TRUE (queue->EnqueueEvenWhileRestricted ([&] {}));
239
239
@@ -242,6 +242,42 @@ TEST_P(AsyncQueueTest, DisposeBlocksAllEnqueues) {
242
242
ASSERT_FALSE (queue->EnqueueEvenWhileRestricted ([&] {}));
243
243
}
244
244
245
+ TEST_P (AsyncQueueTest, DisposeDoesNotBlockEnqueueWhileWaiting) {
246
+ // Start a task that will block the queue. AsyncQueue::Dispose will block
247
+ // until this completes.
248
+ Expectation blocking_started;
249
+ Expectation blocking_complete;
250
+ queue->Enqueue ([&] {
251
+ blocking_started.Fulfill ();
252
+ Await (blocking_complete);
253
+ });
254
+
255
+ // Kick off Dispose--this will block while the task above is still running.
256
+ Await (blocking_started);
257
+ Expectation dispose_started;
258
+ Expectation dispose_complete;
259
+ Async ([&] {
260
+ dispose_started.Fulfill ();
261
+ queue->Dispose ();
262
+ dispose_complete.Fulfill ();
263
+ });
264
+
265
+ // Finally, try to enqueue while Dispose is blocked waiting for the first
266
+ // task to complete. This should not block.
267
+ Expectation enqueue_completed;
268
+ Expectation post_dispose;
269
+ Async ([&] {
270
+ Await (dispose_started);
271
+ bool enqueued = queue->Enqueue (post_dispose.AsCallback ());
272
+ ASSERT_FALSE (enqueued);
273
+ enqueue_completed.Fulfill ();
274
+ });
275
+
276
+ Await (enqueue_completed);
277
+ blocking_complete.Fulfill ();
278
+ Await (dispose_complete);
279
+ }
280
+
245
281
} // namespace util
246
282
} // namespace firestore
247
283
} // namespace firebase
0 commit comments