@eyeo/get-browser-binary 0.13.0 → 0.15.0
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/.gitlab-ci.yml +4 -4
- package/README.md +32 -14
- package/RELEASE_NOTES.md +36 -0
- package/index.js +19 -2
- package/package.json +8 -5
- package/src/browser.js +134 -0
- package/src/chromium.js +324 -0
- package/src/edge.js +308 -0
- package/src/firefox.js +212 -0
- package/src/utils.js +43 -0
- package/test/browsers.js +53 -46
- package/test/docker/Dockerfile +1 -1
- package/test/pages/basic.html +1 -0
- package/test/pages/download-test.txt +1 -0
- package/test/pages/long.html +41 -0
- package/test/runner.js +74 -0
- package/test/start-server.js +20 -0
- package/test/test-server.js +37 -0
- package/test/utils.js +5 -4
- package/src/browsers.js +0 -939
- package/test/docker/arm64.Dockerfile +0 -22
package/test/browsers.js
CHANGED
|
@@ -18,21 +18,22 @@
|
|
|
18
18
|
import fs from "fs";
|
|
19
19
|
import {expect} from "expect";
|
|
20
20
|
import path from "path";
|
|
21
|
+
import Jimp from "jimp";
|
|
22
|
+
import {By} from "selenium-webdriver";
|
|
21
23
|
|
|
22
24
|
import {BROWSERS, snapshotsBaseDir, takeFullPageScreenshot} from "../index.js";
|
|
23
25
|
import {killDriverProcess} from "../src/utils.js";
|
|
24
|
-
import
|
|
26
|
+
import {TEST_SERVER_URL} from "./test-server.js";
|
|
25
27
|
|
|
26
28
|
import "geckodriver"; // Required to set the driver path on Windows
|
|
27
29
|
|
|
28
30
|
const VERSIONS = {
|
|
29
|
-
chromium: ["latest", "
|
|
30
|
-
firefox: ["latest", "
|
|
31
|
-
|
|
32
|
-
edge: ["dev", "beta", "latest", "95.0.1020.40"]
|
|
31
|
+
chromium: ["latest", "77.0.3865.0", "beta", "dev"],
|
|
32
|
+
firefox: ["latest", "68.0", "beta"],
|
|
33
|
+
edge: ["latest", "95.0.1020.40", "beta", "dev"]
|
|
33
34
|
};
|
|
34
|
-
const
|
|
35
|
-
const
|
|
35
|
+
const TEST_URL_BASIC = `${TEST_SERVER_URL}/basic.html`;
|
|
36
|
+
const TEST_URL_LONG = `${TEST_SERVER_URL}/long.html`;
|
|
36
37
|
|
|
37
38
|
async function switchToHandle(driver, testFn) {
|
|
38
39
|
for (let handle of await driver.getAllWindowHandles()) {
|
|
@@ -106,14 +107,12 @@ function getExtension(browser, version) {
|
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
async function getCachedTimes(browser) {
|
|
109
|
-
let armLinuxChromium = browser == "chromium" &&
|
|
110
|
-
process.platform == "linux" && process.arch == "arm64";
|
|
111
110
|
let cacheDir = path.join(snapshotsBaseDir, browser, "cache");
|
|
112
111
|
let cacheFiles = await fs.promises.readdir(cacheDir);
|
|
113
112
|
|
|
114
113
|
let browserCacheTime = null;
|
|
115
|
-
//
|
|
116
|
-
if (browser != "edge"
|
|
114
|
+
// Browsers installed at OS level are not tested
|
|
115
|
+
if (browser != "edge") {
|
|
117
116
|
let installTypes = [".zip", ".dmg", ".bz2"];
|
|
118
117
|
let browserZip =
|
|
119
118
|
cacheFiles.find(elem => installTypes.some(type => elem.includes(type)));
|
|
@@ -123,7 +122,7 @@ async function getCachedTimes(browser) {
|
|
|
123
122
|
|
|
124
123
|
let driverCacheTime = null;
|
|
125
124
|
// geckodriver is installed by npm, that's why Firefox is not tested here
|
|
126
|
-
if (browser != "firefox"
|
|
125
|
+
if (browser != "firefox") {
|
|
127
126
|
let driverDir = cacheFiles.find(
|
|
128
127
|
elem => !elem.endsWith(".zip") && !elem.endsWith(".pkg"));
|
|
129
128
|
let driverFiles = await fs.promises.readdir(path.join(cacheDir, driverDir));
|
|
@@ -136,6 +135,21 @@ async function getCachedTimes(browser) {
|
|
|
136
135
|
return {browserCTime: browserCacheTime, driverCTime: driverCacheTime};
|
|
137
136
|
}
|
|
138
137
|
|
|
138
|
+
const browserNames = {
|
|
139
|
+
chromium: "chrome",
|
|
140
|
+
firefox: "firefox",
|
|
141
|
+
edge: /(MicrosoftEdge|msedge)/
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
async function basicUrlTest(driver, browser) {
|
|
145
|
+
await driver.navigate().to(TEST_URL_BASIC);
|
|
146
|
+
expect((await driver.getCapabilities()).getBrowserName())
|
|
147
|
+
.toEqual(expect.stringMatching(browserNames[browser]));
|
|
148
|
+
|
|
149
|
+
let text = await driver.findElement(By.id("basic")).getText();
|
|
150
|
+
expect(text).toEqual("Test server basic page");
|
|
151
|
+
}
|
|
152
|
+
|
|
139
153
|
for (let browser of Object.keys(BROWSERS)) {
|
|
140
154
|
describe(`Browser: ${browser}`, () => {
|
|
141
155
|
before(async() => {
|
|
@@ -150,6 +164,7 @@ for (let browser of Object.keys(BROWSERS)) {
|
|
|
150
164
|
let driver = null;
|
|
151
165
|
let emptyCacheTimes = null;
|
|
152
166
|
let customBrowserBinary = null;
|
|
167
|
+
let failedInstall = false;
|
|
153
168
|
|
|
154
169
|
async function quitDriver() {
|
|
155
170
|
if (!driver)
|
|
@@ -164,14 +179,27 @@ for (let browser of Object.keys(BROWSERS)) {
|
|
|
164
179
|
await killDriverProcess("geckodriver");
|
|
165
180
|
}
|
|
166
181
|
|
|
182
|
+
beforeEach(function() {
|
|
183
|
+
if (failedInstall)
|
|
184
|
+
this.skip();
|
|
185
|
+
});
|
|
186
|
+
|
|
167
187
|
afterEach(quitDriver);
|
|
168
188
|
|
|
169
189
|
it("installs", async function() {
|
|
170
190
|
if (browser == "edge" && process.platform == "win32")
|
|
171
191
|
this.skip();
|
|
172
192
|
|
|
173
|
-
let
|
|
174
|
-
|
|
193
|
+
let binary;
|
|
194
|
+
let versionNumber;
|
|
195
|
+
try {
|
|
196
|
+
({binary, versionNumber} =
|
|
197
|
+
await BROWSERS[browser].installBrowser(version, this.timeout()));
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
failedInstall = true;
|
|
201
|
+
throw err;
|
|
202
|
+
}
|
|
175
203
|
let browserName = browser == "edge" ? /(edge|Edge)/ : browser;
|
|
176
204
|
expect(binary).toEqual(expect.stringMatching(browserName));
|
|
177
205
|
|
|
@@ -186,17 +214,8 @@ for (let browser of Object.keys(BROWSERS)) {
|
|
|
186
214
|
});
|
|
187
215
|
|
|
188
216
|
it("runs", async() => {
|
|
189
|
-
let names = {
|
|
190
|
-
chromium: "chrome",
|
|
191
|
-
firefox: "firefox",
|
|
192
|
-
edge: /(MicrosoftEdge|msedge)/
|
|
193
|
-
};
|
|
194
|
-
|
|
195
217
|
driver = await BROWSERS[browser].getDriver(version);
|
|
196
|
-
await driver
|
|
197
|
-
|
|
198
|
-
expect((await driver.getCapabilities()).getBrowserName())
|
|
199
|
-
.toEqual(expect.stringMatching(names[browser]));
|
|
218
|
+
await basicUrlTest(driver, browser);
|
|
200
219
|
|
|
201
220
|
// When running all tests, this saves time on the cache test
|
|
202
221
|
emptyCacheTimes = await getCachedTimes(browser);
|
|
@@ -221,41 +240,35 @@ for (let browser of Object.keys(BROWSERS)) {
|
|
|
221
240
|
if (!customBrowserBinary)
|
|
222
241
|
this.skip();
|
|
223
242
|
|
|
224
|
-
let names = {
|
|
225
|
-
chromium: "chrome",
|
|
226
|
-
firefox: "firefox",
|
|
227
|
-
edge: /(MicrosoftEdge|msedge)/
|
|
228
|
-
};
|
|
229
|
-
|
|
230
243
|
driver =
|
|
231
244
|
await BROWSERS[browser].getDriver(version, {customBrowserBinary});
|
|
232
|
-
await driver
|
|
245
|
+
await basicUrlTest(driver, browser);
|
|
233
246
|
|
|
234
247
|
expect((await driver.getCapabilities()).getBrowserName())
|
|
235
|
-
.toEqual(expect.stringMatching(
|
|
248
|
+
.toEqual(expect.stringMatching(browserNames[browser]));
|
|
236
249
|
});
|
|
237
250
|
|
|
238
251
|
it("supports extra args", async() => {
|
|
239
252
|
let headless = false;
|
|
240
253
|
let extraArgs = browser == "firefox" ?
|
|
241
|
-
["
|
|
254
|
+
["-width=600", "-height=400"] : ["window-size=600,400"];
|
|
242
255
|
|
|
243
256
|
driver = await BROWSERS[browser].getDriver(
|
|
244
257
|
version, {headless, extraArgs});
|
|
245
|
-
await driver.navigate().to(
|
|
246
|
-
let
|
|
258
|
+
await driver.navigate().to(TEST_URL_BASIC);
|
|
259
|
+
let sizeSmall = await getWindowSize(driver);
|
|
247
260
|
await quitDriver();
|
|
248
261
|
|
|
249
262
|
driver = await BROWSERS[browser].getDriver(version, {headless});
|
|
250
|
-
await driver.navigate().to(
|
|
251
|
-
let
|
|
263
|
+
await driver.navigate().to(TEST_URL_BASIC);
|
|
264
|
+
let sizeDefault = await getWindowSize(driver);
|
|
252
265
|
|
|
253
|
-
expect(
|
|
266
|
+
expect(sizeSmall).toMeasureLessThan(sizeDefault);
|
|
254
267
|
});
|
|
255
268
|
|
|
256
269
|
it("takes a full page screenshot", async() => {
|
|
257
270
|
driver = await BROWSERS[browser].getDriver(version);
|
|
258
|
-
await driver.navigate().to(
|
|
271
|
+
await driver.navigate().to(TEST_URL_LONG);
|
|
259
272
|
|
|
260
273
|
let fullImg = await takeFullPageScreenshot(driver);
|
|
261
274
|
// Taking a regular webdriver screenshot, which should be shorter
|
|
@@ -278,7 +291,7 @@ for (let browser of Object.keys(BROWSERS)) {
|
|
|
278
291
|
});
|
|
279
292
|
|
|
280
293
|
it("loads an extension in incognito mode", async function() {
|
|
281
|
-
if (browser == "firefox" && version == "
|
|
294
|
+
if (browser == "firefox" && version == "68.0")
|
|
282
295
|
this.skip();
|
|
283
296
|
|
|
284
297
|
let {extensionPaths, manifest} = getExtension(browser, version);
|
|
@@ -301,11 +314,5 @@ for (let browser of Object.keys(BROWSERS)) {
|
|
|
301
314
|
.rejects.toThrow(`Unsupported browser version: ${unsupported}`);
|
|
302
315
|
}
|
|
303
316
|
});
|
|
304
|
-
|
|
305
|
-
it("does not run not installed custom browsers", async() => {
|
|
306
|
-
let customBrowserBinary = "not-installed";
|
|
307
|
-
await expect(BROWSERS[browser].getDriver("latest", {customBrowserBinary}))
|
|
308
|
-
.rejects.toThrow(/(Browser is not installed|binary is not a Firefox executable)/);
|
|
309
|
-
});
|
|
310
317
|
});
|
|
311
318
|
}
|
package/test/docker/Dockerfile
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<h1 id="basic">Test server basic page</h1>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Download test
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<h1>Test server long page</h1>
|
|
2
|
+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum a sollicitudin elit. Vivamus ornare fermentum mi vel laoreet. Nullam eget risus gravida, placerat tellus at, mattis orci. Sed libero sapien, facilisis ac dignissim eget, eleifend et massa. Praesent sit amet pharetra elit. Cras vitae lorem elit. Duis sagittis nec libero commodo eleifend. Pellentesque volutpat elit cursus semper varius. Donec tempor sit amet purus id lacinia. Ut dui enim, tincidunt non ornare non, hendrerit non ante. Phasellus vel varius turpis, vulputate ultrices ex. Maecenas egestas magna eget lobortis sodales. Proin ut ex vulputate, efficitur urna eget, facilisis felis. Aliquam et bibendum lectus.
|
|
3
|
+
</p>
|
|
4
|
+
<p>Etiam vitae laoreet mi, eu pulvinar turpis. Nullam volutpat est quis erat imperdiet auctor. Morbi vulputate risus at eleifend vestibulum. Nulla pharetra bibendum enim, sit amet tempus libero posuere in. Phasellus ac dui nunc. Aliquam vehicula nibh lorem, feugiat pharetra urna varius vitae. Suspendisse potenti. Maecenas non rutrum quam. Phasellus nunc mauris, gravida eu augue eget, consectetur scelerisque arcu. Pellentesque venenatis molestie nisi eget imperdiet. Sed convallis convallis nisl, at malesuada lectus tristique eu. Vestibulum rhoncus in sapien et efficitur.
|
|
5
|
+
</p>
|
|
6
|
+
<p>Quisque ac nunc a felis vestibulum pulvinar. Donec sodales mollis blandit. Ut porta tortor et metus semper bibendum. Morbi dignissim volutpat tempus. Donec venenatis ut ipsum id ullamcorper. Vestibulum urna mauris, ultricies quis dapibus semper, finibus non ex. Suspendisse porttitor, justo et tristique tincidunt, erat turpis sagittis velit, gravida imperdiet metus ex ut nulla. Maecenas semper mi ligula, non pharetra tellus gravida nec. Donec ut nunc vel nulla efficitur consectetur in ut tortor. Ut consectetur sit amet tellus id tempor.
|
|
7
|
+
</p>
|
|
8
|
+
<p>Quisque nec egestas risus. Nam hendrerit ex felis, semper finibus enim bibendum in. Suspendisse sed lobortis metus, at eleifend nisi. Etiam nec gravida felis, ut tincidunt nunc. Proin condimentum laoreet lacus eu facilisis. Aenean ut commodo mauris, sit amet imperdiet enim. In dapibus auctor leo, sit amet facilisis nisl venenatis in. Morbi a magna sit amet metus efficitur bibendum. Nunc sit amet purus id purus malesuada dignissim. Donec metus arcu, tincidunt eget malesuada eget, laoreet a ex. Donec tincidunt pretium ex, eget iaculis nisl semper nec. Ut ac tortor est.
|
|
9
|
+
</p>
|
|
10
|
+
<p>Vivamus sed lorem metus. Maecenas eu ipsum finibus, pretium urna quis, ultrices lectus. Donec sem purus, consectetur non lobortis at, ultrices eget nulla. Duis est ligula, venenatis sit amet tortor id, placerat hendrerit enim. Curabitur in fringilla est. Cras quis arcu ut libero venenatis imperdiet. Donec quis nunc non odio gravida porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas mauris mi, venenatis quis imperdiet at, fringilla ac quam. Pellentesque tincidunt viverra ex, at pulvinar odio placerat et. Nullam suscipit facilisis lorem ut imperdiet. Aenean dictum, purus ut mollis efficitur, leo diam maximus mauris, et facilisis nibh nisl vitae quam.
|
|
11
|
+
</p>
|
|
12
|
+
<p>Ut euismod ut ligula mollis feugiat. Cras congue eros at urna posuere, id pretium turpis sodales. Suspendisse eu sapien ut felis placerat varius ullamcorper id tellus. Vestibulum facilisis sodales accumsan. Nunc enim metus, volutpat sed consequat sed, tincidunt in dui. Curabitur auctor ac nisl sed eleifend. Suspendisse id ante magna. Aliquam est justo, congue id facilisis ut, suscipit in nunc. Nunc at leo nec purus auctor fringilla. Morbi tincidunt aliquet arcu, eu tempus enim eleifend a. Morbi porttitor metus et ultrices pellentesque. Curabitur pharetra sit amet velit quis dictum.
|
|
13
|
+
</p>
|
|
14
|
+
<p>Nam laoreet semper erat, non pellentesque lacus euismod a. Sed quis massa interdum augue pellentesque blandit. Proin nulla neque, bibendum in nisi nec, sollicitudin aliquam erat. Aliquam bibendum nulla augue, eget dictum lorem suscipit vestibulum. Nulla purus nulla, egestas sed diam ultricies, porta hendrerit lectus. Nunc tristique eu felis a sagittis. Pellentesque vulputate fermentum tellus. Morbi leo arcu, tempor ut mollis in, ultricies id odio. Curabitur vel diam ultrices, porttitor diam eu, gravida velit. Aliquam fringilla iaculis diam, tristique rhoncus odio pulvinar et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec hendrerit molestie velit, eget tempor velit volutpat in. Donec ac felis et nibh vulputate bibendum. Suspendisse pharetra feugiat diam nec rhoncus. Curabitur sodales hendrerit nulla eget venenatis.
|
|
15
|
+
</p>
|
|
16
|
+
<p>Vivamus vel ante ac velit congue tincidunt. Suspendisse potenti. Praesent sed nisl gravida, volutpat enim id, molestie risus. Mauris nec elit rhoncus nunc porttitor sodales. Proin gravida, sem eleifend maximus scelerisque, ipsum turpis elementum diam, eget lacinia quam sem in arcu. Maecenas nec elit vel nisi lacinia iaculis at hendrerit diam. Maecenas lobortis dui vitae dolor gravida ultricies. Integer pretium est lacus, in accumsan tortor convallis sed. Phasellus ornare nisl sit amet risus ultrices, nec vulputate libero vehicula. Mauris iaculis euismod erat vel molestie. Donec molestie tincidunt arcu vel mattis. Cras elementum tempus tellus non fringilla. Curabitur varius erat eget quam blandit porttitor. Nunc tincidunt justo vel turpis interdum, vel congue turpis molestie. In ante felis, gravida vel porta non, ultricies quis est. Suspendisse commodo faucibus felis, at dignissim odio egestas nec.
|
|
17
|
+
</p>
|
|
18
|
+
<p>Aliquam gravida nunc a tristique imperdiet. Donec ac suscipit turpis, in placerat lorem. Cras tellus dui, porttitor vel ultrices quis, euismod quis libero. Phasellus semper nunc turpis, non fermentum ligula tempus eu. Quisque id dui in nisi vestibulum sodales non ac lectus. Etiam augue dui, mattis et placerat rhoncus, pulvinar at magna. Vivamus rhoncus mollis tellus, in auctor lacus consectetur pharetra. Proin feugiat faucibus mi, quis tincidunt lacus lacinia sed. Suspendisse condimentum magna non urna blandit, nec ultricies quam tempor. Aenean eu nunc ac felis eleifend tincidunt eget vitae mi. Sed convallis quis lectus eu hendrerit. Aliquam erat volutpat. Suspendisse efficitur sem quis suscipit egestas.
|
|
19
|
+
</p>
|
|
20
|
+
<p>Nulla egestas quam a volutpat luctus. Donec tincidunt ex ut libero fermentum, quis vulputate nunc fringilla. Nam tempor dignissim lacus, et maximus neque accumsan in. Quisque nec neque porttitor, faucibus mi eget, dapibus nisi. Praesent fringilla, tortor aliquet feugiat euismod, turpis erat eleifend dui, non ultricies lacus mi ut orci. Pellentesque imperdiet vestibulum leo. Ut vitae tristique enim, a finibus ipsum. Nulla commodo metus metus. Curabitur lorem nibh, egestas sed leo quis, finibus rhoncus massa.
|
|
21
|
+
</p>
|
|
22
|
+
<p>Etiam tempor mauris id erat vulputate dignissim. Aliquam erat volutpat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Integer aliquet in purus a laoreet. Nam tincidunt consectetur nisi, nec lacinia tortor mollis quis. Mauris pretium, nisl id imperdiet dictum, elit sem pellentesque tortor, eu faucibus neque ipsum in turpis. Quisque nibh nisi, facilisis eu dignissim sit amet, scelerisque vel purus. Phasellus ullamcorper eu leo quis maximus. Nullam vitae augue rutrum, pellentesque ex sit amet, bibendum purus. Cras sed leo ipsum. Morbi nibh est, rutrum nec convallis et, ultrices quis lorem. Maecenas maximus nisi non nisi ultrices maximus.
|
|
23
|
+
</p>
|
|
24
|
+
<p>Nunc a accumsan est. Morbi placerat lorem et dui molestie, ut pharetra massa mollis. Aenean molestie urna sed dignissim varius. Aliquam erat volutpat. Integer scelerisque, odio a aliquet tincidunt, ex felis volutpat est, id elementum lectus libero id tellus. Aenean non odio quis est rutrum faucibus eget in lorem. Suspendisse potenti. In pretium elit ac congue tincidunt. Vivamus sed sem at nibh fermentum accumsan.
|
|
25
|
+
</p>
|
|
26
|
+
<p>Etiam lacinia sit amet nisl ornare blandit. Nullam ullamcorper aliquet dictum. Suspendisse mauris quam, maximus eu molestie vitae, dapibus fermentum sapien. Fusce mi lectus, consectetur a nunc eget, porta sagittis diam. Vestibulum ac ex id lectus fermentum dictum et in dui. Nulla faucibus pellentesque mi, sit amet ultricies tortor feugiat eu. Suspendisse gravida pellentesque magna. Donec eu mauris diam.
|
|
27
|
+
</p>
|
|
28
|
+
<p>Cras fringilla nisl a tempor venenatis. Nulla ut magna sed metus pretium convallis. Vivamus volutpat ac lectus vel pulvinar. Aliquam dignissim, tortor non fringilla tincidunt, eros erat sodales orci, consequat elementum elit mi sed elit. Donec pharetra rhoncus purus a iaculis. In quis lacus quis nisl facilisis volutpat at in nulla. Fusce a tincidunt velit. Integer eget urna nibh.
|
|
29
|
+
</p>
|
|
30
|
+
<p>Phasellus ac justo lacus. Vestibulum ut pulvinar nunc, et pellentesque urna. Nam venenatis magna eget tortor aliquam dapibus. Vivamus id arcu vitae tortor egestas semper. Maecenas mollis at augue id bibendum. Mauris lobortis velit id enim efficitur vestibulum. Pellentesque at est a odio blandit pretium. Proin nec ornare sem, vel ornare felis.
|
|
31
|
+
</p>
|
|
32
|
+
<p>Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In leo leo, tempor a finibus eu, placerat vel sapien. Nullam nisl augue, tempor ultricies dictum eu, ultricies nec nisi. Nam nibh sapien, porta vel dignissim ac, laoreet nec ligula. Praesent luctus, dui a bibendum placerat, ipsum ex venenatis nulla, eu congue erat justo quis nulla. Nulla est nunc, blandit ac purus nec, ullamcorper pharetra tortor. Aenean lobortis enim non orci rhoncus venenatis. Cras vel metus in nulla porta bibendum ut quis urna. Fusce non ex ac nisi facilisis porta. Etiam vel tellus in lorem porttitor maximus at eget erat. Ut interdum, elit a facilisis hendrerit, neque tellus sodales nisl, at ultrices augue ex sit amet urna.
|
|
33
|
+
</p>
|
|
34
|
+
<p>Donec ornare lorem erat, quis mollis nisl dignissim blandit. Nunc scelerisque, turpis a pellentesque laoreet, arcu massa dictum nisl, sit amet egestas lacus dolor et odio. In metus mauris, venenatis ac odio quis, porttitor cursus eros. Fusce pellentesque consequat congue. Nullam iaculis ipsum in ipsum lobortis efficitur. In et mauris augue. Cras eu faucibus justo. Integer hendrerit gravida massa, non auctor purus efficitur ac. Pellentesque non lorem massa. Aliquam vitae tincidunt risus. Fusce et elit eget ex ullamcorper cursus ac nec quam. Vestibulum cursus mauris vitae ipsum sagittis tempor. Ut eleifend ligula in elementum hendrerit. Vivamus malesuada aliquam placerat.
|
|
35
|
+
</p>
|
|
36
|
+
<p>Fusce pharetra ligula id scelerisque tristique. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras commodo sagittis neque et vulputate. Curabitur erat est, pulvinar ac semper id, euismod vitae elit. Proin ut dolor semper, suscipit ipsum eget, molestie arcu. Sed sodales mauris nulla, ullamcorper cursus nunc malesuada sit amet. Proin sed condimentum orci. Suspendisse aliquam sem ac purus dictum commodo. Nullam ultricies sapien elit, eget mollis elit porta sit amet. Nulla fermentum, mi porta consequat malesuada, metus dui commodo ante, eu vestibulum arcu erat at tortor. Phasellus dolor nunc, cursus ultrices vestibulum vel, rhoncus auctor ante. Quisque consectetur sed ligula non tempus. Pellentesque faucibus est vitae quam sodales tristique. Proin et fringilla quam, sed faucibus enim. Ut convallis, urna eu condimentum scelerisque, magna tellus iaculis sem, sed rhoncus leo purus a nulla.
|
|
37
|
+
</p>
|
|
38
|
+
<p>Morbi tellus lacus, tempus in orci ac, molestie lobortis neque. Fusce pretium ex nec erat faucibus congue ut a lorem. Morbi a pretium justo. Donec interdum elit vitae blandit tincidunt. Proin nisi magna, imperdiet id accumsan id, maximus vel risus. Nunc quis fermentum est. Nam at nibh ac ipsum tincidunt viverra eget tincidunt massa. Nam convallis metus tortor. Aenean at tincidunt lacus.
|
|
39
|
+
</p>
|
|
40
|
+
<p>Cras ultricies iaculis massa et commodo. Suspendisse efficitur magna purus, id egestas tellus consectetur eu. Nullam ante sapien, mollis sit amet purus sed, volutpat consequat tortor. Cras pharetra tincidunt gravida. Suspendisse non ante iaculis, mattis metus id, elementum metus. Nam elementum suscipit lectus, eget laoreet dui aliquet nec. Cras nec enim vel nulla blandit maximus sed ut elit. Fusce malesuada augue efficitur quam sollicitudin ornare in sit amet velit. Maecenas fringilla scelerisque quam non suscipit. Curabitur nisl velit, commodo ut pretium ut, dictum nec orci. Maecenas quis est interdum, pellentesque erat in, porttitor lacus. In quis nisl luctus, luctus mauris at, condimentum quam. Fusce laoreet quam nec massa pulvinar, et ultricies sem semper.
|
|
41
|
+
</p>
|
package/test/runner.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import {spawn, execSync} from "child_process";
|
|
3
|
+
|
|
4
|
+
let testServerProcess;
|
|
5
|
+
|
|
6
|
+
export function runTestServer() {
|
|
7
|
+
if (testServerProcess)
|
|
8
|
+
return;
|
|
9
|
+
|
|
10
|
+
testServerProcess =
|
|
11
|
+
spawn("node", [path.join(process.cwd(), "test", "start-server.js")]);
|
|
12
|
+
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
function onData(data) {
|
|
15
|
+
console.log(data.toString()); // eslint-disable-line no-console
|
|
16
|
+
|
|
17
|
+
let testServerStarted = data.includes("listening at");
|
|
18
|
+
if (testServerStarted)
|
|
19
|
+
resolve();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function onClose(code) {
|
|
23
|
+
if (code != 0)
|
|
24
|
+
reject(new Error("Failed to start test server"));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
testServerProcess.stderr.on("data", onData);
|
|
28
|
+
testServerProcess.stdout.on("data", onData);
|
|
29
|
+
testServerProcess.on("close", onClose);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function killTestServer() {
|
|
34
|
+
if (!testServerProcess)
|
|
35
|
+
return;
|
|
36
|
+
|
|
37
|
+
await new Promise((resolve, reject) => {
|
|
38
|
+
let timeoutID = setTimeout(() => {
|
|
39
|
+
reject(new Error("Could not stop test server"));
|
|
40
|
+
}, 5000);
|
|
41
|
+
|
|
42
|
+
function onClose() {
|
|
43
|
+
testServerProcess.off("close", onClose);
|
|
44
|
+
resolve();
|
|
45
|
+
clearTimeout(timeoutID);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
testServerProcess.on("close", onClose);
|
|
49
|
+
testServerProcess.kill("SIGKILL");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
testServerProcess = null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function run() {
|
|
56
|
+
let args = process.argv.join(" ").split("-- ")[1];
|
|
57
|
+
await runTestServer();
|
|
58
|
+
try {
|
|
59
|
+
execSync(`npm run test-suite -- ${args}`, {stdio: "inherit"});
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
await killTestServer();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
(async() => {
|
|
67
|
+
try {
|
|
68
|
+
await run();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
console.error(err instanceof Error ? err.stack : `Error: ${err}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2006-present eyeo GmbH
|
|
3
|
+
*
|
|
4
|
+
* This module is free software: you can redistribute it and/or modify
|
|
5
|
+
* it under the terms of the GNU General Public License as published by
|
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
* (at your option) any later version.
|
|
8
|
+
*
|
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
* GNU General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU General Public License
|
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {startTestServer} from "./test-server.js";
|
|
19
|
+
|
|
20
|
+
startTestServer();
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2006-present eyeo GmbH
|
|
3
|
+
*
|
|
4
|
+
* This module is free software: you can redistribute it and/or modify
|
|
5
|
+
* it under the terms of the GNU General Public License as published by
|
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
* (at your option) any later version.
|
|
8
|
+
*
|
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
* GNU General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU General Public License
|
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import path from "path";
|
|
19
|
+
import url from "url";
|
|
20
|
+
import express from "express";
|
|
21
|
+
|
|
22
|
+
const HOST = "localhost";
|
|
23
|
+
const PORT = 3000;
|
|
24
|
+
|
|
25
|
+
export const TEST_SERVER_URL = `http://${HOST}:${PORT}`;
|
|
26
|
+
|
|
27
|
+
let app = express();
|
|
28
|
+
let dirname = path.dirname(url.fileURLToPath(import.meta.url));
|
|
29
|
+
|
|
30
|
+
app.use(express.static(path.join(dirname, "pages")));
|
|
31
|
+
|
|
32
|
+
export function startTestServer() {
|
|
33
|
+
app.listen(PORT, HOST, () => {
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.log(`Test server listening at ${TEST_SERVER_URL}`);
|
|
36
|
+
});
|
|
37
|
+
}
|
package/test/utils.js
CHANGED
|
@@ -20,14 +20,15 @@ import {expect} from "expect";
|
|
|
20
20
|
import path from "path";
|
|
21
21
|
|
|
22
22
|
import {snapshotsBaseDir, download} from "../index.js";
|
|
23
|
+
import {TEST_SERVER_URL} from "./test-server.js";
|
|
23
24
|
|
|
24
25
|
describe("Utils", () => {
|
|
25
26
|
it("defines a browser snapshots folder", () => expect(snapshotsBaseDir)
|
|
26
27
|
.toBe(path.join(process.cwd(), "browser-snapshots")));
|
|
27
28
|
|
|
28
|
-
let resourceUrl =
|
|
29
|
+
let resourceUrl = `${TEST_SERVER_URL}/download-test.txt`;
|
|
29
30
|
let destFile = path.join(snapshotsBaseDir, "download-test.txt");
|
|
30
|
-
|
|
31
|
+
const expectedFileContents = "Download test";
|
|
31
32
|
|
|
32
33
|
it("downloads resources", async() => {
|
|
33
34
|
await fs.promises.rm(destFile, {force: true});
|
|
@@ -45,11 +46,11 @@ describe("Utils", () => {
|
|
|
45
46
|
|
|
46
47
|
it("does not download on short timeout", async() => {
|
|
47
48
|
try {
|
|
48
|
-
await download(resourceUrl, destFile,
|
|
49
|
+
await download(resourceUrl, destFile, 1);
|
|
49
50
|
throw new Error("Download timeout didn't throw");
|
|
50
51
|
}
|
|
51
52
|
catch (err) {
|
|
52
|
-
expect(err).toBe("Download timeout after
|
|
53
|
+
expect(err).toBe("Download timeout after 1ms");
|
|
53
54
|
}
|
|
54
55
|
});
|
|
55
56
|
|