Skip to content

Commit 1d593d9

Browse files
committed
fix(ct): correctly work in headless mode
1 parent ac8ae06 commit 1d593d9

4 files changed

Lines changed: 36 additions & 15 deletions

File tree

src/runner/browser-env/vite/browser-modules/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,11 @@ export interface WorkerRunRunnablePayload {
8080
fullTitle: string;
8181
}
8282

83+
export type WorkerInitializeCb = (err: null | Error) => void;
8384
export type WorkerRunRunnableCb = (...args: [null | ViteError[]]) => void;
8485

8586
export interface WorkerViteEvents {
86-
[WorkerEventNames.initialize]: (payload: WorkerInitializePayload) => void;
87+
[WorkerEventNames.initialize]: (payload: WorkerInitializePayload, cb: WorkerInitializeCb) => void;
8788
[WorkerEventNames.finalize]: () => void;
8889
[WorkerEventNames.runRunnable]: (payload: WorkerRunRunnablePayload, cb: WorkerRunRunnableCb) => void;
8990
}

src/runner/browser-env/vite/socket.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,17 @@ function handleWorkerEvents(
6666
socket: Socket<ClientViteEvents, ViteClientEvents>,
6767
io: Server<ClientViteEvents, ViteClientEvents>,
6868
): void {
69-
socket.on(WorkerEventNames.initialize, payload => {
70-
const { runUuid } = socket.handshake.auth;
71-
socket.join(runUuid);
69+
socket.on(WorkerEventNames.initialize, (payload, cb) => {
70+
try {
71+
const { runUuid } = socket.handshake.auth;
72+
socket.join(runUuid);
7273

73-
WORKER_ENV_BY_RUN_UUID.set(runUuid, payload);
74+
WORKER_ENV_BY_RUN_UUID.set(runUuid, payload);
75+
76+
cb(null);
77+
} catch (err) {
78+
cb(prepareError(err as Error));
79+
}
7480
});
7581

7682
socket.on(WorkerEventNames.finalize, () => {

src/worker/browser-env/runner/test-runner/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
BRO_INIT_TIMEOUT_ON_RECONNECT,
1414
BRO_INIT_INTERVAL_ON_RECONNECT,
1515
} from "./constants";
16-
import { VITE_RUN_UUID_ROUTE } from "../../../../runner/browser-env/vite/constants";
16+
import { SOCKET_MAX_TIMEOUT, VITE_RUN_UUID_ROUTE } from "../../../../runner/browser-env/vite/constants";
1717
import * as logger from "../../../../utils/logger";
1818
import RuntimeConfig from "../../../../config/runtime-config";
1919
import { AbortOnReconnectError } from "../../../../errors/abort-on-reconnect-error";
@@ -191,7 +191,7 @@ export class TestRunner extends NodejsEnvTestRunner {
191191
this._handleRunExpectMatcher(browser, expectMatchers),
192192
);
193193

194-
this._socket.emit(WorkerEventNames.initialize, {
194+
const err = (await this._socket.timeout(SOCKET_MAX_TIMEOUT).emitWithAck(WorkerEventNames.initialize, {
195195
file: this._file,
196196
sessionId: this._runOpts.sessionId,
197197
capabilities: this._runOpts.sessionCaps,
@@ -201,7 +201,11 @@ export class TestRunner extends NodejsEnvTestRunner {
201201
customCommands: browser.customCommands,
202202
config: this._config as BrowserConfig,
203203
expectMatchers: Object.getOwnPropertyNames(expectMatchers),
204-
});
204+
})) as null | Error;
205+
206+
if (err) {
207+
throw err;
208+
}
205209

206210
await history.runGroup(
207211
{

test/src/worker/browser-env/runner/test-runner/index.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ describe("worker/browser-env/runner/test-runner", () => {
152152

153153
const mkSocket_ = (): WorkerViteSocket => {
154154
const socket = new EventEmitter() as unknown as WorkerViteSocket;
155-
socket.emitWithAck = sandbox.stub().resolves([null]);
155+
socket.emitWithAck = sandbox.stub().onFirstCall().resolves(null).onSecondCall().resolves([null]);
156+
156157
socket.timeout = sandbox.stub().returnsThis();
157158

158159
sinon.spy(socket, "on");
@@ -362,7 +363,7 @@ describe("worker/browser-env/runner/test-runner", () => {
362363
...runOpts,
363364
});
364365

365-
assert.calledWith(socket.emit as SinonStub, WorkerEventNames.initialize, {
366+
assert.calledWith(socket.emitWithAck as SinonStub, WorkerEventNames.initialize, {
366367
file,
367368
sessionId: runOpts.sessionId,
368369
capabilities: runOpts.sessionCaps,
@@ -373,6 +374,19 @@ describe("worker/browser-env/runner/test-runner", () => {
373374
});
374375
});
375376

377+
it("should throw if master return error", async () => {
378+
const socket = mkSocket_();
379+
const err = new Error("o.O");
380+
(socket.emitWithAck as SinonStub).onFirstCall().resolves(err);
381+
socketClientStub.returns(socket);
382+
383+
const runner = mkRunner_({ file: "/some/file" });
384+
const browser = mkBrowser_();
385+
(BrowserAgent.prototype.getBrowser as SinonStub).resolves(browser);
386+
387+
await assert.isRejected(run_({ runner }), /o.O/);
388+
});
389+
376390
it(`should emit before open url`, async () => {
377391
const socket = mkSocket_();
378392
socketClientStub.returns(socket);
@@ -386,7 +400,7 @@ describe("worker/browser-env/runner/test-runner", () => {
386400
await runWithEmitBrowserInit(socket, { runner });
387401

388402
assert.callOrder(
389-
(socket.emit as SinonStub).withArgs(WorkerEventNames.initialize, sinon.match.any),
403+
(socket.emitWithAck as SinonStub).withArgs(WorkerEventNames.initialize, sinon.match.any),
390404
browser.publicAPI.url as SinonStub,
391405
);
392406
});
@@ -425,8 +439,6 @@ describe("worker/browser-env/runner/test-runner", () => {
425439
const promise = run_();
426440
await clock.tickAsync(1);
427441
socket.emit(BrowserEventNames.initialize, []);
428-
429-
await clock.tickAsync(1);
430442
socket.emit(BrowserEventNames.reconnect);
431443

432444
await clock.runToLastAsync();
@@ -447,8 +459,6 @@ describe("worker/browser-env/runner/test-runner", () => {
447459
const promise = run_();
448460
await clock.tickAsync(1);
449461
socket.emit(BrowserEventNames.initialize, []);
450-
451-
await clock.tickAsync(1);
452462
socket.emit(BrowserEventNames.reconnect);
453463
socket.emit(BrowserEventNames.initialize, [error]);
454464

0 commit comments

Comments
 (0)