Skip to content

Commit 8dc8b96

Browse files
cursoragentclaude
andcommitted
fix(cloudflare): Replace fixed delay with event-based envelope waiting in test
Replace the hardcoded 50ms setTimeout delay between requests with a proper event-based mechanism that waits for envelope delivery. This eliminates test flakiness by ensuring each envelope is actually received before proceeding to the next request, rather than relying on a fixed timeout that may be insufficient under CI load. Changes: - Add waitForEnvelopes() method to test runner that waits for a specific number of envelopes to be received - Update durableobject-spans test to use waitForEnvelopes() instead of setTimeout delays - Track envelope waiters in runner and resolve them when envelopes arrive Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent f77c6b1 commit 8dc8b96

2 files changed

Lines changed: 25 additions & 10 deletions

File tree

  • dev-packages/cloudflare-integration-tests

dev-packages/cloudflare-integration-tests/runner.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ type StartResult = {
5050
path: string,
5151
options?: { headers?: Record<string, string>; data?: BodyInit; expectError?: boolean },
5252
): Promise<T | undefined>;
53+
waitForEnvelopes(count: number): Promise<void>;
5354
};
5455

5556
/** Creates a test runner */
@@ -112,12 +113,23 @@ export function createRunner(...paths: string[]) {
112113
let child: ReturnType<typeof spawn> | undefined;
113114
let childSubWorker: ReturnType<typeof spawn> | undefined;
114115

116+
// Track promises waiting for specific envelope counts
117+
const envelopeWaiters: Array<{ count: number; resolve: () => void }> = [];
118+
115119
/** Called after each expect callback to check if we're complete */
116120
function expectCallbackCalled(): void {
117121
envelopeCount++;
118122
if (envelopeCount === expectedEnvelopeCount) {
119123
resolve();
120124
}
125+
126+
// Resolve any waiters that are waiting for this envelope count
127+
for (let i = envelopeWaiters.length - 1; i >= 0; i--) {
128+
if (envelopeCount >= envelopeWaiters[i].count) {
129+
envelopeWaiters[i].resolve();
130+
envelopeWaiters.splice(i, 1);
131+
}
132+
}
121133
}
122134

123135
function assertEnvelopeMatches(expected: Expected, envelope: Envelope): void {
@@ -308,6 +320,15 @@ export function createRunner(...paths: string[]) {
308320
return;
309321
}
310322
},
323+
waitForEnvelopes: async function (count: number): Promise<void> {
324+
if (envelopeCount >= count) {
325+
return Promise.resolve();
326+
}
327+
328+
return new Promise<void>(resolveWaiter => {
329+
envelopeWaiters.push({ count, resolve: resolveWaiter });
330+
});
331+
},
311332
};
312333
},
313334
};

dev-packages/cloudflare-integration-tests/suites/tracing/durableobject-spans/test.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,14 @@ it('sends child spans on repeated Durable Object calls', async ({ signal }) => {
4545
// Expect 5 transaction envelopes — one per call.
4646
const runner = createRunner(__dirname).expectN(5, assertDoWorkEnvelope).start(signal);
4747

48-
// Small delay between requests to allow waitUntil to process in wrangler dev.
49-
// This is needed because wrangler dev may not guarantee waitUntil completion
50-
// the same way production Cloudflare does. Without this delay, the last
51-
// envelope's HTTP request may not complete before the test moves on.
52-
const delay = () => new Promise(resolve => setTimeout(resolve, 50));
53-
5448
await runner.makeRequest('get', '/');
55-
await delay();
49+
await runner.waitForEnvelopes(1);
5650
await runner.makeRequest('get', '/');
57-
await delay();
51+
await runner.waitForEnvelopes(2);
5852
await runner.makeRequest('get', '/');
59-
await delay();
53+
await runner.waitForEnvelopes(3);
6054
await runner.makeRequest('get', '/');
61-
await delay();
55+
await runner.waitForEnvelopes(4);
6256
await runner.makeRequest('get', '/');
6357
await runner.completed();
6458
});

0 commit comments

Comments
 (0)