Skip to content

Commit 8ca108e

Browse files
committed
test(runtime-host): assert late owned cleanup releases instead of settling
The adopt regression only checked that the late pid stayed alive. Wrap the delivered candidate so a settle() cleanup cannot pass that check and kill the adopted host after the assertion. Fixes #3190
1 parent 1116963 commit 8ca108e

1 file changed

Lines changed: 23 additions & 16 deletions

File tree

packages/runtime-host/src/__tests__/owned-candidate.test.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ test('owned connect returns a missed election without waiting for a late candida
9595

9696
assert.ok(launched >= 1, 'launchCandidate must run before the election ends');
9797
assert.equal(result.kind, 'failed');
98-
assert.equal(ownedConnectFailure(result), 'failed:startup_timeout');
98+
assert.equal(connectFailure(result), 'failed:startup_timeout');
9999
assert.equal(spawnedSettled, false);
100100

101101
resolveSpawned({
@@ -156,7 +156,7 @@ test('a late owned candidate stays alive after another client adopts it', {
156156
);
157157

158158
assert.equal(missed.kind, 'failed');
159-
assert.equal(ownedConnectFailure(missed), 'failed:startup_timeout');
159+
assert.equal(connectFailure(missed), 'failed:startup_timeout');
160160

161161
const host = await waitForDefined(
162162
() => launchedHost,
@@ -184,12 +184,26 @@ test('a late owned candidate stays alive after another client adopts it', {
184184
);
185185

186186
try {
187-
assert.equal(adopted.kind, 'connected', adoptedConnectFailure(adopted));
187+
assert.equal(adopted.kind, 'connected', connectFailure(adopted));
188188
if (adopted.kind !== 'connected') return;
189189

190+
let released = 0;
191+
let settled = 0;
190192
lateDelivered = true;
191-
resolveLate(host);
193+
resolveLate({
194+
...host,
195+
releaseToEnvironment() {
196+
released += 1;
197+
host.releaseToEnvironment();
198+
},
199+
async settle(timeoutMs) {
200+
settled += 1;
201+
return host.settle(timeoutMs);
202+
},
203+
});
192204
await lateSpawned;
205+
assert.equal(released, 1);
206+
assert.equal(settled, 0);
193207

194208
const diagnostics = await adopted.connection.queryHostDiagnostics();
195209
assert.equal(diagnostics.pid, host.pid);
@@ -222,7 +236,7 @@ test('owned Host exits promptly after its first connection closes', async () =>
222236
{ launchCandidate: launchOwnedRuntimeHostCandidate },
223237
);
224238

225-
assert.equal(result.kind, 'connected', ownedConnectFailure(result));
239+
assert.equal(result.kind, 'connected', connectFailure(result));
226240
if (result.kind !== 'connected') return;
227241
await result.connection.close();
228242
assert.equal(await result.host.settle(500), true);
@@ -298,17 +312,10 @@ test('pre-cancelled hosted execution does not start a Runtime Host', async () =>
298312
assert.deepEqual(await readdir(rootPath), []);
299313
});
300314

301-
function ownedConnectFailure(
302-
result: Awaited<ReturnType<typeof connectOwnedRuntimeHostWithDependencies>>,
303-
): string {
304-
if (result.kind === 'connected') return 'connected';
305-
if (result.kind === 'failed') return `failed:${result.reason}`;
306-
if (result.kind === 'upgrade_required') return 'upgrade_required';
307-
return `incompatible:${result.handshake.replacement}`;
308-
}
309-
310-
function adoptedConnectFailure(
311-
result: Awaited<ReturnType<typeof connectOrSpawnRuntimeHostWithDependencies>>,
315+
function connectFailure(
316+
result:
317+
| Awaited<ReturnType<typeof connectOwnedRuntimeHostWithDependencies>>
318+
| Awaited<ReturnType<typeof connectOrSpawnRuntimeHostWithDependencies>>,
312319
): string {
313320
if (result.kind === 'connected') return 'connected';
314321
if (result.kind === 'failed') return `failed:${result.reason}`;

0 commit comments

Comments
 (0)