fix: ensure correct ordering of sendSync w.r.t. send (#18630)

This commit is contained in:
Jeremy Apthorp 2019-06-04 17:10:31 -07:00 committed by GitHub
parent ed5fb4a720
commit 9e8bd433df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 131 additions and 65 deletions

View file

@ -102,8 +102,88 @@ describe('ipc module', () => {
it('forbids multiple handlers', async () => {
ipcMain.handle('test', () => {})
expect(() => { ipcMain.handle('test', () => {}) }).to.throw(/second handler/)
ipcMain.removeHandler('test')
try {
expect(() => { ipcMain.handle('test', () => {}) }).to.throw(/second handler/)
} finally {
ipcMain.removeHandler('test')
}
})
})
describe('ordering', () => {
let w = (null as unknown as BrowserWindow);
before(async () => {
w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } })
await w.loadURL('about:blank')
})
after(async () => {
w.destroy()
})
it('between send and sendSync is consistent', async () => {
const received: number[] = []
ipcMain.on('test-async', (e, i) => { received.push(i) })
ipcMain.on('test-sync', (e, i) => { received.push(i); e.returnValue = null })
const done = new Promise(resolve => ipcMain.once('done', () => { resolve() }))
try {
function rendererStressTest() {
const {ipcRenderer} = require('electron')
for (let i = 0; i < 1000; i++) {
switch ((Math.random() * 2) | 0) {
case 0:
ipcRenderer.send('test-async', i)
break;
case 1:
ipcRenderer.sendSync('test-sync', i)
break;
}
}
ipcRenderer.send('done')
}
w.webContents.executeJavaScript(`(${rendererStressTest})()`)
await done
} finally {
ipcMain.removeAllListeners('test-async')
ipcMain.removeAllListeners('test-sync')
}
expect(received).to.have.lengthOf(1000)
expect(received).to.deep.equal([...received].sort((a, b) => a - b))
})
it('between send, sendSync, and invoke is consistent', async () => {
const received: number[] = []
ipcMain.handle('test-invoke', (e, i) => { received.push(i) })
ipcMain.on('test-async', (e, i) => { received.push(i) })
ipcMain.on('test-sync', (e, i) => { received.push(i); e.returnValue = null })
const done = new Promise(resolve => ipcMain.once('done', () => { resolve() }))
try {
function rendererStressTest() {
const {ipcRenderer} = require('electron')
for (let i = 0; i < 1000; i++) {
switch ((Math.random() * 3) | 0) {
case 0:
ipcRenderer.send('test-async', i)
break;
case 1:
ipcRenderer.sendSync('test-sync', i)
break;
case 2:
ipcRenderer.invoke('test-invoke', i)
break;
}
}
ipcRenderer.send('done')
}
w.webContents.executeJavaScript(`(${rendererStressTest})()`)
await done
} finally {
ipcMain.removeHandler('test-invoke')
ipcMain.removeAllListeners('test-async')
ipcMain.removeAllListeners('test-sync')
}
expect(received).to.have.lengthOf(1000)
expect(received).to.deep.equal([...received].sort((a, b) => a - b))
})
})
})