Files
cypress/cli/lib/exec/xvfb.js
2021-09-30 16:50:39 -04:00

109 lines
2.6 KiB
JavaScript

const os = require('os')
const Promise = require('bluebird')
const Xvfb = require('@cypress/xvfb')
const { stripIndent } = require('common-tags')
const Debug = require('debug')
const { throwFormErrorText, errors } = require('../errors')
const util = require('../util')
const debug = Debug('cypress:cli')
const debugXvfb = Debug('cypress:xvfb')
debug.Debug = debugXvfb.Debug = Debug
const xvfbOptions = {
displayNum: process.env.XVFB_DISPLAY_NUM,
timeout: 30000, // milliseconds
// need to explicitly define screen otherwise electron will crash
// https://github.com/cypress-io/cypress/issues/6184
xvfb_args: ['-screen', '0', '1280x1024x24'],
onStderrData (data) {
if (debugXvfb.enabled) {
debugXvfb(data.toString())
}
},
}
const xvfb = Promise.promisifyAll(new Xvfb(xvfbOptions))
module.exports = {
_debugXvfb: debugXvfb, // expose for testing
_xvfb: xvfb, // expose for testing
_xvfbOptions: xvfbOptions, // expose for testing
start () {
debug('Starting Xvfb')
return xvfb.startAsync()
.return(null)
.catch({ nonZeroExitCode: true }, throwFormErrorText(errors.nonZeroExitCodeXvfb))
.catch((err) => {
if (err.known) {
throw err
}
return throwFormErrorText(errors.missingXvfb)(err)
})
},
stop () {
debug('Stopping Xvfb')
return xvfb.stopAsync()
.return(null)
.catch(() => {
// noop
})
},
isNeeded () {
if (process.env.ELECTRON_RUN_AS_NODE) {
debug('Environment variable ELECTRON_RUN_AS_NODE detected, xvfb is not needed')
return false // xvfb required for electron processes only.
}
if (os.platform() !== 'linux') {
return false
}
if (process.env.DISPLAY) {
const issueUrl = util.getGitHubIssueUrl(4034)
const message = stripIndent`
DISPLAY environment variable is set to ${process.env.DISPLAY} on Linux
Assuming this DISPLAY points at working X11 server,
Cypress will not spawn own Xvfb
NOTE: if the X11 server is NOT working, Cypress will exit without explanation,
see ${issueUrl}
Solution: Unset the DISPLAY variable and try again:
DISPLAY= npx cypress run ...
`
debug(message)
return false
}
debug('undefined DISPLAY environment variable')
debug('Cypress will spawn its own Xvfb')
return true
},
// async method, resolved with Boolean
verify () {
return xvfb.startAsync()
.return(true)
.catch((err) => {
debug('Could not verify xvfb: %s', err.message)
return false
})
.finally(xvfb.stopAsync)
},
}