UNPKG

4.13 kBJavaScriptView Raw
1'use strict'
2
3const { probe, start } = require('./browsers')
4const { instrument } = require('./coverage')
5const { recreateDir } = require('./tools')
6const { globallyTimedOut } = require('./timeout')
7const { save, generate } = require('./report')
8const { getOutput } = require('./output')
9const {
10 $probeUrlsStarted,
11 $probeUrlsCompleted,
12 $testPagesStarted,
13 $testPagesCompleted
14} = require('./symbols')
15const { UTRError } = require('./error')
16const { $proxifiedUrls } = require('./symbols')
17
18async 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
53async 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
70async 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' // TODO detect if middleware exists before injecting this
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
106function 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
122async 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 /* istanbul ignore else */
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
157module.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}