-
Notifications
You must be signed in to change notification settings - Fork 338
/
common.js
127 lines (101 loc) · 3.42 KB
/
common.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* @flow */
import path from 'path';
import {ChildProcess, spawn} from 'child_process';
import {promisify} from 'util';
import { fileURLToPath } from 'url';
import copyDir from 'copy-dir';
import prettyjson from 'prettyjson';
import * as tmpDirUtils from '../../src/util/temp-dir.js';
export const withTempDir = tmpDirUtils.withTempDir;
export const functionalTestsDir: string = path.resolve(
path.dirname(fileURLToPath(import.meta.url || ''))
);
export const projectDir: string = path.join(functionalTestsDir, '..', '..');
export const webExt: string = process.env.TEST_WEB_EXT_BIN ?
path.resolve(process.env.TEST_WEB_EXT_BIN) :
path.join(projectDir, 'bin', 'web-ext');
export const fixturesDir: string =
path.join(functionalTestsDir, '..', 'fixtures');
export const minimalAddonPath: string =
path.join(fixturesDir, 'minimal-web-ext');
export const fixturesUseAsLibrary: string =
path.join(fixturesDir, 'webext-as-library');
export const fakeFirefoxPath: string = path.join(
functionalTestsDir,
process.platform === 'win32' ?
'fake-firefox-binary.bat' : 'fake-firefox-binary.js'
);
export const fakeServerPath: string = path.join(
functionalTestsDir, 'fake-amo-server.js'
);
// withTempAddonDir helper
export type TempAddonParams = {|
addonPath: string,
runFromCwd?: boolean
|};
export type TempAddonCallback =
(tmpAddonDir: string, tmpDir: string) => Promise<any>;
const copyDirAsPromised = promisify(copyDir);
export function withTempAddonDir(
{addonPath}: TempAddonParams,
makePromise: TempAddonCallback,
): Promise<any> {
return withTempDir((tmpDir) => {
const tempAddonDir = path.join(tmpDir.path(), 'tmp-addon-dir');
return copyDirAsPromised(addonPath, tempAddonDir)
.then(() => {
process.chdir(tmpDir.path());
return makePromise(tempAddonDir, tmpDir.path())
.then(() => process.chdir(projectDir))
.catch((err) => {
process.chdir(projectDir);
throw err;
});
});
});
}
// reportCommandErrors helper
export function reportCommandErrors(obj: Object, msg: ?string) {
const errorMessage = msg || 'Unexpected web-ext functional test result';
const formattedErrorData = prettyjson.render(obj);
const error = new Error(`${errorMessage}: \n${formattedErrorData}`);
/* eslint-disable no-console */
// Make the error diagnostic info easier to read.
console.error('This test failed. Please check the log below to debug.');
/* eslint-enable no-console */
// Make sure the test fails and error diagnostic fully reported in the failure.
throw error;
}
// execWebExt helper
export type WebExtResult = {|
exitCode: number,
stderr: string,
stdout: string,
|};
export type RunningWebExt = {|
argv: Array<string>,
waitForExit: Promise<WebExtResult>,
spawnedProcess: ChildProcess,
|};
export function execWebExt(
argv: Array<string>,
spawnOptions: child_process$spawnOpts,
): RunningWebExt {
const spawnedProcess = spawn(
process.execPath, [webExt, ...argv], spawnOptions
);
const waitForExit = new Promise((resolve) => {
let errorData = '';
let outputData = '';
spawnedProcess.stderr.on('data', (data) => errorData += data);
spawnedProcess.stdout.on('data', (data) => outputData += data);
spawnedProcess.on('close', (exitCode) => {
resolve({
exitCode,
stderr: errorData,
stdout: outputData,
});
});
});
return {argv, waitForExit, spawnedProcess};
}