From b8a21dbcd7d784cc4999754b4826d62e0499307a Mon Sep 17 00:00:00 2001 From: Calvin Date: Tue, 4 Apr 2023 07:48:51 -0600 Subject: [PATCH] test: migrate to helpers & disabled tests list (#37513) * test: migrate to helpers & disabled tests list * can't disable a test suite * correct condition * address review comments --- spec/api-app-spec.ts | 81 ++++++++++------------------- spec/api-autoupdater-darwin-spec.ts | 1 + spec/api-browser-window-spec.ts | 8 +-- spec/api-media-handler-spec.ts | 6 ++- spec/api-menu-item-spec.ts | 9 +--- spec/api-menu-spec.ts | 4 +- spec/api-process-spec.ts | 4 +- spec/api-protocol-spec.ts | 10 ++-- spec/api-screen-spec.ts | 13 ++--- spec/api-session-spec.ts | 3 +- spec/api-web-contents-spec.ts | 11 ++-- spec/api-web-frame-main-spec.ts | 5 +- spec/asar-spec.ts | 2 +- spec/chromium-spec.ts | 19 +++---- spec/disabled-tests.json | 15 +++++- spec/extensions-spec.ts | 4 +- spec/index.js | 1 + spec/version-bump-spec.ts | 4 +- spec/visibility-state-spec.ts | 6 +-- spec/webview-spec.ts | 6 ++- 20 files changed, 95 insertions(+), 117 deletions(-) diff --git a/spec/api-app-spec.ts b/spec/api-app-spec.ts index 38ecb1c26ff..6fdf528e989 100644 --- a/spec/api-app-spec.ts +++ b/spec/api-app-spec.ts @@ -188,12 +188,7 @@ describe('app module', () => { expect(code).to.equal(123, 'exit code should be 123, if you see this please tag @MarshallOfSound'); }); - it('exits gracefully', async function () { - if (!['darwin', 'linux'].includes(process.platform)) { - this.skip(); - return; - } - + ifit(['darwin', 'linux'].includes(process.platform))('exits gracefully', async function () { const electronPath = process.execPath; const appPath = path.join(fixturesPath, 'api', 'singleton'); appProcess = cp.spawn(electronPath, [appPath]); @@ -409,13 +404,7 @@ describe('app module', () => { }); }); - describe('app.setUserActivity(type, userInfo)', () => { - before(function () { - if (process.platform !== 'darwin') { - this.skip(); - } - }); - + ifdescribe(process.platform === 'darwin')('app.setUserActivity(type, userInfo)', () => { it('sets the current activity', () => { app.setUserActivity('com.electron.testActivity', { testData: '123' }); expect(app.getCurrentActivityType()).to.equal('com.electron.testActivity'); @@ -737,9 +726,7 @@ describe('app module', () => { expect(app.getLoginItemSettings().openAtLogin).to.equal(false); }); - it('correctly sets and unsets the LoginItem as hidden', function () { - if (process.platform !== 'darwin') this.skip(); - + ifit(process.platform === 'darwin')('correctly sets and unsets the LoginItem as hidden', function () { expect(app.getLoginItemSettings().openAtLogin).to.equal(false); expect(app.getLoginItemSettings().openAsHidden).to.equal(false); @@ -1099,13 +1086,10 @@ describe('app module', () => { }); }); - describe('select-client-certificate event', () => { + ifdescribe(process.platform !== 'linux')('select-client-certificate event', () => { let w: BrowserWindow; before(function () { - if (process.platform === 'linux') { - this.skip(); - } session.fromPartition('empty-certificate').setCertificateVerifyProc((req, cb) => { cb(0); }); }); @@ -1134,7 +1118,7 @@ describe('app module', () => { }); }); - describe('setAsDefaultProtocolClient(protocol, path, args)', () => { + ifdescribe(process.platform === 'win32')('setAsDefaultProtocolClient(protocol, path, args)', () => { const protocol = 'electron-test'; const updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe'); const processStartArgs = [ @@ -1146,16 +1130,12 @@ describe('app module', () => { let classesKey: any; before(function () { - if (process.platform !== 'win32') { - this.skip(); - } else { - Winreg = require('winreg'); + Winreg = require('winreg'); - classesKey = new Winreg({ - hive: Winreg.HKCU, - key: '\\Software\\Classes\\' - }); - } + classesKey = new Winreg({ + hive: Winreg.HKCU, + key: '\\Software\\Classes\\' + }); }); after(function (done) { @@ -1240,14 +1220,11 @@ describe('app module', () => { }); describe('getApplicationNameForProtocol()', () => { - it('returns application names for common protocols', function () { + // TODO: Linux CI doesn't have registered http & https handlers + ifit(!(process.env.CI && process.platform === 'linux'))('returns application names for common protocols', function () { // We can't expect particular app names here, but these protocols should // at least have _something_ registered. Except on our Linux CI // environment apparently. - if (process.platform === 'linux') { - this.skip(); - } - const protocols = [ 'http://', 'https://' @@ -1492,28 +1469,25 @@ describe('app module', () => { }); }); - describe('sandbox options', () => { + ifdescribe(!(process.platform === 'linux' && (process.arch === 'arm64' || process.arch === 'arm')))('sandbox options', () => { + // Our ARM tests are run on VSTS rather than CircleCI, and the Docker + // setup on VSTS disallows syscalls that Chrome requires for setting up + // sandboxing. + // See: + // - https://docs.docker.com/engine/security/seccomp/#significant-syscalls-blocked-by-the-default-profile + // - https://chromium.googlesource.com/chromium/src/+/70.0.3538.124/sandbox/linux/services/credentials.cc#292 + // - https://github.com/docker/docker-ce/blob/ba7dfc59ccfe97c79ee0d1379894b35417b40bca/components/engine/profiles/seccomp/seccomp_default.go#L497 + // - https://blog.jessfraz.com/post/how-to-use-new-docker-seccomp-profiles/ + // + // Adding `--cap-add SYS_ADMIN` or `--security-opt seccomp=unconfined` + // to the Docker invocation allows the syscalls that Chrome needs, but + // are probably more permissive than we'd like. + let appProcess: cp.ChildProcess = null as any; let server: net.Server = null as any; const socketPath = process.platform === 'win32' ? '\\\\.\\pipe\\electron-mixed-sandbox' : '/tmp/electron-mixed-sandbox'; beforeEach(function (done) { - if (process.platform === 'linux' && (process.arch === 'arm64' || process.arch === 'arm')) { - // Our ARM tests are run on VSTS rather than CircleCI, and the Docker - // setup on VSTS disallows syscalls that Chrome requires for setting up - // sandboxing. - // See: - // - https://docs.docker.com/engine/security/seccomp/#significant-syscalls-blocked-by-the-default-profile - // - https://chromium.googlesource.com/chromium/src/+/70.0.3538.124/sandbox/linux/services/credentials.cc#292 - // - https://github.com/docker/docker-ce/blob/ba7dfc59ccfe97c79ee0d1379894b35417b40bca/components/engine/profiles/seccomp/seccomp_default.go#L497 - // - https://blog.jessfraz.com/post/how-to-use-new-docker-seccomp-profiles/ - // - // Adding `--cap-add SYS_ADMIN` or `--security-opt seccomp=unconfined` - // to the Docker invocation allows the syscalls that Chrome needs, but - // are probably more permissive than we'd like. - this.skip(); - return; - } fs.unlink(socketPath, () => { server = net.createServer(); server.listen(socketPath); @@ -1613,8 +1587,7 @@ describe('app module', () => { }); }); - const dockDescribe = process.platform === 'darwin' ? describe : describe.skip; - dockDescribe('dock APIs', () => { + ifdescribe(process.platform === 'darwin')('dock APIs', () => { after(async () => { await app.dock.show(); }); diff --git a/spec/api-autoupdater-darwin-spec.ts b/spec/api-autoupdater-darwin-spec.ts index 7eaf6d8b4e3..28004cf1e1c 100644 --- a/spec/api-autoupdater-darwin-spec.ts +++ b/spec/api-autoupdater-darwin-spec.ts @@ -29,6 +29,7 @@ ifdescribe(process.platform === 'darwin' && !(process.env.CI && process.arch === if (process.env.CI && !process.env.CIRCLE_PR_NUMBER) { throw new Error('No valid signing identity available to run autoUpdater specs'); } + this.skip(); } else { identity = result.stdout.toString().trim(); diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 5dea298430a..b6dd56ab45b 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -359,9 +359,9 @@ describe('BrowserWindow module', () => { w.loadURL('about:blank'); await readyToShow; }); - // TODO(deepak1556): The error code now seems to be `ERR_FAILED`, verify what + // DISABLED-FIXME(deepak1556): The error code now seems to be `ERR_FAILED`, verify what // changed and adjust the test. - it.skip('should emit did-fail-load event for files that do not exist', async () => { + it('should emit did-fail-load event for files that do not exist', async () => { const didFailLoad = once(w.webContents, 'did-fail-load'); w.loadURL('file://a.txt'); const [, code, desc,, isMainFrame] = await didFailLoad; @@ -4083,9 +4083,9 @@ describe('BrowserWindow module', () => { } }); - // FIXME(MarshallOfSound): This test fails locally 100% of the time, on CI it started failing + // DISABLED-FIXME(MarshallOfSound): This test fails locally 100% of the time, on CI it started failing // when we introduced the compositor recycling patch. Should figure out how to fix this - it.skip('visibilityState remains visible if backgroundThrottling is disabled', async () => { + it('visibilityState remains visible if backgroundThrottling is disabled', async () => { const w = new BrowserWindow({ show: false, width: 100, diff --git a/spec/api-media-handler-spec.ts b/spec/api-media-handler-spec.ts index 2ddd79239ce..b5cea61f1c3 100644 --- a/spec/api-media-handler-spec.ts +++ b/spec/api-media-handler-spec.ts @@ -23,14 +23,16 @@ ifdescribe(features.isDesktopCapturerEnabled())('setDisplayMediaRequestHandler', server.close(); }); - // NOTE(nornagon): this test fails on our macOS CircleCI runners with the + // FIXME(nornagon): this test fails on our macOS CircleCI runners with the // error message: // [ERROR:video_capture_device_client.cc(659)] error@ OnStart@content/browser/media/capture/desktop_capture_device_mac.cc:98, CGDisplayStreamCreate failed, OS message: Value too large to be stored in data type (84) // This is possibly related to the OS/VM setup that CircleCI uses for macOS. // Our arm64 runners are in @jkleinsc's office, and are real machines, so the // test works there. ifit(!(process.platform === 'darwin' && process.arch === 'x64'))('works when calling getDisplayMedia', async function () { - if ((await desktopCapturer.getSources({ types: ['screen'] })).length === 0) { return this.skip(); } + if ((await desktopCapturer.getSources({ types: ['screen'] })).length === 0) { + return this.skip(); + } const ses = session.fromPartition('' + Math.random()); let requestHandlerCalled = false; let mediaRequest: any = null; diff --git a/spec/api-menu-item-spec.ts b/spec/api-menu-item-spec.ts index dfb5f99c57c..fc015da321b 100644 --- a/spec/api-menu-item-spec.ts +++ b/spec/api-menu-item-spec.ts @@ -1,5 +1,6 @@ import { BrowserWindow, app, Menu, MenuItem, MenuItemConstructorOptions } from 'electron/main'; import { expect } from 'chai'; +import { ifdescribe } from './lib/spec-helpers'; import { closeAllWindows } from './lib/window-helpers'; import { roleList, execute } from '../lib/browser/api/menu-item-roles'; @@ -280,13 +281,7 @@ describe('MenuItems', () => { }); }); - describe('MenuItem appMenu', () => { - before(function () { - if (process.platform !== 'darwin') { - this.skip(); - } - }); - + ifdescribe(process.platform === 'darwin')('MenuItem appMenu', () => { it('includes a default submenu layout when submenu is empty', () => { const item = new MenuItem({ role: 'appMenu' }); diff --git a/spec/api-menu-spec.ts b/spec/api-menu-spec.ts index 16c2e4b2df1..7680206b25f 100644 --- a/spec/api-menu-spec.ts +++ b/spec/api-menu-spec.ts @@ -891,8 +891,8 @@ describe('Menu module', function () { expect(Menu.getApplicationMenu()).to.not.be.null('application menu'); }); - // TODO(nornagon): this causes the focus handling tests to fail - it.skip('unsets a menu with null', () => { + // DISABLED-FIXME(nornagon): this causes the focus handling tests to fail + it('unsets a menu with null', () => { Menu.setApplicationMenu(null); expect(Menu.getApplicationMenu()).to.be.null('application menu'); }); diff --git a/spec/api-process-spec.ts b/spec/api-process-spec.ts index a515e497360..ea2ca726a41 100644 --- a/spec/api-process-spec.ts +++ b/spec/api-process-spec.ts @@ -204,9 +204,9 @@ describe('process module', () => { }); describe('process.takeHeapSnapshot()', () => { - // TODO(nornagon): this seems to take a really long time when run in the + // DISABLED-FIXME(nornagon): this seems to take a really long time when run in the // main process, for unknown reasons. - it.skip('returns true on success', () => { + it('returns true on success', () => { const filePath = path.join(app.getPath('temp'), 'test.heapsnapshot'); defer(() => { try { diff --git a/spec/api-protocol-spec.ts b/spec/api-protocol-spec.ts index 79ebccbb8cd..05d9794264c 100644 --- a/spec/api-protocol-spec.ts +++ b/spec/api-protocol-spec.ts @@ -282,7 +282,8 @@ describe('protocol module', () => { ipcMain.once('loaded-iframe-custom-protocol', () => done()); }); - it.skip('throws an error when custom headers are invalid', (done) => { + // DISABLED-FIXME + it('throws an error when custom headers are invalid', (done) => { registerFileProtocol(protocolName, (request, callback) => { expect(() => callback({ path: filePath, @@ -879,7 +880,8 @@ describe('protocol module', () => { await requestReceived; }); - it.skip('can access files through the FileSystem API', (done) => { + // DISABLED-FIXME + it('can access files through the FileSystem API', (done) => { const filePath = path.join(fixturesPath, 'pages', 'filesystem.html'); protocol.registerFileProtocol(standardScheme, (request, callback) => callback({ path: filePath })); w.loadURL(origin); @@ -928,8 +930,8 @@ describe('protocol module', () => { }); }); - // FIXME: Figure out why this test is failing - it.skip('disallows CORS and fetch requests when only supportFetchAPI is specified', async () => { + // DISABLED-FIXME: Figure out why this test is failing + it('disallows CORS and fetch requests when only supportFetchAPI is specified', async () => { await allowsCORSRequests('no-cors', ['failed xhr', 'failed fetch'], /has been blocked by CORS policy/, () => { const { ipcRenderer } = require('electron'); Promise.all([ diff --git a/spec/api-screen-spec.ts b/spec/api-screen-spec.ts index 2f6631e454c..86e13727d5e 100644 --- a/spec/api-screen-spec.ts +++ b/spec/api-screen-spec.ts @@ -1,5 +1,6 @@ import { expect } from 'chai'; import { screen } from 'electron/main'; +import { ifit } from './lib/spec-helpers'; describe('screen module', () => { describe('methods reassignment', () => { @@ -28,8 +29,7 @@ describe('screen module', () => { expect(display).to.be.an('object'); }); - it('has the correct non-object properties', function () { - if (process.platform === 'linux') this.skip(); + ifit(process.platform !== 'linux')('has the correct non-object properties', function () { const display = screen.getPrimaryDisplay(); expect(display).to.have.property('scaleFactor').that.is.a('number'); @@ -46,8 +46,7 @@ describe('screen module', () => { expect(display).to.have.property('displayFrequency').that.is.a('number'); }); - it('has a size object property', function () { - if (process.platform === 'linux') this.skip(); + ifit(process.platform !== 'linux')('has a size object property', function () { const display = screen.getPrimaryDisplay(); expect(display).to.have.property('size').that.is.an('object'); @@ -56,8 +55,7 @@ describe('screen module', () => { expect(size).to.have.property('height').that.is.greaterThan(0); }); - it('has a workAreaSize object property', function () { - if (process.platform === 'linux') this.skip(); + ifit(process.platform !== 'linux')('has a workAreaSize object property', function () { const display = screen.getPrimaryDisplay(); expect(display).to.have.property('workAreaSize').that.is.an('object'); @@ -66,8 +64,7 @@ describe('screen module', () => { expect(workAreaSize).to.have.property('height').that.is.greaterThan(0); }); - it('has a bounds object property', function () { - if (process.platform === 'linux') this.skip(); + ifit(process.platform !== 'linux')('has a bounds object property', function () { const display = screen.getPrimaryDisplay(); expect(display).to.have.property('bounds').that.is.an('object'); diff --git a/spec/api-session-spec.ts b/spec/api-session-spec.ts index 18cf97a1f8e..5fbb9cb817b 100644 --- a/spec/api-session-spec.ts +++ b/spec/api-session-spec.ts @@ -172,7 +172,8 @@ describe('session module', () => { expect(list.some(cookie => cookie.name === name && cookie.value === value)).to.equal(false); }); - it.skip('should set cookie for standard scheme', async () => { + // DISABLED-FIXME + it('should set cookie for standard scheme', async () => { const { cookies } = session.defaultSession; const domain = 'fake-host'; const url = `${standardScheme}://${domain}`; diff --git a/spec/api-web-contents-spec.ts b/spec/api-web-contents-spec.ts index cabb706c9f5..486aa9735d4 100644 --- a/spec/api-web-contents-spec.ts +++ b/spec/api-web-contents-spec.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as http from 'http'; import { BrowserWindow, ipcMain, webContents, session, app, BrowserView } from 'electron/main'; import { closeAllWindows } from './lib/window-helpers'; -import { ifdescribe, defer, waitUntil, listen } from './lib/spec-helpers'; +import { ifdescribe, defer, waitUntil, listen, ifit } from './lib/spec-helpers'; import { once } from 'events'; import { setTimeout } from 'timers/promises'; @@ -372,10 +372,9 @@ describe('webContents module', () => { .and.have.property('code', 'ERR_FILE_NOT_FOUND'); }); - // Temporarily disable on WOA until + // FIXME: Temporarily disable on WOA until // https://github.com/electron/electron/issues/20008 is resolved - const testFn = (process.platform === 'win32' && process.arch === 'arm64' ? it.skip : it); - testFn('rejects when loading fails due to DNS not resolved', async () => { + ifit(!(process.platform === 'win32' && process.arch === 'arm64'))('rejects when loading fails due to DNS not resolved', async () => { await expect(w.loadURL('https://err.name.not.resolved')).to.eventually.be.rejected() .and.have.property('code', 'ERR_NAME_NOT_RESOLVED'); }); @@ -489,8 +488,8 @@ describe('webContents module', () => { describe('getFocusedWebContents() API', () => { afterEach(closeAllWindows); - const testFn = (process.platform === 'win32' && process.arch === 'arm64' ? it.skip : it); - testFn('returns the focused web contents', async () => { + // FIXME + ifit(!(process.platform === 'win32' && process.arch === 'arm64'))('returns the focused web contents', async () => { const w = new BrowserWindow({ show: true }); await w.loadFile(path.join(__dirname, 'fixtures', 'blank.html')); expect(webContents.getFocusedWebContents().id).to.equal(w.webContents.id); diff --git a/spec/api-web-frame-main-spec.ts b/spec/api-web-frame-main-spec.ts index 5c049ede3fb..4f155850bb3 100644 --- a/spec/api-web-frame-main-spec.ts +++ b/spec/api-web-frame-main-spec.ts @@ -185,9 +185,8 @@ describe('webFrameMain module', () => { }); describe('WebFrame.visibilityState', () => { - // TODO(MarshallOfSound): Fix flaky test - // @flaky-test - it.skip('should match window state', async () => { + // DISABLED-FIXME(MarshallOfSound): Fix flaky test + it('should match window state', async () => { const w = new BrowserWindow({ show: true }); await w.loadURL('about:blank'); const webFrame = w.webContents.mainFrame; diff --git a/spec/asar-spec.ts b/spec/asar-spec.ts index eded87919d5..6075d411d05 100644 --- a/spec/asar-spec.ts +++ b/spec/asar-spec.ts @@ -1410,8 +1410,8 @@ describe('asar package', function () { expect(process.noAsar).to.be.false(); }); }); - /* + /* describe('process.env.ELECTRON_NO_ASAR', function () { before(function () { if (!features.isRunAsNodeEnabled()) { diff --git a/spec/chromium-spec.ts b/spec/chromium-spec.ts index 3453afa0d39..cbdd2fd643a 100644 --- a/spec/chromium-spec.ts +++ b/spec/chromium-spec.ts @@ -19,9 +19,9 @@ const features = process._linkedBinding('electron_common_features'); const fixturesPath = path.resolve(__dirname, 'fixtures'); describe('reporting api', () => { - // TODO(nornagon): this started failing a lot on CI. Figure out why and fix + // FIXME(nornagon): this started failing a lot on CI. Figure out why and fix // it. - it.skip('sends a report for a deprecation', async () => { + it('sends a report for a deprecation', async () => { const reports = new EventEmitter(); // The Reporting API only works on https with valid certs. To dodge having @@ -1107,8 +1107,8 @@ describe('chromium features', () => { expect(frameName).to.equal('__proto__'); }); - // TODO(nornagon): I'm not sure this ... ever was correct? - it.skip('inherit options of parent window', async () => { + // FIXME(nornagon): I'm not sure this ... ever was correct? + xit('inherit options of parent window', async () => { const w = new BrowserWindow({ show: false, width: 123, height: 456 }); w.loadFile(path.resolve(__dirname, 'fixtures', 'blank.html')); const url = `file://${fixturesPath}/pages/window-open-size.html`; @@ -2214,14 +2214,11 @@ describe('chromium features', () => { }); }); + // FIXME(nornagon): this is broken on CI, it triggers: + // [FATAL:speech_synthesis.mojom-shared.h(237)] The outgoing message will + // trigger VALIDATION_ERROR_UNEXPECTED_NULL_POINTER at the receiving side + // (null text in SpeechSynthesisUtterance struct). ifdescribe(features.isTtsEnabled())('SpeechSynthesis', () => { - before(function () { - // TODO(nornagon): this is broken on CI, it triggers: - // [FATAL:speech_synthesis.mojom-shared.h(237)] The outgoing message will - // trigger VALIDATION_ERROR_UNEXPECTED_NULL_POINTER at the receiving side - // (null text in SpeechSynthesisUtterance struct). - this.skip(); - }); itremote('should emit lifecycle events', async () => { const sentence = `long sentence which will take at least a few seconds to utter so that it's possible to pause and resume before the end`; diff --git a/spec/disabled-tests.json b/spec/disabled-tests.json index afafc539b21..8765f602a89 100644 --- a/spec/disabled-tests.json +++ b/spec/disabled-tests.json @@ -1,3 +1,16 @@ [ - "// NOTE: this file is used to disable tests in our test suite by their full title." + "// NOTE: this file is used to disable tests in our test suite by their full title.", + "BrowserWindow module BrowserWindow.loadURL(url) should emit did-fail-load event for files that do not exist", + "BrowserWindow module document.visibilityState/hidden visibilityState remains visible if backgroundThrottling is disabled", + "Menu module Menu.setApplicationMenu unsets a menu with null", + "process module main process process.takeHeapSnapshot() returns true on success", + "protocol module protocol.registerFileProtocol throws an error when custom headers are invalid", + "protocol module protocol.registerProtocol throws an error when custom headers are invalid", + "protocol module protocol.registerSchemesAsPrivileged standard can access files through the FileSystem API", + "protocol module protocol.registerSchemesAsPrivileged cors-fetch disallows CORS and fetch requests when only supportFetchAPI is specified", + "session module ses.cookies should set cookie for standard scheme", + "webFrameMain module WebFrame.visibilityState should match window state", + "reporting api sends a report for a deprecation", + "chromium features SpeechSynthesis should emit lifecycle events", + "version-bumper nextVersion bump versions bumps to beta from nightly" ] \ No newline at end of file diff --git a/spec/extensions-spec.ts b/spec/extensions-spec.ts index f76e5a43bf7..53bf131a592 100644 --- a/spec/extensions-spec.ts +++ b/spec/extensions-spec.ts @@ -589,9 +589,9 @@ describe('chrome extensions', () => { }); }); - // TODO(nornagon): real extensions don't load on file: urls, so this + // FIXME(nornagon): real extensions don't load on file: urls, so this // test needs to be updated to serve its content over http. - describe.skip('supports "all_frames" option', () => { + xdescribe('supports "all_frames" option', () => { const contentScript = path.resolve(fixtures, 'extensions/content-script'); // Computed style values diff --git a/spec/index.js b/spec/index.js index 672464277d9..80cdc341ceb 100644 --- a/spec/index.js +++ b/spec/index.js @@ -73,6 +73,7 @@ app.whenReady().then(async () => { ) ); mocha.suite.beforeEach(function () { + // TODO(clavin): add support for disabling *suites* by title, not just tests if (disabledTests.has(this.currentTest?.fullTitle())) { this.skip(); } diff --git a/spec/version-bump-spec.ts b/spec/version-bump-spec.ts index 8f38bf896a3..4a2593da281 100644 --- a/spec/version-bump-spec.ts +++ b/spec/version-bump-spec.ts @@ -132,8 +132,8 @@ describe('version-bumper', () => { ).to.be.rejectedWith('Cannot bump to beta from stable.'); }); - // TODO ELECTRON 15: Re-enable after Electron 15 alpha has released - it.skip('bumps to beta from nightly', async () => { + // DISABLED-FIXME(ELECTRON 15): Re-enable after Electron 15 alpha has released + it('bumps to beta from nightly', async () => { const version = 'v2.0.0-nightly.19950901'; const next = await nextVersion('beta', version); const matches = next.match(betaPattern); diff --git a/spec/visibility-state-spec.ts b/spec/visibility-state-spec.ts index 0d332536db1..77be3828e97 100644 --- a/spec/visibility-state-spec.ts +++ b/spec/visibility-state-spec.ts @@ -109,13 +109,9 @@ ifdescribe(process.platform !== 'linux')('document.visibilityState', () => { await once(ipcMain, 'visibility-change-visible'); }); - describe('on platforms that support occlusion detection', () => { + ifdescribe(process.platform === 'darwin')('on platforms that support occlusion detection', () => { let child: cp.ChildProcess; - before(function () { - if (process.platform !== 'darwin') this.skip(); - }); - const makeOtherWindow = (opts: { x: number; y: number; width: number; height: number; }) => { child = cp.spawn(process.execPath, [path.resolve(__dirname, 'fixtures', 'chromium', 'other-window.js'), `${opts.x}`, `${opts.y}`, `${opts.width}`, `${opts.height}`]); return new Promise(resolve => { diff --git a/spec/webview-spec.ts b/spec/webview-spec.ts index 8d0f78a5c80..299cd6f2beb 100644 --- a/spec/webview-spec.ts +++ b/spec/webview-spec.ts @@ -267,7 +267,7 @@ describe(' tag', function () { describe('devtools', () => { afterEach(closeAllWindows); - // This test is flaky on WOA, so skip it there. + // FIXME: This test is flaky on WOA, so skip it there. ifit(process.platform !== 'win32' || process.arch !== 'arm64')('loads devtools extensions registered on the parent window', async () => { const w = new BrowserWindow({ show: false, @@ -1745,7 +1745,9 @@ describe(' tag', function () { describe('media-started-playing and media-paused events', () => { it('emits when audio starts and stops playing', async function () { - if (!await w.executeJavaScript('document.createElement(\'audio\').canPlayType(\'audio/wav\')')) { return this.skip(); } + if (!await w.executeJavaScript('document.createElement(\'audio\').canPlayType(\'audio/wav\')')) { + return this.skip(); + } await loadWebView(w, { src: blankPageUrl });