diff --git a/apps/desktop/electron/backend-probes.test.ts b/apps/desktop/electron/backend-probes.test.ts index 12dbb1bfa7..5491c7879d 100644 --- a/apps/desktop/electron/backend-probes.test.ts +++ b/apps/desktop/electron/backend-probes.test.ts @@ -7,6 +7,7 @@ import assert from 'node:assert/strict' import fs from 'node:fs' +import net from 'node:net' import os from 'node:os' import path from 'node:path' @@ -15,6 +16,7 @@ import { test } from 'vitest' import { canImportHermesCli, DEFAULT_PROBE_TIMEOUT_MS, + execProbe, hermesRuntimeImportProbe, PROBE_TIMEOUT_MS, resolveProbeTimeoutMs, @@ -29,6 +31,40 @@ import { // (a tiny script we write to disk that exits 0 on --version). const NODE_BIN = process.execPath +test('execProbe keeps the parent event loop available to the child', async () => { + const server = net.createServer((socket) => socket.end('pong')) + + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(0, '127.0.0.1', resolve) + }) + + const address = server.address() + assert.ok(address && typeof address === 'object') + + const childScript = ` + const net = require('node:net') + let reply = '' + const socket = net.createConnection(${address.port}, '127.0.0.1') + socket.setEncoding('utf8') + socket.on('data', (chunk) => { reply += chunk }) + socket.on('end', () => process.exit(reply === 'pong' ? 0 : 1)) + socket.on('error', () => process.exit(1)) + ` + + try { + await execProbe(NODE_BIN, ['-e', childScript], { + stdio: 'ignore', + timeout: 1_000, + windowsHide: true + }) + } finally { + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())) + }) + } +}) + test('canImportHermesCli returns false when path is falsy', async () => { assert.equal(await canImportHermesCli(''), false) assert.equal(await canImportHermesCli(null), false)