Skip to content

Commit 0f786ab

Browse files
authored
fix: ct testing support for node 17+ (#21430)
1 parent d45c9f8 commit 0f786ab

File tree

15 files changed

+104
-95
lines changed

15 files changed

+104
-95
lines changed

cli/lib/util.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ const util = {
315315
// To be removed when the Cypress binary pulls in the @cypress/webpack-batteries-included-preprocessor
316316
// version that has been updated to webpack >= 5.61, which no longer relies on
317317
// Node's builtin crypto.hash function.
318-
if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && process.versions.openssl.startsWith('3.')) {
318+
if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && semver.satisfies(process.versions.openssl, '>=3', { includePrerelease: true })) {
319319
opts.ORIGINAL_NODE_OPTIONS = `${opts.ORIGINAL_NODE_OPTIONS || ''} --openssl-legacy-provider`
320320
}
321321

npm/webpack-dev-server/src/createWebpackDevServer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function webpackDevServer4 (
6868
const { devServerConfig: { cypressConfig: { devServerPublicPathRoute } } } = config
6969
const WebpackDevServer = config.sourceWebpackModulesResult.webpackDevServer.module
7070
const webpackDevServerConfig = {
71-
host: 'localhost',
71+
host: '127.0.0.1',
7272
port: 'auto',
7373
// @ts-ignore
7474
...finalWebpackConfig?.devServer,

npm/webpack-dev-server/test/devServer-e2e.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import './support'
1212
const requestSpecFile = (file: string, port: number) => {
1313
return new Promise((res) => {
1414
const opts = {
15-
host: 'localhost',
15+
host: '127.0.0.1',
1616
port,
1717
path: encodeURI(file),
1818
}

packages/extension/gulpfile.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import gulp from 'gulp'
22
import rimraf from 'rimraf'
3-
import webpack from 'webpack'
43
import * as cypressIcons from '@packages/icons'
5-
import webpackConfig from './webpack.config.js'
4+
import cp from 'child_process'
5+
import util from 'util'
6+
const exec = util.promisify(cp.exec)
67

78
const clean = (done) => {
89
rimraf('dist', done)
@@ -14,9 +15,7 @@ const manifest = () => {
1415
}
1516

1617
const background = (cb) => {
17-
const compiler = webpack(webpackConfig as webpack.Configuration)
18-
19-
compiler.run(cb)
18+
exec('node ../../scripts/run-webpack.js').then(() => cb()).catch(cb)
2019
}
2120

2221
const html = () => {

packages/extension/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"test-debug": "yarn test-unit --inspect-brk=5566",
1414
"test-unit": "cross-env NODE_ENV=test mocha -r @packages/ts/register --reporter mocha-multi-reporters --reporter-options configFile=../../mocha-reporter-config.json",
1515
"test-watch": "yarn test-unit --watch",
16-
"watch": "webpack --watch --progress"
16+
"watch": "node ../../scripts/run-webpack --watch --progress"
1717
},
1818
"dependencies": {
1919
"bluebird": "3.5.3",

packages/reporter/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"browser": "src/main.tsx",
66
"scripts": {
7-
"build-for-tests": "webpack",
7+
"build-for-tests": "node ../../scripts/run-webpack",
88
"clean-deps": "rimraf node_modules",
99
"cypress:open": "node ../../scripts/cypress open --project .",
1010
"cypress:run": "node ../../scripts/cypress run --project .",

packages/runner-ct/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
"private": true,
55
"browser": "src/index.js",
66
"scripts": {
7-
"build": "webpack",
7+
"build": "node ../../scripts/run-webpack",
88
"build-prod": "cross-env NODE_ENV=production yarn build && tsc",
99
"clean-deps": "rimraf node_modules",
1010
"cypress:open": "ts-node ../../scripts/cypress.js open --component --project .",
1111
"cypress:run": "ts-node ../../scripts/cypress.js run --component --project .",
1212
"postinstall": "echo '@packages/runner needs: yarn build'",
1313
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.json src",
1414
"test": "ts-node ../../scripts/cypress.js run --component --project .",
15-
"watch": "webpack --watch --progress --config webpack.config.ts"
15+
"watch": "node ../../scripts/run-webpack --watch --progress --config webpack.config.ts"
1616
},
1717
"dependencies": {},
1818
"devDependencies": {

packages/runner/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"browser": "src/index.js",
66
"scripts": {
7-
"build": "webpack",
7+
"build": "node ../../scripts/run-webpack",
88
"build-prod": "cross-env NODE_ENV=production yarn build",
99
"clean-deps": "rimraf node_modules",
1010
"cypress:open": "node ../../scripts/cypress open",
@@ -14,7 +14,7 @@
1414
"test-debug": "yarn test-unit --inspect-brk=5566",
1515
"test-unit": "mocha --config test/.mocharc.json src/**/*.spec.* --exit",
1616
"test-watch": "yarn test-unit --watch",
17-
"watch": "webpack --watch --progress"
17+
"watch": "node ../../scripts/run-webpack --watch --progress"
1818
},
1919
"devDependencies": {
2020
"@cypress/react-tooltip": "0.5.3",

packages/ui-components/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"main": "src/index.tsx",
66
"scripts": {
7-
"build-for-tests": "webpack",
7+
"build-for-tests": "node ../../scripts/run-webpack",
88
"check-deps": "node ../../scripts/check-deps.js --verbose",
99
"check-deps-pre": "npm run check-deps -- --prescript",
1010
"clean-deps": "rimraf node_modules",
@@ -39,6 +39,6 @@
3939
"react-dom": "16.8.6",
4040
"rimraf": "3.0.2",
4141
"webpack": "^4.44.2",
42-
"webpack-cli": "3.3.11"
42+
"webpack-cli": "3.3.2"
4343
}
4444
}

packages/web-config/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"sass-loader": "10.1.0",
4040
"sinon-chai": "3.3.0",
4141
"webpack": "^4.44.2",
42-
"webpack-cli": "3.3.11",
42+
"webpack-cli": "3.3.2",
4343
"webpack-livereload-plugin": "2.3.0"
4444
}
4545
}

scripts/gulp/tasks/gulpWebpack.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import pDefer from 'p-defer'
33
import { monorepoPaths } from '../monorepoPaths'
44
import { universalSpawn } from '../utils/childProcessUtils'
55
import { addChildProcess } from './gulpRegistry'
6+
import semver from 'semver'
7+
8+
type Env = typeof process.env
69

710
export function webpackRunner () {
811
return runWebpack({
@@ -16,10 +19,27 @@ type RunWebpackCfg = {
1619
cwd: string
1720
prefix: string
1821
args?: string[]
19-
env?: object
22+
env?: Env
2023
devServer?: boolean
2124
}
2225

26+
// https://github.com/cypress-io/cypress/issues/18914
27+
// Node 17+ ships with OpenSSL 3 by default, so we may need the option
28+
// --openssl-legacy-provider so that webpack@4 can use the legacy MD4 hash
29+
// function. This option doesn't exist on Node <17 or when it is built
30+
// against OpenSSL 1, so we have to detect Node's major version and check
31+
// which version of OpenSSL it was built against before spawning the process.
32+
//
33+
// Can be removed once the webpack version is upgraded to >= 5.61,
34+
// which no longer relies on Node's builtin crypto.hash function.
35+
function useLegacyOpenSSLProvider (env: Env) {
36+
if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && semver.satisfies(process.versions.openssl, '>=3', { includePrerelease: true })) {
37+
return { NODE_OPTIONS: `${env.NODE_OPTIONS ?? ''} --openssl-legacy-provider` }
38+
}
39+
40+
return {}
41+
}
42+
2343
export async function runWebpack (cfg: RunWebpackCfg) {
2444
const { cwd, args = [], env = process.env, devServer = false, prefix } = cfg
2545
const dfd = pDefer()
@@ -32,6 +52,7 @@ export async function runWebpack (cfg: RunWebpackCfg) {
3252
cwd,
3353
env: {
3454
...(env || process.env),
55+
...useLegacyOpenSSLProvider(env),
3556
FORCE_COLOR: '1',
3657
},
3758
},

scripts/run-webpack.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const cp = require('child_process')
2+
const path = require('path')
3+
const semver = require('semver')
4+
5+
const webpackCli = path.join(__dirname, '..', 'node_modules', 'webpack-cli', 'bin', 'cli.js')
6+
7+
// https://github.com/cypress-io/cypress/issues/18914
8+
// Node 17+ ships with OpenSSL 3 by default, so we may need the option
9+
// --openssl-legacy-provider so that webpack@4 can use the legacy MD4 hash
10+
// function. This option doesn't exist on Node <17 or when it is built
11+
// against OpenSSL 1, so we have to detect Node's major version and check
12+
// which version of OpenSSL it was built against before spawning the process.
13+
//
14+
// Can be removed once the webpack version is upgraded to >= 5.61,
15+
// which no longer relies on Node's builtin crypto.hash function.
16+
17+
let NODE_OPTIONS = process.env.NODE_OPTIONS || ''
18+
19+
if (process.versions && semver.satisfies(process.versions.node, '>=17.0.0') && semver.satisfies(process.versions.openssl, '>=3', { includePrerelease: true })) {
20+
NODE_OPTIONS = `${NODE_OPTIONS} --openssl-legacy-provider`
21+
}
22+
23+
cp.execSync(`node ${webpackCli} ${process.argv.slice(2).join(' ')}`, { stdio: 'inherit', env: { ...process.env, NODE_OPTIONS } })

system-tests/lib/system-tests.ts

+1
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,7 @@ const systemTests = {
818818
const args = options.withBinary ? [
819819
`run`,
820820
`--project=${projectPath}`,
821+
options.testingType === 'component' ? '--component' : '--e2e',
821822
] : [
822823
require.resolve('@packages/server'),
823824
// hides a user warning to go through NPM module

system-tests/test-binary/node_versions_spec.ts

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
11
import systemTests from '../lib/system-tests'
22

33
function smokeTestDockerImage (dockerImage: string) {
4-
systemTests.it(`can run in ${dockerImage}`, {
5-
withBinary: true,
6-
browser: 'electron',
7-
dockerImage,
8-
spec: 'test1.js',
9-
specDir: 'tests',
10-
project: 'todos',
4+
context('e2e', () => {
5+
systemTests.it(`can run in ${dockerImage}`, {
6+
withBinary: true,
7+
browser: 'electron',
8+
dockerImage,
9+
spec: 'test1.js',
10+
specDir: 'tests',
11+
project: 'todos',
12+
})
13+
})
14+
15+
context('component', () => {
16+
systemTests.it(`can run in ${dockerImage}`, {
17+
withBinary: true,
18+
browser: 'electron',
19+
dockerImage,
20+
testingType: 'component',
21+
project: 'simple-ct',
22+
spec: 'src/simple_passing_component.cy.js',
23+
})
1124
})
1225
}
1326

14-
describe('e2e binary node versions', () => {
27+
describe('binary node versions', () => {
1528
[
1629
'cypress/base:12',
1730
'cypress/base:14',

0 commit comments

Comments
 (0)