diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index a0f0066642a9c..deeb2eba2bcf5 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -6,6 +6,7 @@ const path = require('path') const fs = require('fs') const send = require('send') const auth = require('basic-auth') +const ChildProcess = require('child_process') const { closeWindow } = require('./window-helpers') const { ipcRenderer, remote } = require('electron') @@ -213,6 +214,33 @@ describe('session module', () => { }) }) }) + + it('should survive an app restart for persistent partition', async () => { + const appPath = path.join(__dirname, 'fixtures', 'api', 'cookie-app') + const electronPath = remote.getGlobal('process').execPath + + const test = (result, phase) => { + return new Promise((resolve, reject) => { + let output = '' + + const appProcess = ChildProcess.spawn( + electronPath, + [appPath], + { env: { PHASE: phase, ...process.env } } + ) + + appProcess.stdout.on('data', (data) => { output += data }) + appProcess.stdout.on('end', () => { + output = output.replace(/(\r\n|\n|\r)/gm, '') + assert.strictEqual(output, result) + resolve() + }) + }) + } + + await test('011', 'one') + await test('110', 'two') + }) }) describe('ses.clearStorageData(options)', () => { diff --git a/spec/fixtures/api/cookie-app/main.js b/spec/fixtures/api/cookie-app/main.js new file mode 100644 index 0000000000000..b9ba61d00efe0 --- /dev/null +++ b/spec/fixtures/api/cookie-app/main.js @@ -0,0 +1,70 @@ +const { app, session } = require('electron') + +app.on('ready', async function () { + const url = 'http://foo.bar' + const persistentSession = session.fromPartition('persist:ence-test') + + const set = () => { + return new Promise((resolve, reject) => { + persistentSession.cookies.set({ + url, + name: 'test', + value: 'true', + expirationDate: Date.now() + 60000 + }, error => { + if (error) { + reject(error) + } else { + resolve() + } + }) + }) + } + + const get = () => { + return new Promise((resolve, reject) => { + persistentSession.cookies.get({ url }, (error, list) => { + if (error) { + reject(error) + } else { + resolve(list) + } + }) + }) + } + + const maybeRemove = (pred) => { + return new Promise((resolve, reject) => { + if (pred()) { + persistentSession.cookies.remove(url, 'test', error => { + if (error) { + reject(error) + } else { + resolve() + } + }) + } else { + resolve() + } + }) + } + + try { + await maybeRemove(() => process.env.PHASE === 'one') + const one = await get() + await set() + const two = await get() + await maybeRemove(() => process.env.PHASE === 'two') + const three = await get() + + process.stdout.write(`${one.length}${two.length}${three.length}`) + } catch (e) { + process.stdout.write('ERROR') + } finally { + process.stdout.end() + + setImmediate(() => { + app.quit() + }) + } +}) diff --git a/spec/fixtures/api/cookie-app/package.json b/spec/fixtures/api/cookie-app/package.json new file mode 100644 index 0000000000000..bd21c272f5e2b --- /dev/null +++ b/spec/fixtures/api/cookie-app/package.json @@ -0,0 +1,4 @@ +{ + "name": "electron-cookie-app", + "main": "main.js" +}