From f9322ba78a2c1e6d57308ccc8769a8a1fd03dbb9 Mon Sep 17 00:00:00 2001 From: Manos Konstantinidis Date: Tue, 30 Nov 2021 15:40:33 +0000 Subject: [PATCH 1/2] chore: Spin up Web Socket server in a child process --- lib/cli/run.ts | 11 +++++++++-- scripts/websocket-server.js | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 scripts/websocket-server.js diff --git a/lib/cli/run.ts b/lib/cli/run.ts index b21df322..2cfa7e22 100644 --- a/lib/cli/run.ts +++ b/lib/cli/run.ts @@ -5,7 +5,6 @@ import { CliRunOptions, Config } from '../types'; import { generateReport } from '../report'; import { getConfig } from './config'; import { Logger } from '../logger'; -import { startWebSocketServer } from '../websocket'; export const runIOS = async (config: Config, logger: Logger) => { const stdio = config.debug ? 'inherit' : 'ignore'; @@ -73,7 +72,13 @@ export const runHandler = async (args: CliRunOptions) => { const runProject = args.platform === 'ios' ? runIOS : runAndroid; logger.print(`[OWL] Starting websocket server.`); - await startWebSocketServer(logger); + const webSocketProcess = execa.command('node scripts/websocket-server.js', { + stdio: 'inherit', + cwd: path.join(__dirname, '..', '..'), + env: { + OWL_DEBUG: String(!!config.debug), + }, + }); logger.print(`[OWL] Running tests on ${args.platform}.`); await runProject(config, logger); @@ -107,6 +112,8 @@ export const runHandler = async (args: CliRunOptions) => { } throw err; + } finally { + webSocketProcess.kill(); } logger.print(`[OWL] Tests completed on ${args.platform}.`); diff --git a/scripts/websocket-server.js b/scripts/websocket-server.js new file mode 100644 index 00000000..36a44142 --- /dev/null +++ b/scripts/websocket-server.js @@ -0,0 +1,14 @@ +const { startWebSocketServer } = require('../dist/websocket'); +const { Logger } = require('../dist/logger'); + +const debug = process.env.OWL_DEBUG === 'true'; +const logger = new Logger(!!debug); + +(async function () { + try { + await startWebSocketServer(logger); + } catch (e) { + logger.error(`[OWL] Websocket server failed to start: ${e}`); + process.exit(1); + } +})(); From e85453bcdef12e061943fffeec81674b8bd07391 Mon Sep 17 00:00:00 2001 From: Rob Walker Date: Wed, 1 Dec 2021 09:27:42 +0000 Subject: [PATCH 2/2] Update tests to handle starting websockets in child process --- lib/cli/run.test.ts | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/lib/cli/run.test.ts b/lib/cli/run.test.ts index cfdc2e8c..479b89a7 100644 --- a/lib/cli/run.test.ts +++ b/lib/cli/run.test.ts @@ -6,23 +6,22 @@ import { Logger } from '../logger'; import * as configHelpers from './config'; import * as run from './run'; import * as reportHelpers from '../report'; -import * as websocketHelpers from '../websocket'; describe('run.ts', () => { const logger = new Logger(); const bundleIdIOS = 'org.reactjs.native.example.RNDemo'; const mockBundleIdResponse = { stdout: bundleIdIOS } as ExecaReturnValue; - const mockStartWebSocketServer = jest - .spyOn(websocketHelpers, 'startWebSocketServer') - .mockResolvedValue(undefined!); - describe('runOS', () => { - const execMock = jest.spyOn(execa, 'command').mockImplementation(); + const execKillMock = { + kill: jest.fn(), + } as unknown as execa.ExecaChildProcess; + const execMock = jest.spyOn(execa, 'command').mockImplementation(); - beforeEach(() => { - execMock.mockReset(); - }); + beforeEach(() => { + execMock.mockReset().mockReturnValue(execKillMock); + }); + describe('runOS', () => { it('runs an iOS project - with the default build command', async () => { const cwd = path.join( process.cwd(), @@ -116,12 +115,6 @@ describe('run.ts', () => { '/android/app/build/outputs/apk/debug' ); - const execMock = jest.spyOn(execa, 'command').mockImplementation(); - - beforeEach(() => { - execMock.mockReset(); - }); - it('runs an Android project - with the default build command', async () => { const appPath = path.join(cwd, 'app-debug.apk'); @@ -214,7 +207,6 @@ describe('run.ts', () => { beforeEach(() => { commandSyncMock.mockReset(); mockGenerateReport.mockReset(); - mockStartWebSocketServer.mockReset(); }); it('runs an iOS project', async () => { @@ -273,15 +265,14 @@ describe('run.ts', () => { }); }); - it('runs the createWebSocketServer helper', async () => { + it('runs the scripts/websocket-server.js script', async () => { jest.spyOn(configHelpers, 'getConfig').mockResolvedValueOnce(config); - const mockRunIOS = jest.spyOn(run, 'runIOS').mockResolvedValueOnce(); - await run.runHandler({ ...args }); - await expect(mockRunIOS).toHaveBeenCalled(); - await expect(mockStartWebSocketServer).toHaveBeenCalledTimes(1); + await expect(execMock.mock.calls[0][0]).toEqual( + 'node scripts/websocket-server.js' + ); }); it('runs generates the report if the config is set to on', async () => {