ui5-test-runner 5.3.0 → 5.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +12 -9
- package/src/add-test-pages.js +8 -5
- package/src/browsers.js +301 -297
- package/src/inject/post.js +10 -7
- package/src/inject/qunit-redirect.js +3 -2
- package/src/job.js +393 -392
- package/src/output.js +608 -604
- package/src/qunit-hooks.js +10 -4
package/src/browsers.js
CHANGED
|
@@ -1,297 +1,301 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const { fork } = require('child_process')
|
|
4
|
-
const { join } = require('path')
|
|
5
|
-
const { writeFile, readFile, open, stat, unlink } = require('fs/promises')
|
|
6
|
-
const { recreateDir, filename, allocPromise } = require('./tools')
|
|
7
|
-
const { getPageTimeout, pageTimedOut } = require('./timeout')
|
|
8
|
-
const { getOutput, newProgress } = require('./output')
|
|
9
|
-
const { resolvePackage } = require('./npm')
|
|
10
|
-
const { UTRError } = require('./error')
|
|
11
|
-
const { $browsers } = require('./symbols')
|
|
12
|
-
|
|
13
|
-
let lastScreenshotId = 0
|
|
14
|
-
const screenshots = {}
|
|
15
|
-
|
|
16
|
-
async function instantiate (job, config) {
|
|
17
|
-
const { dir, url } = config
|
|
18
|
-
await recreateDir(dir)
|
|
19
|
-
const browserConfig = {
|
|
20
|
-
capabilities: job.browserCapabilities,
|
|
21
|
-
modules: job.browserModules,
|
|
22
|
-
...config,
|
|
23
|
-
args: job.browserArgs
|
|
24
|
-
}
|
|
25
|
-
const browserConfigPath = join(dir, 'browser.json')
|
|
26
|
-
await writeFile(browserConfigPath, JSON.stringify(browserConfig, undefined, 2))
|
|
27
|
-
const stdoutFilename = join(dir, 'stdout.txt')
|
|
28
|
-
const stderrFilename = join(dir, 'stderr.txt')
|
|
29
|
-
const stdout = await open(stdoutFilename, 'w')
|
|
30
|
-
const stderr = await open(stderrFilename, 'w')
|
|
31
|
-
const childProcess = fork(job.browser, [browserConfigPath], {
|
|
32
|
-
stdio: [0, stdout, stderr, 'ipc']
|
|
33
|
-
})
|
|
34
|
-
const { promise, resolve } = allocPromise()
|
|
35
|
-
childProcess.on('close', async code => {
|
|
36
|
-
await stdout.close()
|
|
37
|
-
await stderr.close()
|
|
38
|
-
if (code !== 0) {
|
|
39
|
-
getOutput(job).browserFailed(url, code, dir)
|
|
40
|
-
}
|
|
41
|
-
resolve(code)
|
|
42
|
-
})
|
|
43
|
-
childProcess.closed = promise
|
|
44
|
-
childProcess.stdoutFilename = stdoutFilename
|
|
45
|
-
childProcess.stderrFilename = stderrFilename
|
|
46
|
-
return childProcess
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function probe (job) {
|
|
50
|
-
if (job.browserCapabilities) {
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
const output = getOutput(job)
|
|
54
|
-
job.status = 'Probing browser instantiation command'
|
|
55
|
-
|
|
56
|
-
async function execute (folder) {
|
|
57
|
-
const dir = join(job.reportDir, folder)
|
|
58
|
-
const capabilities = join(dir, 'capabilities.json')
|
|
59
|
-
const childProcess = await instantiate(job, {
|
|
60
|
-
url: 'about:blank',
|
|
61
|
-
capabilities,
|
|
62
|
-
dir
|
|
63
|
-
})
|
|
64
|
-
const code = await childProcess.closed
|
|
65
|
-
if (code !== 0) {
|
|
66
|
-
throw UTRError.BROWSER_PROBE_FAILED(code.toString())
|
|
67
|
-
}
|
|
68
|
-
let browserCapabilities
|
|
69
|
-
try {
|
|
70
|
-
browserCapabilities = Object.assign({
|
|
71
|
-
modules: [],
|
|
72
|
-
screenshot: null,
|
|
73
|
-
scripts: false,
|
|
74
|
-
parallel: true,
|
|
75
|
-
traces: []
|
|
76
|
-
}, JSON.parse((await readFile(capabilities)).toString()))
|
|
77
|
-
} catch (e) {
|
|
78
|
-
throw UTRError.MISSING_OR_INVALID_BROWSER_CAPABILITIES(e.message)
|
|
79
|
-
}
|
|
80
|
-
return browserCapabilities
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const browserCapabilities = await execute('probe')
|
|
84
|
-
job.browserCapabilities = browserCapabilities
|
|
85
|
-
|
|
86
|
-
const { modules } = browserCapabilities
|
|
87
|
-
const resolvedModules = {}
|
|
88
|
-
if (modules.length) {
|
|
89
|
-
for await (const name of browserCapabilities.modules) {
|
|
90
|
-
resolvedModules[name] = await resolvePackage(job, name)
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
job.browserModules = resolvedModules
|
|
94
|
-
if (browserCapabilities['probe-with-modules']) {
|
|
95
|
-
job.browserCapabilities = await execute('probe/with-modules')
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
output
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
pageBrowser.
|
|
137
|
-
delete job[$browsers][url]
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
output.debug('screenshot', id, '
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { fork } = require('child_process')
|
|
4
|
+
const { join } = require('path')
|
|
5
|
+
const { writeFile, readFile, open, stat, unlink } = require('fs/promises')
|
|
6
|
+
const { recreateDir, filename, allocPromise } = require('./tools')
|
|
7
|
+
const { getPageTimeout, pageTimedOut } = require('./timeout')
|
|
8
|
+
const { getOutput, newProgress } = require('./output')
|
|
9
|
+
const { resolvePackage } = require('./npm')
|
|
10
|
+
const { UTRError } = require('./error')
|
|
11
|
+
const { $browsers } = require('./symbols')
|
|
12
|
+
|
|
13
|
+
let lastScreenshotId = 0
|
|
14
|
+
const screenshots = {}
|
|
15
|
+
|
|
16
|
+
async function instantiate (job, config) {
|
|
17
|
+
const { dir, url } = config
|
|
18
|
+
await recreateDir(dir)
|
|
19
|
+
const browserConfig = {
|
|
20
|
+
capabilities: job.browserCapabilities,
|
|
21
|
+
modules: job.browserModules,
|
|
22
|
+
...config,
|
|
23
|
+
args: job.browserArgs
|
|
24
|
+
}
|
|
25
|
+
const browserConfigPath = join(dir, 'browser.json')
|
|
26
|
+
await writeFile(browserConfigPath, JSON.stringify(browserConfig, undefined, 2))
|
|
27
|
+
const stdoutFilename = join(dir, 'stdout.txt')
|
|
28
|
+
const stderrFilename = join(dir, 'stderr.txt')
|
|
29
|
+
const stdout = await open(stdoutFilename, 'w')
|
|
30
|
+
const stderr = await open(stderrFilename, 'w')
|
|
31
|
+
const childProcess = fork(job.browser, [browserConfigPath], {
|
|
32
|
+
stdio: [0, stdout, stderr, 'ipc']
|
|
33
|
+
})
|
|
34
|
+
const { promise, resolve } = allocPromise()
|
|
35
|
+
childProcess.on('close', async code => {
|
|
36
|
+
await stdout.close()
|
|
37
|
+
await stderr.close()
|
|
38
|
+
if (code !== 0) {
|
|
39
|
+
getOutput(job).browserFailed(url, code, dir)
|
|
40
|
+
}
|
|
41
|
+
resolve(code)
|
|
42
|
+
})
|
|
43
|
+
childProcess.closed = promise
|
|
44
|
+
childProcess.stdoutFilename = stdoutFilename
|
|
45
|
+
childProcess.stderrFilename = stderrFilename
|
|
46
|
+
return childProcess
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function probe (job) {
|
|
50
|
+
if (job.browserCapabilities) {
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
const output = getOutput(job)
|
|
54
|
+
job.status = 'Probing browser instantiation command'
|
|
55
|
+
|
|
56
|
+
async function execute (folder) {
|
|
57
|
+
const dir = join(job.reportDir, folder)
|
|
58
|
+
const capabilities = join(dir, 'capabilities.json')
|
|
59
|
+
const childProcess = await instantiate(job, {
|
|
60
|
+
url: 'about:blank',
|
|
61
|
+
capabilities,
|
|
62
|
+
dir
|
|
63
|
+
})
|
|
64
|
+
const code = await childProcess.closed
|
|
65
|
+
if (code !== 0) {
|
|
66
|
+
throw UTRError.BROWSER_PROBE_FAILED(code.toString())
|
|
67
|
+
}
|
|
68
|
+
let browserCapabilities
|
|
69
|
+
try {
|
|
70
|
+
browserCapabilities = Object.assign({
|
|
71
|
+
modules: [],
|
|
72
|
+
screenshot: null,
|
|
73
|
+
scripts: false,
|
|
74
|
+
parallel: true,
|
|
75
|
+
traces: []
|
|
76
|
+
}, JSON.parse((await readFile(capabilities)).toString()))
|
|
77
|
+
} catch (e) {
|
|
78
|
+
throw UTRError.MISSING_OR_INVALID_BROWSER_CAPABILITIES(e.message)
|
|
79
|
+
}
|
|
80
|
+
return browserCapabilities
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const browserCapabilities = await execute('probe')
|
|
84
|
+
job.browserCapabilities = browserCapabilities
|
|
85
|
+
|
|
86
|
+
const { modules } = browserCapabilities
|
|
87
|
+
const resolvedModules = {}
|
|
88
|
+
if (modules.length) {
|
|
89
|
+
for await (const name of browserCapabilities.modules) {
|
|
90
|
+
resolvedModules[name] = await resolvePackage(job, name)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
job.browserModules = resolvedModules
|
|
94
|
+
if (browserCapabilities['probe-with-modules']) {
|
|
95
|
+
job.browserCapabilities = await execute('probe/with-modules')
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (job.debugCapabilitiesNoScript) {
|
|
99
|
+
job.browserCapabilities.scripts = false
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
output.browserCapabilities(job.browserCapabilities)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function start (job, url, scripts = []) {
|
|
106
|
+
const output = getOutput(job)
|
|
107
|
+
if (!job[$browsers]) {
|
|
108
|
+
job[$browsers] = {}
|
|
109
|
+
}
|
|
110
|
+
output.browserStart(url)
|
|
111
|
+
const reportDir = join(job.reportDir, filename(url))
|
|
112
|
+
const resolvedScripts = []
|
|
113
|
+
for await (const script of scripts) {
|
|
114
|
+
if (script.endsWith('.js')) {
|
|
115
|
+
const scriptFilename = join(__dirname, 'inject', script)
|
|
116
|
+
const scriptContent = (await readFile(scriptFilename)).toString()
|
|
117
|
+
resolvedScripts.push(scriptContent)
|
|
118
|
+
} else {
|
|
119
|
+
resolvedScripts.push(script)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (resolvedScripts.length) {
|
|
123
|
+
resolvedScripts.unshift(`(function () {
|
|
124
|
+
window['ui5-test-runner/base-host'] = 'http://localhost:${job.port}'
|
|
125
|
+
}())`)
|
|
126
|
+
}
|
|
127
|
+
const progress = newProgress(job, url)
|
|
128
|
+
const pageBrowser = {
|
|
129
|
+
url,
|
|
130
|
+
reportDir,
|
|
131
|
+
scripts: resolvedScripts,
|
|
132
|
+
retry: 0,
|
|
133
|
+
progress
|
|
134
|
+
}
|
|
135
|
+
const { promise, resolve, reject } = allocPromise()
|
|
136
|
+
pageBrowser.done = value => {
|
|
137
|
+
delete job[$browsers][url]
|
|
138
|
+
resolve(value)
|
|
139
|
+
}
|
|
140
|
+
pageBrowser.failed = reason => {
|
|
141
|
+
delete job[$browsers][url]
|
|
142
|
+
reject(reason)
|
|
143
|
+
}
|
|
144
|
+
job[$browsers][url] = pageBrowser
|
|
145
|
+
await run(job, pageBrowser)
|
|
146
|
+
try {
|
|
147
|
+
await promise
|
|
148
|
+
} finally {
|
|
149
|
+
progress.done()
|
|
150
|
+
output.browserStopped(url)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function run (job, pageBrowser) {
|
|
155
|
+
const output = getOutput(job)
|
|
156
|
+
const { url, retry, reportDir, scripts } = pageBrowser
|
|
157
|
+
let dir = reportDir
|
|
158
|
+
if (retry) {
|
|
159
|
+
output.browserRetry(url, retry)
|
|
160
|
+
dir = join(dir, retry.toString())
|
|
161
|
+
if (pageBrowser.console.count) {
|
|
162
|
+
try {
|
|
163
|
+
await pageBrowser.console.flush
|
|
164
|
+
.then(() => unlink(join(reportDir, 'console.jsonl')))
|
|
165
|
+
} catch (e) {
|
|
166
|
+
// ignore
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
pageBrowser.console = {
|
|
171
|
+
count: 0,
|
|
172
|
+
byApi: {},
|
|
173
|
+
flush: Promise.resolve()
|
|
174
|
+
}
|
|
175
|
+
await recreateDir(dir)
|
|
176
|
+
delete pageBrowser.stopped
|
|
177
|
+
const childProcess = await instantiate(job, {
|
|
178
|
+
url,
|
|
179
|
+
retry,
|
|
180
|
+
scripts,
|
|
181
|
+
dir
|
|
182
|
+
})
|
|
183
|
+
pageBrowser.childProcess = childProcess
|
|
184
|
+
const timeout = getPageTimeout(job)
|
|
185
|
+
if (timeout) {
|
|
186
|
+
pageBrowser.timeoutId = setTimeout(() => {
|
|
187
|
+
output.browserTimeout(url, dir)
|
|
188
|
+
pageTimedOut(job, url)
|
|
189
|
+
stop(job, url)
|
|
190
|
+
}, timeout)
|
|
191
|
+
}
|
|
192
|
+
childProcess.on('message', message => {
|
|
193
|
+
if (message.command === 'screenshot') {
|
|
194
|
+
const { id } = message
|
|
195
|
+
screenshots[id]()
|
|
196
|
+
delete screenshots[id]
|
|
197
|
+
} else if (message.command === 'console') {
|
|
198
|
+
++pageBrowser.console.count
|
|
199
|
+
if (!pageBrowser.console.byApi[message.api]) {
|
|
200
|
+
pageBrowser.console.byApi[message.api] = 1
|
|
201
|
+
} else {
|
|
202
|
+
++pageBrowser.console.byApi[message.api]
|
|
203
|
+
}
|
|
204
|
+
pageBrowser.console.flush = pageBrowser.console.flush
|
|
205
|
+
.then(() => writeFile(join(reportDir, 'console.jsonl'), JSON.stringify({
|
|
206
|
+
t: message.t,
|
|
207
|
+
api: message.api,
|
|
208
|
+
args: message.args
|
|
209
|
+
}) + '\n', {
|
|
210
|
+
flag: 'a+'
|
|
211
|
+
}))
|
|
212
|
+
}
|
|
213
|
+
})
|
|
214
|
+
childProcess.on('close', async code => {
|
|
215
|
+
if (!pageBrowser.stopped) {
|
|
216
|
+
if (code === 0) {
|
|
217
|
+
output.browserClosed(url, code, dir)
|
|
218
|
+
}
|
|
219
|
+
childProcess.closed.then(() => stop(job, url, true))
|
|
220
|
+
}
|
|
221
|
+
})
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
async function screenshot (job, url, filename) {
|
|
225
|
+
if (!job.browserCapabilities.screenshot) {
|
|
226
|
+
throw UTRError.BROWSER_SCREENSHOT_NOT_SUPPORTED()
|
|
227
|
+
}
|
|
228
|
+
const output = getOutput(job)
|
|
229
|
+
const id = ++lastScreenshotId
|
|
230
|
+
try {
|
|
231
|
+
const { childProcess, reportDir } = job[$browsers][url]
|
|
232
|
+
const absoluteFilename = join(reportDir, filename + job.browserCapabilities.screenshot)
|
|
233
|
+
if (childProcess.connected) {
|
|
234
|
+
output.debug('screenshot', id, url, absoluteFilename)
|
|
235
|
+
const { promise, resolve, reject } = allocPromise()
|
|
236
|
+
screenshots[id] = resolve
|
|
237
|
+
output.debug('screenshot', id, 'sending command')
|
|
238
|
+
childProcess.send({
|
|
239
|
+
id,
|
|
240
|
+
command: 'screenshot',
|
|
241
|
+
filename: absoluteFilename
|
|
242
|
+
})
|
|
243
|
+
const timeoutId = setTimeout(() => {
|
|
244
|
+
reject(UTRError.BROWSER_SCREENSHOT_TIMEOUT())
|
|
245
|
+
}, job.screenshotTimeout)
|
|
246
|
+
output.debug('screenshot', id, 'command sent, waiting for answer')
|
|
247
|
+
await promise
|
|
248
|
+
output.debug('screenshot', id, 'answer received')
|
|
249
|
+
clearTimeout(timeoutId)
|
|
250
|
+
const result = await stat(absoluteFilename)
|
|
251
|
+
output.debug('screenshot', id, 'file size :', result.size)
|
|
252
|
+
if (!result.isFile() || result.size === 0) {
|
|
253
|
+
throw new Error('File expected')
|
|
254
|
+
}
|
|
255
|
+
output.debug('screenshot', id, 'done')
|
|
256
|
+
return absoluteFilename
|
|
257
|
+
}
|
|
258
|
+
} catch (e) {
|
|
259
|
+
output.debug('screenshot', id, e.message)
|
|
260
|
+
if (e.code === UTRError.BROWSER_SCREENSHOT_TIMEOUT_CODE) {
|
|
261
|
+
throw e
|
|
262
|
+
}
|
|
263
|
+
throw UTRError.BROWSER_SCREENSHOT_FAILED(e.toString())
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async function stop (job, url, retry = false) {
|
|
268
|
+
const pageBrowser = job[$browsers][url]
|
|
269
|
+
if (pageBrowser) {
|
|
270
|
+
pageBrowser.stopped = true
|
|
271
|
+
const { childProcess, done, failed, timeoutId } = pageBrowser
|
|
272
|
+
if (timeoutId) {
|
|
273
|
+
clearTimeout(timeoutId)
|
|
274
|
+
}
|
|
275
|
+
if (childProcess.connected) {
|
|
276
|
+
/* istanbul ignore else */
|
|
277
|
+
if (!job.debugKeepBrowserOpen) {
|
|
278
|
+
childProcess.send({ command: 'stop' })
|
|
279
|
+
}
|
|
280
|
+
const { promise: closeTimeout, resolve } = allocPromise()
|
|
281
|
+
const timeoutId = setTimeout(resolve, job.browserCloseTimeout)
|
|
282
|
+
await Promise.race([
|
|
283
|
+
childProcess.closed,
|
|
284
|
+
closeTimeout
|
|
285
|
+
])
|
|
286
|
+
clearTimeout(timeoutId)
|
|
287
|
+
}
|
|
288
|
+
await pageBrowser.console.flush
|
|
289
|
+
if (retry) {
|
|
290
|
+
if (++pageBrowser.retry <= job.browserRetry) {
|
|
291
|
+
run(job, pageBrowser)
|
|
292
|
+
} else {
|
|
293
|
+
failed(UTRError.BROWSER_FAILED())
|
|
294
|
+
}
|
|
295
|
+
} else {
|
|
296
|
+
done()
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
module.exports = { probe, start, screenshot, stop }
|
package/src/inject/post.js
CHANGED
|
@@ -74,6 +74,8 @@
|
|
|
74
74
|
|
|
75
75
|
window['ui5-test-runner/stringify'] = stringify
|
|
76
76
|
|
|
77
|
+
const xPageUrl = top.location.toString()
|
|
78
|
+
|
|
77
79
|
window[MODULE] = function post (url, data) {
|
|
78
80
|
function request () {
|
|
79
81
|
return new Promise(function (resolve, reject) {
|
|
@@ -85,18 +87,19 @@
|
|
|
85
87
|
reject(xhr.statusText)
|
|
86
88
|
})
|
|
87
89
|
xhr.open('POST', base + '/_/' + url)
|
|
88
|
-
xhr.setRequestHeader('x-page-url',
|
|
90
|
+
xhr.setRequestHeader('x-page-url', xPageUrl)
|
|
89
91
|
xhr.setRequestHeader('content-type', 'application/json')
|
|
90
92
|
const json = stringify(data)
|
|
91
|
-
xhr.setRequestHeader('content-length', json.length)
|
|
92
93
|
xhr.send(json)
|
|
93
94
|
})
|
|
94
95
|
}
|
|
95
|
-
lastPost = lastPost
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
lastPost = lastPost.then(request)
|
|
97
|
+
if (!window.__unsafe__) {
|
|
98
|
+
lastPost = lastPost
|
|
99
|
+
.then(undefined, function (reason) {
|
|
100
|
+
console.error('Failed to POST to ' + url + '\nreason: ' + reason.toString())
|
|
101
|
+
})
|
|
102
|
+
}
|
|
100
103
|
return lastPost
|
|
101
104
|
}
|
|
102
105
|
}())
|
|
@@ -45,9 +45,10 @@
|
|
|
45
45
|
})
|
|
46
46
|
|
|
47
47
|
function notify () {
|
|
48
|
-
const
|
|
48
|
+
const moduleIds = QUnit.config.modules.map(({ moduleId }) => moduleId).filter(moduleId => !!moduleId)
|
|
49
|
+
const moduleNames = QUnit.config.modules.map(({ name }) => name)
|
|
49
50
|
const opa = !!window?.sap?.ui?.test?.Opa5
|
|
50
|
-
post('addTestPages', { type: 'qunit', opa,
|
|
51
|
+
post('addTestPages', { type: 'qunit', opa, module: { ids: moduleIds.length ? moduleIds : undefined, names: moduleNames }, page: location.toString() })
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
}
|