| 
									
										
										
										
											2016-03-25 13:03:49 -07:00
										 |  |  | const assert = require('assert') | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  | const childProcess = require('child_process') | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  | const { expect } = require('chai') | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  | const fs = require('fs') | 
					
						
							| 
									
										
										
										
											2016-03-25 13:03:49 -07:00
										 |  |  | const http = require('http') | 
					
						
							|  |  |  | const multiparty = require('multiparty') | 
					
						
							|  |  |  | const path = require('path') | 
					
						
							| 
									
										
										
										
											2016-10-05 13:53:13 -07:00
										 |  |  | const temp = require('temp').track() | 
					
						
							| 
									
										
										
										
											2016-03-25 13:03:49 -07:00
										 |  |  | const url = require('url') | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  | const { closeWindow } = require('./window-helpers') | 
					
						
							| 
									
										
										
										
											2016-01-11 18:40:23 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  | const { remote } = require('electron') | 
					
						
							|  |  |  | const { app, BrowserWindow, crashReporter } = remote.require('electron') | 
					
						
							| 
									
										
										
										
											2016-01-11 18:40:23 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-01 22:23:33 -04:00
										 |  |  | describe('crashReporter module', () => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |   if (process.mas || process.env.DISABLE_CRASH_REPORTER_TESTS) return | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-12 18:40:15 +02:00
										 |  |  |   // TODO(alexeykuzmin): [Ch66] Fails. Fix it and enable back.
 | 
					
						
							|  |  |  |   if (process.platform === 'linux') return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |   let originalTempDirectory = null | 
					
						
							|  |  |  |   let tempDirectory = null | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |   before(() => { | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |     tempDirectory = temp.mkdirSync('electronCrashReporterSpec-') | 
					
						
							|  |  |  |     originalTempDirectory = app.getPath('temp') | 
					
						
							|  |  |  |     app.setPath('temp', tempDirectory) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |   after(() => { | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |     app.setPath('temp', originalTempDirectory) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |   const fixtures = path.resolve(__dirname, 'fixtures') | 
					
						
							| 
									
										
										
										
											2017-03-21 10:48:36 -03:00
										 |  |  |   const generateSpecs = (description, browserWindowOpts) => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |     describe(description, () => { | 
					
						
							|  |  |  |       let w = null | 
					
						
							|  |  |  |       let stopServer = null | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         stopServer = null | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |         w = new BrowserWindow(Object.assign({ show: false }, browserWindowOpts)) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |       afterEach(() => closeWindow(w).then(() => { w = null })) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |       afterEach(() => { | 
					
						
							| 
									
										
										
										
											2017-04-19 16:32:43 -07:00
										 |  |  |         stopCrashService() | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |       afterEach((done) => { | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         if (stopServer != null) { | 
					
						
							|  |  |  |           stopServer(done) | 
					
						
							| 
									
										
										
										
											2017-04-19 09:52:28 -07:00
										 |  |  |         } else { | 
					
						
							|  |  |  |           done() | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 12:55:35 +01:00
										 |  |  |       it('should send minidump when renderer crashes', function (done) { | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |         // TODO(alexeykuzmin): Skip the test instead of marking it as passed.
 | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |         if (process.env.APPVEYOR === 'True') return done() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 12:55:35 +01:00
										 |  |  |         this.timeout(180000) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         stopServer = startServer({ | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |           callback (port) { | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |             w.loadFile(path.join(fixtures, 'api', 'crash.html'), { query: { port } }) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |           }, | 
					
						
							|  |  |  |           processType: 'renderer', | 
					
						
							|  |  |  |           done: done | 
					
						
							| 
									
										
										
										
											2016-08-09 15:41:46 -07:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-11-10 10:39:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-18 11:00:59 +02:00
										 |  |  |       it('should send minidump when node processes crash', function (done) { | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |         // TODO(alexeykuzmin): Skip the test instead of marking it as passed.
 | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |         if (process.env.APPVEYOR === 'True') return done() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 12:55:35 +01:00
										 |  |  |         this.timeout(180000) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         stopServer = startServer({ | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |           callback (port) { | 
					
						
							| 
									
										
										
										
											2017-04-19 16:53:57 -07:00
										 |  |  |             const crashesDir = path.join(app.getPath('temp'), `${process.platform === 'win32' ? 'Zombies' : app.getName()} Crashes`) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |             const version = app.getVersion() | 
					
						
							|  |  |  |             const crashPath = path.join(fixtures, 'module', 'crash.js') | 
					
						
							| 
									
										
										
										
											2017-04-19 16:32:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (process.platform === 'win32') { | 
					
						
							|  |  |  |               const crashServiceProcess = childProcess.spawn(process.execPath, [ | 
					
						
							|  |  |  |                 `--reporter-url=http://127.0.0.1:${port}`, | 
					
						
							|  |  |  |                 '--application-name=Zombies', | 
					
						
							|  |  |  |                 `--crashes-directory=${crashesDir}` | 
					
						
							|  |  |  |               ], { | 
					
						
							| 
									
										
										
										
											2017-04-19 16:44:31 -07:00
										 |  |  |                 env: { | 
					
						
							|  |  |  |                   ELECTRON_INTERNAL_CRASH_SERVICE: 1 | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 detached: true | 
					
						
							| 
									
										
										
										
											2017-04-19 16:32:43 -07:00
										 |  |  |               }) | 
					
						
							|  |  |  |               remote.process.crashServicePid = crashServiceProcess.pid | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |             childProcess.fork(crashPath, [port, version, crashesDir], { silent: true }) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |           }, | 
					
						
							|  |  |  |           processType: 'browser', | 
					
						
							|  |  |  |           done: done | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-11-10 10:39:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 12:55:35 +01:00
										 |  |  |       it('should not send minidump if uploadToServer is false', function (done) { | 
					
						
							|  |  |  |         this.timeout(180000) | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |         let dumpFile | 
					
						
							|  |  |  |         let crashesDir = crashReporter.getCrashesDirectory() | 
					
						
							|  |  |  |         const existingDumpFiles = new Set() | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |         if (process.platform === 'darwin') { | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |           // crashpad puts the dump files in the "completed" subdirectory
 | 
					
						
							|  |  |  |           crashesDir = path.join(crashesDir, 'completed') | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |           crashReporter.setUploadToServer(false) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const testDone = (uploaded) => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |           if (uploaded) return done(new Error('Uploaded crash report')) | 
					
						
							|  |  |  |           if (process.platform === 'darwin') crashReporter.setUploadToServer(true) | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |           assert(fs.existsSync(dumpFile)) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let pollInterval | 
					
						
							|  |  |  |         const pollDumpFile = () => { | 
					
						
							|  |  |  |           fs.readdir(crashesDir, (err, files) => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |             if (err) return | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |             const dumps = files.filter((file) => /\.dmp$/.test(file) && !existingDumpFiles.has(file)) | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |             if (!dumps.length) return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |             assert.strictEqual(1, dumps.length) | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |             dumpFile = path.join(crashesDir, dumps[0]) | 
					
						
							|  |  |  |             clearInterval(pollInterval) | 
					
						
							|  |  |  |             // dump file should not be deleted when not uploading, so we wait
 | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |             // 1s and assert it still exists in `testDone`
 | 
					
						
							|  |  |  |             setTimeout(testDone, 1000) | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |           }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |         remote.ipcMain.once('list-existing-dumps', (event) => { | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |           fs.readdir(crashesDir, (err, files) => { | 
					
						
							|  |  |  |             if (!err) { | 
					
						
							| 
									
										
										
										
											2017-03-31 10:42:43 -07:00
										 |  |  |               for (const file of files) { | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |                 if (/\.dmp$/.test(file)) { | 
					
						
							| 
									
										
										
										
											2017-04-05 17:42:24 -03:00
										 |  |  |                   existingDumpFiles.add(file) | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |             event.returnValue = null // allow the renderer to crash
 | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |             pollInterval = setInterval(pollDumpFile, 100) | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         stopServer = startServer({ | 
					
						
							| 
									
										
										
										
											2017-03-30 11:11:49 -03:00
										 |  |  |           callback (port) { | 
					
						
							|  |  |  |             const crashUrl = url.format({ | 
					
						
							|  |  |  |               protocol: 'file', | 
					
						
							|  |  |  |               pathname: path.join(fixtures, 'api', 'crash.html'), | 
					
						
							|  |  |  |               search: `?port=${port}&skipUpload=1` | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             w.loadURL(crashUrl) | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           processType: 'renderer', | 
					
						
							|  |  |  |           done: testDone.bind(null, true) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-11-10 10:39:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 12:55:35 +01:00
										 |  |  |       it('should send minidump with updated extra parameters', function (done) { | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |         // TODO(alexeykuzmin): Skip the test instead of marking it as passed.
 | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |         if (process.env.APPVEYOR === 'True') return done() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 12:55:35 +01:00
										 |  |  |         this.timeout(180000) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |         stopServer = startServer({ | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |           callback (port) { | 
					
						
							|  |  |  |             const crashUrl = url.format({ | 
					
						
							|  |  |  |               protocol: 'file', | 
					
						
							|  |  |  |               pathname: path.join(fixtures, 'api', 'crash-restart.html'), | 
					
						
							| 
									
										
										
										
											2017-10-31 18:19:04 -04:00
										 |  |  |               search: `?port=${port}` | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |             }) | 
					
						
							|  |  |  |             w.loadURL(crashUrl) | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           processType: 'renderer', | 
					
						
							| 
									
										
										
										
											2017-11-02 07:07:19 -04:00
										 |  |  |           done: done | 
					
						
							| 
									
										
										
										
											2017-02-13 10:46:19 -08:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:53:17 -03:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-02-13 10:46:19 -08:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-03-21 10:48:36 -03:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   generateSpecs('without sandbox', {}) | 
					
						
							| 
									
										
										
										
											2017-04-19 09:28:52 -07:00
										 |  |  |   generateSpecs('with sandbox', { | 
					
						
							| 
									
										
										
										
											2017-03-21 10:48:36 -03:00
										 |  |  |     webPreferences: { | 
					
						
							|  |  |  |       sandbox: true, | 
					
						
							|  |  |  |       preload: path.join(fixtures, 'module', 'preload-sandbox.js') | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |   generateSpecs('with remote module disabled', { | 
					
						
							|  |  |  |     webPreferences: { | 
					
						
							|  |  |  |       enableRemoteModule: false | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2017-02-13 10:46:19 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |   describe('getProductName', () => { | 
					
						
							|  |  |  |     it('returns the product name if one is specified', () => { | 
					
						
							|  |  |  |       const name = crashReporter.getProductName() | 
					
						
							| 
									
										
										
										
											2017-11-01 08:57:22 -04:00
										 |  |  |       const expectedName = (process.platform === 'darwin') ? 'Electron Test' : 'Zombies' | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(name, expectedName) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('start(options)', () => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |     it('requires that the companyName and submitURL options be specified', () => { | 
					
						
							|  |  |  |       assert.throws(() => { | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |         crashReporter.start({ companyName: 'Missing submitURL' }) | 
					
						
							| 
									
										
										
										
											2016-04-28 09:48:13 -07:00
										 |  |  |       }, /submitURL is a required option to crashReporter\.start/) | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |       assert.throws(() => { | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |         crashReporter.start({ submitURL: 'Missing companyName' }) | 
					
						
							| 
									
										
										
										
											2016-04-28 09:48:13 -07:00
										 |  |  |       }, /companyName is a required option to crashReporter\.start/) | 
					
						
							| 
									
										
										
										
											2016-03-25 13:03:49 -07:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |     it('can be called multiple times', () => { | 
					
						
							|  |  |  |       assert.doesNotThrow(() => { | 
					
						
							| 
									
										
										
										
											2016-07-26 10:43:57 -07:00
										 |  |  |         crashReporter.start({ | 
					
						
							|  |  |  |           companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |           submitURL: 'http://127.0.0.1/crashes' | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         crashReporter.start({ | 
					
						
							|  |  |  |           companyName: 'Umbrella Corporation 2', | 
					
						
							|  |  |  |           submitURL: 'http://127.0.0.1/more-crashes' | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-03-25 13:03:49 -07:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2017-10-30 23:15:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |   describe('getCrashesDirectory', () => { | 
					
						
							|  |  |  |     it('correctly returns the directory', () => { | 
					
						
							|  |  |  |       const crashesDir = crashReporter.getCrashesDirectory() | 
					
						
							| 
									
										
										
										
											2017-10-30 23:15:57 -04:00
										 |  |  |       let dir | 
					
						
							|  |  |  |       if (process.platform === 'win32') { | 
					
						
							|  |  |  |         dir = `${app.getPath('temp')}/Zombies Crashes` | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         dir = `${app.getPath('temp')}/Electron Test Crashes` | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(crashesDir, dir) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('getUploadedReports', () => { | 
					
						
							|  |  |  |     it('returns an array of reports', () => { | 
					
						
							|  |  |  |       const reports = crashReporter.getUploadedReports() | 
					
						
							|  |  |  |       assert(typeof reports === 'object') | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2016-11-28 15:01:38 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  |   // TODO(alexeykuzmin): This suite should explicitly
 | 
					
						
							|  |  |  |   // generate several crash reports instead of hoping
 | 
					
						
							|  |  |  |   // that there will be enough of them already.
 | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |   describe('getLastCrashReport', () => { | 
					
						
							|  |  |  |     it('correctly returns the most recent report', () => { | 
					
						
							| 
									
										
										
										
											2017-11-30 15:39:32 -05:00
										 |  |  |       const reports = crashReporter.getUploadedReports() | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  |       expect(reports).to.be.an('array') | 
					
						
							|  |  |  |       expect(reports).to.have.lengthOf.at.least(2, | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |         'There are not enough reports for this test') | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 16:51:20 -07:00
										 |  |  |       const lastReport = crashReporter.getLastCrashReport() | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  |       expect(lastReport).to.be.an('object').that.includes.a.key('date') | 
					
						
							| 
									
										
										
										
											2018-03-13 16:51:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  |       // Let's find the newest report.
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       const { report: newestReport } = reports.reduce((acc, cur) => { | 
					
						
							| 
									
										
										
										
											2018-03-13 17:40:41 -07:00
										 |  |  |         const timestamp = new Date(cur.date).getTime() | 
					
						
							| 
									
										
										
										
											2018-03-13 17:28:15 -07:00
										 |  |  |         return (timestamp > acc.timestamp) | 
					
						
							|  |  |  |           ? { report: cur, timestamp: timestamp } | 
					
						
							|  |  |  |           : acc | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  |       }, { timestamp: -Infinity }) | 
					
						
							|  |  |  |       assert(newestReport, 'Hey!') | 
					
						
							| 
									
										
										
										
											2018-03-13 17:28:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 11:24:28 +02:00
										 |  |  |       expect(lastReport.date.getTime()).to.be.equal( | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |         newestReport.date.getTime(), | 
					
						
							|  |  |  |         'Last report is not the newest.') | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('getUploadToServer()', () => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |     it('throws an error when called from the renderer process', () => { | 
					
						
							| 
									
										
										
										
											2016-11-28 15:01:38 -08:00
										 |  |  |       assert.throws(() => require('electron').crashReporter.getUploadToServer()) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |     it('returns true when uploadToServer is set to true', function () { | 
					
						
							|  |  |  |       if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |         // FIXME(alexeykuzmin): Skip the test.
 | 
					
						
							|  |  |  |         // this.skip()
 | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes', | 
					
						
							|  |  |  |         uploadToServer: true | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(crashReporter.getUploadToServer(), true) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |     it('returns false when uploadToServer is set to false', function () { | 
					
						
							|  |  |  |       if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |         // FIXME(alexeykuzmin): Skip the test.
 | 
					
						
							|  |  |  |         // this.skip()
 | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes', | 
					
						
							|  |  |  |         uploadToServer: true | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       crashReporter.setUploadToServer(false) | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(crashReporter.getUploadToServer(), false) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('setUploadToServer(uploadToServer)', () => { | 
					
						
							|  |  |  |     it('throws an error when called from the renderer process', () => { | 
					
						
							|  |  |  |       assert.throws(() => require('electron').crashReporter.setUploadToServer('arg')) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |     it('sets uploadToServer false when called with false', function () { | 
					
						
							|  |  |  |       if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |         // FIXME(alexeykuzmin): Skip the test.
 | 
					
						
							|  |  |  |         // this.skip()
 | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes', | 
					
						
							|  |  |  |         uploadToServer: true | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       crashReporter.setUploadToServer(false) | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(crashReporter.getUploadToServer(), false) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |     it('sets uploadToServer true when called with true', function () { | 
					
						
							|  |  |  |       if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |         // FIXME(alexeykuzmin): Skip the test.
 | 
					
						
							|  |  |  |         // this.skip()
 | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2016-11-28 15:01:38 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes', | 
					
						
							|  |  |  |         uploadToServer: false | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       crashReporter.setUploadToServer(true) | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(crashReporter.getUploadToServer(), true) | 
					
						
							| 
									
										
										
										
											2016-11-28 15:01:38 -08:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-31 18:19:04 -04:00
										 |  |  |   describe('Parameters', () => { | 
					
						
							| 
									
										
										
										
											2017-10-31 10:38:48 -04:00
										 |  |  |     it('returns all of the current parameters', () => { | 
					
						
							| 
									
										
										
										
											2017-10-31 13:51:44 -04:00
										 |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes' | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-31 10:38:48 -04:00
										 |  |  |       const parameters = crashReporter.getParameters() | 
					
						
							| 
									
										
										
										
											2017-10-31 13:51:44 -04:00
										 |  |  |       assert(typeof parameters === 'object') | 
					
						
							| 
									
										
										
										
											2017-10-31 10:38:48 -04:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |     it('adds a parameter to current parameters', function () { | 
					
						
							|  |  |  |       if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |         // FIXME(alexeykuzmin): Skip the test.
 | 
					
						
							|  |  |  |         // this.skip()
 | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-11-01 21:57:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes' | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.addExtraParameter('hello', 'world') | 
					
						
							|  |  |  |       assert('hello' in crashReporter.getParameters()) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-11-16 00:05:46 +03:00
										 |  |  |     it('removes a parameter from current parameters', function () { | 
					
						
							|  |  |  |       if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |         // FIXME(alexeykuzmin): Skip the test.
 | 
					
						
							|  |  |  |         // this.skip()
 | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-10-31 10:38:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-31 13:51:44 -04:00
										 |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1/crashes' | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 01:02:16 -04:00
										 |  |  |       crashReporter.addExtraParameter('hello', 'world') | 
					
						
							| 
									
										
										
										
											2017-11-01 21:57:43 -04:00
										 |  |  |       assert('hello' in crashReporter.getParameters()) | 
					
						
							| 
									
										
										
										
											2017-10-31 10:38:48 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       crashReporter.removeExtraParameter('hello') | 
					
						
							| 
									
										
										
										
											2017-11-01 21:57:43 -04:00
										 |  |  |       assert(!('hello' in crashReporter.getParameters())) | 
					
						
							| 
									
										
										
										
											2017-10-31 10:38:48 -04:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-10-30 22:51:22 -04:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2016-03-25 13:03:49 -07:00
										 |  |  | }) | 
					
						
							| 
									
										
										
										
											2016-10-06 09:45:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | const waitForCrashReport = () => { | 
					
						
							|  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |     let times = 0 | 
					
						
							|  |  |  |     const checkForReport = () => { | 
					
						
							|  |  |  |       if (crashReporter.getLastCrashReport() != null) { | 
					
						
							|  |  |  |         resolve() | 
					
						
							|  |  |  |       } else if (times >= 10) { | 
					
						
							|  |  |  |         reject(new Error('No crash report available')) | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         times++ | 
					
						
							|  |  |  |         setTimeout(checkForReport, 100) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     checkForReport() | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  | const startServer = ({ callback, processType, done }) => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |   let called = false | 
					
						
							| 
									
										
										
										
											2018-10-02 03:56:31 +02:00
										 |  |  |   const server = http.createServer((req, res) => { | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |     const form = new multiparty.Form() | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  |     form.parse(req, (error, fields) => { | 
					
						
							|  |  |  |       if (error) throw error | 
					
						
							|  |  |  |       if (called) return | 
					
						
							|  |  |  |       called = true | 
					
						
							| 
									
										
										
										
											2018-09-14 19:46:53 +10:00
										 |  |  |       assert.deepStrictEqual(String(fields.prod), 'Electron') | 
					
						
							|  |  |  |       assert.strictEqual(String(fields.ver), process.versions.electron) | 
					
						
							|  |  |  |       assert.strictEqual(String(fields.process_type), processType) | 
					
						
							|  |  |  |       assert.strictEqual(String(fields.platform), process.platform) | 
					
						
							|  |  |  |       assert.strictEqual(String(fields.extra1), 'extra1') | 
					
						
							|  |  |  |       assert.strictEqual(String(fields.extra2), 'extra2') | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |       assert.strictEqual(fields.extra3, undefined) | 
					
						
							| 
									
										
										
										
											2018-09-14 19:46:53 +10:00
										 |  |  |       assert.strictEqual(String(fields._productName), 'Zombies') | 
					
						
							|  |  |  |       assert.strictEqual(String(fields._companyName), 'Umbrella Corporation') | 
					
						
							|  |  |  |       assert.strictEqual(String(fields._version), app.getVersion()) | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const reportId = 'abc-123-def-456-abc-789-abc-123-abcd' | 
					
						
							|  |  |  |       res.end(reportId, () => { | 
					
						
							|  |  |  |         waitForCrashReport().then(() => { | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |           assert.strictEqual(crashReporter.getLastCrashReport().id, reportId) | 
					
						
							|  |  |  |           assert.notStrictEqual(crashReporter.getUploadedReports().length, 0) | 
					
						
							|  |  |  |           assert.strictEqual(crashReporter.getUploadedReports()[0].id, reportId) | 
					
						
							| 
									
										
										
										
											2017-02-13 10:46:19 -08:00
										 |  |  |           req.socket.destroy() | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  |           done() | 
					
						
							|  |  |  |         }, done) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const activeConnections = new Set() | 
					
						
							|  |  |  |   server.on('connection', (connection) => { | 
					
						
							|  |  |  |     activeConnections.add(connection) | 
					
						
							|  |  |  |     connection.once('close', () => { | 
					
						
							|  |  |  |       activeConnections.delete(connection) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |   let { port } = remote.process | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  |   server.listen(port, '127.0.0.1', () => { | 
					
						
							|  |  |  |     port = server.address().port | 
					
						
							|  |  |  |     remote.process.port = port | 
					
						
							|  |  |  |     if (process.platform === 'darwin') { | 
					
						
							|  |  |  |       crashReporter.start({ | 
					
						
							|  |  |  |         companyName: 'Umbrella Corporation', | 
					
						
							|  |  |  |         submitURL: 'http://127.0.0.1:' + port | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     callback(port) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return function stopServer (done) { | 
					
						
							|  |  |  |     for (const connection of activeConnections) { | 
					
						
							|  |  |  |       connection.destroy() | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-26 20:21:36 -04:00
										 |  |  |     server.close(() => { | 
					
						
							| 
									
										
										
										
											2017-04-19 09:48:32 -07:00
										 |  |  |       done() | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-01-24 13:49:45 -08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-04-19 16:32:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | const stopCrashService = () => { | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  |   const { crashServicePid } = remote.process | 
					
						
							| 
									
										
										
										
											2017-04-19 16:32:43 -07:00
										 |  |  |   if (crashServicePid) { | 
					
						
							|  |  |  |     remote.process.crashServicePid = 0 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       process.kill(crashServicePid) | 
					
						
							|  |  |  |     } catch (error) { | 
					
						
							|  |  |  |       if (error.code !== 'ESRCH') { | 
					
						
							|  |  |  |         throw error | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |