diff --git a/spec/main-process/atom-application.test.js b/spec/main-process/atom-application.test.js index b73a57fab..8d991f52c 100644 --- a/spec/main-process/atom-application.test.js +++ b/spec/main-process/atom-application.test.js @@ -389,6 +389,34 @@ describe('AtomApplication', function () { assert.deepEqual(app2Window.representedDirectoryPaths, []) }) + describe('when the `pidToKillWhenClosed` flag is passed', () => { + let killedPids, atomApplication + + beforeEach(() => { + killedPids = [] + atomApplication = buildAtomApplication({ + killProcess (pid) { killedPids.push(pid) } + }) + }) + + it('kills the specified pid after a newly-opened window is closed', async () => { + const window1 = atomApplication.launch(parseCommandLine([makeTempDir(), '--wait', '--pid', '101'])) + await focusWindow(window1) + + const [window2] = atomApplication.launch(parseCommandLine(['--wait', '--pid', '102'])) + await focusWindow(window2) + assert.deepEqual(killedPids, []) + + window1.close() + await window1.closedPromise + assert.deepEqual(killedPids, [101]) + + window2.close() + await window2.closedPromise + assert.deepEqual(killedPids, [101, 102]) + }) + }) + describe('when closing the last window', () => { if (process.platform === 'linux' || process.platform === 'win32') { it('quits the application', async () => { @@ -529,11 +557,11 @@ describe('AtomApplication', function () { assert(electron.app.didQuit()) }) - function buildAtomApplication () { - const atomApplication = new AtomApplication({ + function buildAtomApplication (params = {}) { + const atomApplication = new AtomApplication(Object.assign({ resourcePath: ATOM_RESOURCE_PATH, - atomHomeDirPath: process.env.ATOM_HOME - }) + atomHomeDirPath: process.env.ATOM_HOME, + }, params)) atomApplicationsToDestroy.push(atomApplication) return atomApplication } diff --git a/src/main-process/atom-application.js b/src/main-process/atom-application.js index 459520722..df5c5e202 100644 --- a/src/main-process/atom-application.js +++ b/src/main-process/atom-application.js @@ -101,6 +101,7 @@ class AtomApplication extends EventEmitter { this.socketPath = options.socketPath this.logFile = options.logFile this.userDataDir = options.userDataDir + this._killProcess = options.killProcess || process.kill.bind(process) if (options.test || options.benchmark || options.benchmarkTest) this.socketPath = null this.pidsToOpenWindows = {} @@ -880,7 +881,7 @@ class AtomApplication extends EventEmitter { killProcess (pid) { try { const parsedPid = parseInt(pid) - if (isFinite(parsedPid)) process.kill(parsedPid) + if (isFinite(parsedPid)) this._killProcess(parsedPid) } catch (error) { if (error.code !== 'ESRCH') { console.log(`Killing process ${pid} failed: ${error.code != null ? error.code : error.message}`)