/
sauce_reporter.js
68 lines (52 loc) · 1.71 KB
/
sauce_reporter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// SauceLabs is a wrapper around the Sauce Labs REST API
var SauceLabs = require('saucelabs')
var SauceReporter = function (logger, /* sauce:jobMapping */ jobMapping) {
var log = logger.create('reporter.sauce')
var pendingUpdates = 0
var updatesFinished = function () {}
this.adapters = []
// We're only interested in the final results per browser
this.onBrowserComplete = function (browser) {
var result = browser.lastResult
// browser.launchId was used until v0.10.2, but changed to just browser.id in v0.11.0
var browserId = browser.launchId || browser.id
if (result.disconnected) {
log.error('✖ Test Disconnected')
}
if (result.error) {
log.error('✖ Test Errored')
}
if (browserId in jobMapping) {
var jobDetails = jobMapping[browserId]
var sauceApiOptions = jobDetails.credentials
if (jobDetails.proxy) {
sauceApiOptions.proxy = jobDetails.proxy
}
var sauceApi = new SauceLabs(sauceApiOptions)
// We record pass/fail status, as well as the full results in "custom-data".
var payload = {
passed: !(result.failed || result.error || result.disconnected),
'custom-data': result
}
pendingUpdates++
sauceApi.updateJob(jobDetails.jobId, payload, function (err) {
pendingUpdates--
if (err) {
log.error('Failed record pass/fail status: %s', err.error)
}
if (pendingUpdates === 0) {
updatesFinished()
}
})
}
}
// Wait until all updates have been pushed to SauceLabs
this.onExit = function (done) {
if (pendingUpdates) {
updatesFinished = done
} else {
done()
}
}
}
module.exports = SauceReporter