Skip to content

Commit 6bf1729

Browse files
committed
Add DeferredProxy coroutine cancellation test cases
1 parent 3e0386a commit 6bf1729

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

src/workerd/api/deferred-proxy-test.c++

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,5 +170,64 @@ KJ_TEST("kj::Promise<DeferredProxy<T>>: can be `co_await`ed from another corouti
170170
KJ_EXPECT(proxyTask.wait(waitScope) == 123);
171171
}
172172

173+
struct Counter {
174+
size_t& wind;
175+
size_t& unwind;
176+
Counter(size_t& wind, size_t& unwind): wind(wind), unwind(unwind) { ++wind; }
177+
~Counter() { ++unwind; }
178+
KJ_DISALLOW_COPY_AND_MOVE(Counter);
179+
};
180+
181+
kj::Promise<DeferredProxy<void>> cancellationTester(
182+
kj::Promise<void> preDeferredProxying,
183+
kj::Promise<void> postDeferredProxying,
184+
size_t& wind,
185+
size_t& unwind) {
186+
Counter preCounter(wind, unwind);
187+
co_await preDeferredProxying;
188+
KJ_CO_MAGIC BEGIN_DEFERRED_PROXYING;
189+
Counter postCounter(wind, unwind);
190+
co_await postDeferredProxying;
191+
};
192+
193+
KJ_TEST("kj::Promise<DeferredProxy<T>>: can be canceled while suspended before deferred proxying") {
194+
kj::EventLoop loop;
195+
kj::WaitScope waitScope(loop);
196+
197+
size_t wind = 0, unwind = 0;
198+
199+
{
200+
auto neverDone1 = kj::Promise<void>(kj::NEVER_DONE);
201+
auto neverDone2 = kj::Promise<void>(kj::NEVER_DONE);
202+
neverDone1 = neverDone1.attach(kj::heap<Counter>(wind, unwind));
203+
neverDone2 = neverDone2.attach(kj::heap<Counter>(wind, unwind));
204+
auto promise = cancellationTester(kj::mv(neverDone1), kj::mv(neverDone2), wind, unwind);
205+
KJ_EXPECT(!promise.poll(waitScope));
206+
}
207+
208+
KJ_EXPECT(wind == 3);
209+
KJ_EXPECT(unwind == 3);
210+
}
211+
212+
KJ_TEST("kj::Promise<DeferredProxy<T>>: can be canceled while suspended after deferred proxying") {
213+
kj::EventLoop loop;
214+
kj::WaitScope waitScope(loop);
215+
216+
size_t wind = 0, unwind = 0;
217+
218+
{
219+
auto readyNow = kj::Promise<void>(kj::READY_NOW);
220+
auto neverDone = kj::Promise<void>(kj::NEVER_DONE);
221+
readyNow = readyNow.attach(kj::heap<Counter>(wind, unwind));
222+
neverDone = neverDone.attach(kj::heap<Counter>(wind, unwind));
223+
auto promise = cancellationTester(kj::mv(readyNow), kj::mv(neverDone), wind, unwind);
224+
auto proxyTask = promise.wait(waitScope).proxyTask;
225+
KJ_EXPECT(!proxyTask.poll(waitScope));
226+
}
227+
228+
KJ_EXPECT(wind == 4);
229+
KJ_EXPECT(unwind == 4);
230+
}
231+
173232
} // namespace
174233
} // namespace workerd::api

0 commit comments

Comments
 (0)