/
harness.js
97 lines (80 loc) · 2.66 KB
/
harness.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
const fs = require('fs')
const os = require('os')
const path = require('path')
const puppeteer = require('puppeteer')
const spawnSync = require('child_process').spawnSync
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000
if (process.env.KEEP_OPEN) {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000 * 1000
}
const DATA_DIR_PREFIX = 'ddg-temp-'
const setup = async (ops) => {
ops = ops || {}
const loadExtension = ops.loadExtension !== false
const tmpDirPrefix = path.join(os.tmpdir(), DATA_DIR_PREFIX)
const dataDir = fs.mkdtempSync(tmpDirPrefix)
const puppeteerOps = {
args: [
`--user-data-dir=${dataDir}`
],
headless: 'chrome'
}
if (loadExtension) {
puppeteerOps.args.push('--disable-extensions-except=build/chrome/dev')
puppeteerOps.args.push('--load-extension=build/chrome/dev')
}
// github actions
if (process.env.CI) {
puppeteerOps.args.push('--no-sandbox')
}
if (process.env.TRAVIS) {
// travis requires this to work
puppeteerOps.args.push('--no-sandbox')
// use the latest stable or beta Chrome versions on Travis
// rather than the bundled one
if (process.env.CHROME_CHANNEL === 'beta') {
puppeteerOps.path = 'google-chrome-beta'
} else if (process.env.CHROME_CHANNEL === 'stable') {
puppeteerOps.path = 'google-chrome-stable'
}
}
const browser = await puppeteer.launch(puppeteerOps)
let bgPage
const requests = []
if (loadExtension) {
// Grab a handle on the background page for the extension.
try {
const backgroundPageTarget =
await browser.waitForTarget(
target => target.type() === 'background_page',
{ timeout: 2000 }
)
bgPage = await backgroundPageTarget.page()
} catch (e) {
throw new Error('Couldn\'t find background page.')
}
bgPage.on('request', (req) => { requests.push(req.url()) })
}
async function teardown () {
if (process.env.KEEP_OPEN) {
return new Promise((resolve) => {
browser.on('disconnected', async () => {
await teardownInternal()
resolve()
})
})
} else {
await teardownInternal()
}
}
async function teardownInternal () {
await browser.close()
// necessary so e.g. local storage
// doesn't carry over between test runs
spawnSync('rm', ['-rf', dataDir])
}
return { browser, bgPage, requests, teardown }
}
module.exports = {
setup
}