Skip to content

Commit 0e29eee

Browse files
author
DavertMik
committed
added more fixes
1 parent c2ed276 commit 0e29eee

File tree

5 files changed

+84
-43
lines changed

5 files changed

+84
-43
lines changed

lib/command/workers/runTests.js

Lines changed: 74 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,38 +77,47 @@ const config = deepMerge(getConfig(options.config || testRoot), overrideConfigs)
7777

7878
function initializeListeners() {
7979
// suite
80-
event.dispatcher.on(event.suite.before, suite => sendToParentThread({ event: event.suite.before, workerIndex, data: suite.simplify() }))
81-
event.dispatcher.on(event.suite.after, suite => sendToParentThread({ event: event.suite.after, workerIndex, data: suite.simplify() }))
80+
event.dispatcher.on(event.suite.before, suite => safelySendToParent({ event: event.suite.before, workerIndex, data: suite.simplify() }))
81+
event.dispatcher.on(event.suite.after, suite => safelySendToParent({ event: event.suite.after, workerIndex, data: suite.simplify() }))
8282

8383
// calculate duration
8484
event.dispatcher.on(event.test.started, test => (test.start = new Date()))
8585

8686
// tests
87-
event.dispatcher.on(event.test.before, test => sendToParentThread({ event: event.test.before, workerIndex, data: test.simplify() }))
88-
event.dispatcher.on(event.test.after, test => sendToParentThread({ event: event.test.after, workerIndex, data: test.simplify() }))
87+
event.dispatcher.on(event.test.before, test => safelySendToParent({ event: event.test.before, workerIndex, data: test.simplify() }))
88+
event.dispatcher.on(event.test.after, test => safelySendToParent({ event: event.test.after, workerIndex, data: test.simplify() }))
8989
// we should force-send correct errors to prevent race condition
90-
event.dispatcher.on(event.test.finished, (test, err) => sendToParentThread({ event: event.test.finished, workerIndex, data: { ...test.simplify(), err } }))
91-
event.dispatcher.on(event.test.failed, (test, err) => sendToParentThread({ event: event.test.failed, workerIndex, data: { ...test.simplify(), err } }))
92-
event.dispatcher.on(event.test.passed, (test, err) => sendToParentThread({ event: event.test.passed, workerIndex, data: { ...test.simplify(), err } }))
93-
event.dispatcher.on(event.test.started, test => sendToParentThread({ event: event.test.started, workerIndex, data: test.simplify() }))
94-
event.dispatcher.on(event.test.skipped, test => sendToParentThread({ event: event.test.skipped, workerIndex, data: test.simplify() }))
90+
event.dispatcher.on(event.test.finished, (test, err) => {
91+
const simplifiedData = test.simplify()
92+
const serializableErr = serializeError(err)
93+
safelySendToParent({ event: event.test.finished, workerIndex, data: { ...simplifiedData, err: serializableErr } })
94+
})
95+
event.dispatcher.on(event.test.failed, (test, err) => {
96+
const simplifiedData = test.simplify()
97+
const serializableErr = serializeError(err)
98+
safelySendToParent({ event: event.test.failed, workerIndex, data: { ...simplifiedData, err: serializableErr } })
99+
})
100+
event.dispatcher.on(event.test.passed, (test, err) => safelySendToParent({ event: event.test.passed, workerIndex, data: { ...test.simplify(), err } }))
101+
event.dispatcher.on(event.test.started, test => safelySendToParent({ event: event.test.started, workerIndex, data: test.simplify() }))
102+
event.dispatcher.on(event.test.skipped, test => safelySendToParent({ event: event.test.skipped, workerIndex, data: test.simplify() }))
95103

96104
// steps
97-
event.dispatcher.on(event.step.finished, step => sendToParentThread({ event: event.step.finished, workerIndex, data: step.simplify() }))
98-
event.dispatcher.on(event.step.started, step => sendToParentThread({ event: event.step.started, workerIndex, data: step.simplify() }))
99-
event.dispatcher.on(event.step.passed, step => sendToParentThread({ event: event.step.passed, workerIndex, data: step.simplify() }))
100-
event.dispatcher.on(event.step.failed, step => sendToParentThread({ event: event.step.failed, workerIndex, data: step.simplify() }))
101-
102-
event.dispatcher.on(event.hook.failed, (hook, err) => sendToParentThread({ event: event.hook.failed, workerIndex, data: { ...hook.simplify(), err } }))
103-
event.dispatcher.on(event.hook.passed, hook => sendToParentThread({ event: event.hook.passed, workerIndex, data: hook.simplify() }))
104-
event.dispatcher.on(event.hook.finished, hook => sendToParentThread({ event: event.hook.finished, workerIndex, data: hook.simplify() }))
105-
106-
event.dispatcher.once(event.all.after, () => {
107-
sendToParentThread({ event: event.all.after, workerIndex, data: container.result().simplify() })
105+
event.dispatcher.on(event.step.finished, step => safelySendToParent({ event: event.step.finished, workerIndex, data: step.simplify() }))
106+
event.dispatcher.on(event.step.started, step => safelySendToParent({ event: event.step.started, workerIndex, data: step.simplify() }))
107+
event.dispatcher.on(event.step.passed, step => safelySendToParent({ event: event.step.passed, workerIndex, data: step.simplify() }))
108+
event.dispatcher.on(event.step.failed, step => safelySendToParent({ event: event.step.failed, workerIndex, data: step.simplify() }))
109+
110+
event.dispatcher.on(event.hook.failed, (hook, err) => {
111+
const serializableErr = serializeError(err)
112+
safelySendToParent({ event: event.hook.failed, workerIndex, data: { ...hook.simplify(), err: serializableErr } })
108113
})
114+
event.dispatcher.on(event.hook.passed, hook => safelySendToParent({ event: event.hook.passed, workerIndex, data: hook.simplify() }))
115+
event.dispatcher.on(event.hook.finished, hook => safelySendToParent({ event: event.hook.finished, workerIndex, data: hook.simplify() }))
116+
117+
event.dispatcher.once(event.all.after, () => safelySendToParent({ event: event.all.after, workerIndex, data: container.result().simplify() }))
109118
// all
110119
event.dispatcher.once(event.all.result, () => {
111-
sendToParentThread({ event: event.all.result, workerIndex, data: container.result().simplify() })
120+
safelySendToParent({ event: event.all.result, workerIndex, data: container.result().simplify() })
112121
parentPort?.close()
113122
})
114123
}
@@ -117,6 +126,50 @@ function disablePause() {
117126
global.pause = () => {}
118127
}
119128

129+
function serializeError(err) {
130+
if (!err) return null
131+
try {
132+
return {
133+
message: err.message,
134+
stack: err.stack,
135+
name: err.name,
136+
actual: err.actual,
137+
expected: err.expected,
138+
}
139+
} catch {
140+
return { message: 'Error could not be serialized', name: 'Error' }
141+
}
142+
}
143+
144+
function safelySendToParent(data) {
145+
try {
146+
parentPort?.postMessage(data)
147+
} catch (cloneError) {
148+
// Fallback for non-serializable data
149+
const fallbackData = { ...data }
150+
151+
// Try to serialize error objects if present
152+
if (fallbackData.data && fallbackData.data.err) {
153+
fallbackData.data.err = serializeError(fallbackData.data.err)
154+
}
155+
156+
// If still fails, send minimal data
157+
try {
158+
parentPort?.postMessage(fallbackData)
159+
} catch (finalError) {
160+
parentPort?.postMessage({
161+
event: data.event,
162+
workerIndex,
163+
data: {
164+
title: fallbackData.data?.title || 'Unknown',
165+
state: fallbackData.data?.state || 'error',
166+
err: { message: 'Data could not be serialized' },
167+
},
168+
})
169+
}
170+
}
171+
}
172+
120173
function sendToParentThread(data) {
121174
parentPort?.postMessage(data)
122175
}

lib/helper/WebDriver.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ let webdriverio
22

33
import assert from 'assert'
44
import path from 'path'
5+
import crypto from 'crypto'
56
import Helper from '@codeceptjs/helper'
67
import promiseRetry from 'promise-retry'
78
import { includes as stringIncludes } from '../assert/include.js'
@@ -2610,7 +2611,6 @@ class WebDriver extends Helper {
26102611
*/
26112612
async openNewTab(url = 'about:blank', windowName = null) {
26122613
const client = this.browser
2613-
const crypto = require('crypto')
26142614
if (windowName == null) {
26152615
windowName = crypto.randomBytes(32).toString('hex')
26162616
}

lib/index.js

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import locator from './locator.js'
2222
import heal from './heal.js'
2323
import ai from './ai.js'
2424
import Workers from './workers.js'
25+
import Secret, { secret } from './secret.js'
2526

2627
export default {
2728
/** @type {typeof CodeceptJS.Codecept} */
@@ -61,25 +62,12 @@ export default {
6162
ai,
6263

6364
Workers,
65+
66+
/** @type {typeof CodeceptJS.Secret} */
67+
Secret,
68+
/** @type {typeof CodeceptJS.secret} */
69+
secret,
6470
}
6571

6672
// Named exports for ESM compatibility
67-
export {
68-
codecept,
69-
output,
70-
container,
71-
event,
72-
recorder,
73-
config,
74-
actor,
75-
helper,
76-
pause,
77-
within,
78-
dataTable,
79-
dataTableArgument,
80-
store,
81-
locator,
82-
heal,
83-
ai,
84-
Workers
85-
}
73+
export { codecept, output, container, event, recorder, config, actor, helper, pause, within, dataTable, dataTableArgument, store, locator, heal, ai, Workers, Secret, secret }

test/acceptance/session_test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ Scenario('should work with within @Puppeteer @Playwright', ({ I }) => {
137137
I.seeCheckboxIsChecked({ css: 'form[name=form1] input[name=first_test_radio]' })
138138
I.dontSeeCheckboxIsChecked({ css: 'form[name=form2] input[name=first_test_radio]' })
139139
})
140-
})
140+
}).retry(2)
141141

142142
Scenario('change page emulation @Playwright', async ({ I }) => {
143143
I.amOnPage('/')

test/docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ services:
22
test-rest:
33
<<: &test-service
44
build: ..
5-
entrypoint: /codecept/node_modules/.bin/mocha
5+
entrypoint: npx mocha
66
working_dir: /codecept
77
env_file: .env
88
volumes:

0 commit comments

Comments
 (0)