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
letchild: ReturnType<typeofspawn>|undefined;
113114
letchildSubWorker: ReturnType<typeofspawn>|undefined;
114115

116+
// Track promises waiting for specific envelope counts
117+
constenvelopeWaiters: Array<{count: number;resolve: ()=>void}>=[];
118+
115119
/** Called after each expect callback to check if we're complete */
116120
functionexpectCallbackCalled(): void{
117121
envelopeCount++;
118122
if(envelopeCount===expectedEnvelopeCount){
119123
resolve();
120124
}
125+
126+
// Resolve any waiters that are waiting for this envelope count
127+
for(leti=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
functionassertEnvelopeMatches(expected: Expected,envelope: Envelope): void{
@@ -308,6 +320,15 @@ export function createRunner(...paths: string[]) {
308320
return;
309321
}
310322
},
323+
waitForEnvelopes: asyncfunction(count: number): Promise<void>{
324+
if(envelopeCount>=count){
325+
returnPromise.resolve();
326+
}
327+
328+
returnnewPromise<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
construnner=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-
constdelay=()=>newPromise(resolve=>setTimeout(resolve,50));
53-
5448
awaitrunner.makeRequest('get','/');
55-
awaitdelay();
49+
awaitrunner.waitForEnvelopes(1);
5650
awaitrunner.makeRequest('get','/');
57-
awaitdelay();
51+
awaitrunner.waitForEnvelopes(2);
5852
awaitrunner.makeRequest('get','/');
59-
awaitdelay();
53+
awaitrunner.waitForEnvelopes(3);
6054
awaitrunner.makeRequest('get','/');
61-
awaitdelay();
55+
awaitrunner.waitForEnvelopes(4);
6256
awaitrunner.makeRequest('get','/');
6357
awaitrunner.completed();
6458
});

0 commit comments

Comments
 (0)