1 | 'use strict'
|
2 |
|
3 | const { probe, start } = require('./browsers')
|
4 | const { instrument } = require('./coverage')
|
5 | const { recreateDir } = require('./tools')
|
6 | const { globallyTimedOut } = require('./timeout')
|
7 | const { save, generate } = require('./report')
|
8 | const { getOutput } = require('./output')
|
9 | const {
|
10 | $probeUrlsStarted,
|
11 | $probeUrlsCompleted,
|
12 | $testPagesStarted,
|
13 | $testPagesCompleted
|
14 | } = require('./symbols')
|
15 | const { UTRError } = require('./error')
|
16 | const { $proxifiedUrls } = require('./symbols')
|
17 |
|
18 | async function run (task, job) {
|
19 | const {
|
20 | urlsMember,
|
21 | startedMember,
|
22 | completedMember,
|
23 | method
|
24 | } = task
|
25 | const output = getOutput(job)
|
26 | const urls = job[urlsMember]
|
27 | const { length } = urls
|
28 | if (job[completedMember] === length) {
|
29 | return
|
30 | }
|
31 | if (job[startedMember] === length) {
|
32 | return
|
33 | }
|
34 | const index = job[startedMember]++
|
35 | const url = urls[index]
|
36 | if (globallyTimedOut(job)) {
|
37 | output.globalTimeout(url)
|
38 | job.failed = true
|
39 | job.timedOut = true
|
40 | } else if (job.failFast && job.failed) {
|
41 | output.failFast(url)
|
42 | } else {
|
43 | try {
|
44 | await method(job, url)
|
45 | } catch (error) {
|
46 | job.failed = true
|
47 | }
|
48 | }
|
49 | ++job[completedMember]
|
50 | return run(task, job)
|
51 | }
|
52 |
|
53 | async function probeUrl (job, url) {
|
54 | const output = getOutput(job)
|
55 | try {
|
56 | let scripts
|
57 | if (job.mode === 'url' && job.browserCapabilities.scripts) {
|
58 | scripts = [
|
59 | 'post.js',
|
60 | 'qunit-redirect.js'
|
61 | ]
|
62 | }
|
63 | await start(job, url, scripts)
|
64 | } catch (error) {
|
65 | output.startFailed(url, error)
|
66 | throw error
|
67 | }
|
68 | }
|
69 |
|
70 | async function runTestPage (job, url) {
|
71 | const output = getOutput(job)
|
72 | try {
|
73 | let scripts
|
74 | if (job.browserCapabilities.scripts) {
|
75 | scripts = [
|
76 | 'post.js',
|
77 | 'qunit-intercept.js',
|
78 | 'qunit-hooks.js'
|
79 | ]
|
80 | if (job.coverage && !job.coverageProxy) {
|
81 | scripts.push(
|
82 | 'opa-iframe-coverage.js',
|
83 | 'ui5-coverage.js'
|
84 | )
|
85 | }
|
86 | }
|
87 | if (job.coverageProxy) {
|
88 | const { origin } = new URL(url)
|
89 | const proxifiedUrl = url.replace(origin, `http://localhost:${job.port}`)
|
90 | if (!job[$proxifiedUrls]) {
|
91 | job[$proxifiedUrls] = {}
|
92 | }
|
93 | job[$proxifiedUrls][proxifiedUrl] = url
|
94 | await start(job, proxifiedUrl, scripts)
|
95 | job.qunitPages[url] = job.qunitPages[proxifiedUrl]
|
96 | delete job.qunitPages[proxifiedUrl]
|
97 | } else {
|
98 | await start(job, url, scripts)
|
99 | }
|
100 | } catch (error) {
|
101 | output.startFailed(url, error)
|
102 | throw error
|
103 | }
|
104 | }
|
105 |
|
106 | function parallelize (task, job) {
|
107 | const {
|
108 | urlsMember,
|
109 | completedMember,
|
110 | startedMember
|
111 | } = task
|
112 | job[startedMember] = 0
|
113 | job[completedMember] = 0
|
114 | const max = Math.min(job.parallel, job[urlsMember].length)
|
115 | const promises = []
|
116 | for (let i = 0; i < max; ++i) {
|
117 | promises.push(run(task, job))
|
118 | }
|
119 | return Promise.all(promises)
|
120 | }
|
121 |
|
122 | async function process (job) {
|
123 | const output = getOutput(job)
|
124 | job.start = new Date()
|
125 | delete job.failed
|
126 | await instrument(job)
|
127 | await save(job)
|
128 | job.testPageUrls = []
|
129 |
|
130 | job.status = 'Probing urls'
|
131 | await parallelize({
|
132 | urlsMember: 'url',
|
133 | startedMember: $probeUrlsStarted,
|
134 | completedMember: $probeUrlsCompleted,
|
135 | method: probeUrl
|
136 | }, job)
|
137 |
|
138 |
|
139 | if (!job.debugProbeOnly) {
|
140 | if (job.testPageUrls.length !== 0) {
|
141 | job.status = 'Executing test pages'
|
142 | await parallelize({
|
143 | urlsMember: 'testPageUrls',
|
144 | startedMember: $testPagesStarted,
|
145 | completedMember: $testPagesCompleted,
|
146 | method: runTestPage
|
147 | }, job)
|
148 | } else if (Object.keys(job.qunitPages || []).length === 0) {
|
149 | output.noTestPageFound()
|
150 | job.failed = true
|
151 | }
|
152 | }
|
153 |
|
154 | await generate(job)
|
155 | }
|
156 |
|
157 | module.exports = {
|
158 | async execute (job) {
|
159 | await recreateDir(job.reportDir)
|
160 | getOutput(job).version()
|
161 | await probe(job)
|
162 | if (job.mode !== 'url') {
|
163 | job.url = [`http://localhost:${job.port}/${job.testsuite}`]
|
164 | } else if (!job.browserCapabilities.scripts) {
|
165 | throw UTRError.BROWSER_MISS_SCRIPTS_CAPABILITY()
|
166 | }
|
167 | return process(job)
|
168 | }
|
169 | }
|