diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index df356ecb9053..260bdd31545d 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -1,6 +1,7 @@ const assert = require('assert') const ChildProcess = require('child_process') const https = require('https') +const net = require('net') const fs = require('fs') const path = require('path') const {remote} = require('electron') @@ -108,6 +109,55 @@ describe('app module', function () { }) }) + describe('app.relaunch', function () { + let server = null + const socketPath = process.platform === 'win32' ? + '\\\\.\\pipe\\electron-app-relaunch' : + '/tmp/electron-app-relaunch' + + beforeEach(function (done) { + fs.unlink(socketPath, (error) => { + server = net.createServer() + server.listen(socketPath) + done() + }) + }) + + afterEach(function (done) { + server.close(() => { + if (process.platform === 'win32') { + done() + } else { + fs.unlink(socketPath, (error) => { + done() + }) + } + }) + }) + + it('relaunches the app', function (done) { + this.timeout(100000) + let state = 'none' + server.once('error', (error) => { + done(error) + }) + server.on('connection', (client) => { + client.once('data', function (data) { + if (String(data) === 'false' && state === 'none') { + state = 'first-launch' + } else if (String(data) === 'true' && state === 'first-launch') { + done() + } else { + done(`Unexpected state: ${state}`) + } + }) + }) + + const appPath = path.join(__dirname, 'fixtures', 'api', 'relaunch') + ChildProcess.spawn(remote.process.execPath, [appPath]) + }) + }) + describe('app.setUserActivity(type, userInfo)', function () { if (process.platform !== 'darwin') { return diff --git a/spec/fixtures/api/quit-app/package.json b/spec/fixtures/api/quit-app/package.json index ea5bb1643b9b..fbdee7f90f95 100644 --- a/spec/fixtures/api/quit-app/package.json +++ b/spec/fixtures/api/quit-app/package.json @@ -1,4 +1,4 @@ { - "name": "quit-app", + "name": "electron-quit-app", "main": "main.js" } diff --git a/spec/fixtures/api/relaunch/main.js b/spec/fixtures/api/relaunch/main.js new file mode 100644 index 000000000000..74cafc6f0d53 --- /dev/null +++ b/spec/fixtures/api/relaunch/main.js @@ -0,0 +1,25 @@ +const {app, dialog} = require('electron') +const net = require('net') + +const socketPath = process.platform === 'win32' ? + '\\\\.\\pipe\\electron-app-relaunch' : + '/tmp/electron-app-relaunch' + +process.on('uncaughtException', () => { + app.exit(1) +}) + +app.once('ready', () => { + let lastArg = process.argv[process.argv.length - 1] + const client = net.connect(socketPath) + client.once('connect', () => { + client.end(String(lastArg === '--second')) + }) + client.once('end', () => { + app.exit(0) + }) + + if (lastArg !== '--second') { + app.relaunch({args: process.argv.slice(1).concat('--second')}) + } +}) diff --git a/spec/fixtures/api/relaunch/package.json b/spec/fixtures/api/relaunch/package.json new file mode 100644 index 000000000000..dbaabc84896d --- /dev/null +++ b/spec/fixtures/api/relaunch/package.json @@ -0,0 +1,5 @@ +{ + "name": "electron-app-relaunch", + "main": "main.js" +} + diff --git a/spec/package.json b/spec/package.json index 0439f4b0ec0f..5abf89f57e74 100644 --- a/spec/package.json +++ b/spec/package.json @@ -13,7 +13,7 @@ "temp": "0.8.1", "walkdir": "0.0.7", "ws": "0.7.2", - "yargs": "^3.31.0" + "yargs": "^4.7.1" }, "optionalDependencies": { "ffi": "2.0.0",