testplane
Version:
Tests framework based on mocha and wdio
174 lines • 8.12 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.unzipFile = exports.downloadFile = exports.retryFetch = exports.getChromeDriverDir = exports.getChromiumDriverDir = exports.getEdgeDriverDir = exports.getGeckoDriverDir = exports.getOsPackagesDir = exports.getBrowsersDir = exports.getRegistryPath = exports.getChromePlatform = exports.getBrowserPlatform = exports.normalizeChromeVersion = exports.semverVersionsComparator = exports.getMilestone = exports.createBrowserLabel = exports.DriverName = exports.browserInstallerDebug = void 0;
const browsers_1 = require("@puppeteer/browsers");
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const child_process_1 = require("child_process");
const stream_1 = require("stream");
const debug_1 = __importDefault(require("debug"));
const util_1 = require("util");
const constants_1 = require("./constants");
exports.browserInstallerDebug = (0, debug_1.default)("testplane:browser-installer");
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
exports.DriverName = {
CHROMEDRIVER: browsers_1.Browser.CHROMEDRIVER,
GECKODRIVER: "geckodriver",
SAFARIDRIVER: "safaridriver",
EDGEDRIVER: "edgedriver",
};
const createBrowserLabel = (browserName, version) => browserName + "@" + version;
exports.createBrowserLabel = createBrowserLabel;
const getMilestone = (version) => {
if (typeof version === "number") {
return String(version);
}
return version.split(".")[0];
};
exports.getMilestone = getMilestone;
const semverVersionsComparator = (a, b) => {
const splitVersion = (version) => version
.replaceAll(/[^\d.]/g, "")
.split(".")
.filter(Boolean)
.map(Number);
const versionPartsA = splitVersion(a);
const versionPartsB = splitVersion(b);
for (let i = 0; i < Math.min(versionPartsA.length, versionPartsB.length); i++) {
if (versionPartsA[i] !== versionPartsB[i]) {
return versionPartsA[i] - versionPartsB[i];
}
}
return 0;
};
exports.semverVersionsComparator = semverVersionsComparator;
const normalizeChromeVersion = (version) => {
const versionParts = version.split(".").filter(Boolean);
if (versionParts.length === 2) {
return versionParts[0];
}
if (versionParts.length >= 3) {
return versionParts.slice(0, 3).join(".");
}
return versionParts[0];
};
exports.normalizeChromeVersion = normalizeChromeVersion;
const getBrowserPlatform = () => {
const platform = (0, browsers_1.detectBrowserPlatform)();
if (!platform) {
throw new Error(`Got an error while trying to download browsers: platform "${platform}" is not supported`);
}
return platform;
};
exports.getBrowserPlatform = getBrowserPlatform;
const getChromePlatform = (version) => {
const milestone = (0, exports.getMilestone)(version);
const platform = (0, exports.getBrowserPlatform)();
if (platform === browsers_1.BrowserPlatform.MAC_ARM && Number(milestone) < constants_1.MIN_CHROMIUM_MAC_ARM_VERSION) {
return browsers_1.BrowserPlatform.MAC;
}
return platform;
};
exports.getChromePlatform = getChromePlatform;
const resolveUserPath = (userPath) => userPath.startsWith("~") ? path_1.default.resolve(os_1.default.homedir(), userPath.slice(1)) : path_1.default.resolve(userPath);
const getCacheDir = (envValueOverride = process.env.TESTPLANE_BROWSERS_PATH) => envValueOverride ? resolveUserPath(envValueOverride) : path_1.default.join(os_1.default.homedir(), ".testplane");
const getRegistryPath = (envValueOverride) => path_1.default.join(getCacheDir(envValueOverride), "registry.json");
exports.getRegistryPath = getRegistryPath;
const getBrowsersDir = () => path_1.default.join(getCacheDir(), "browsers");
exports.getBrowsersDir = getBrowsersDir;
const getDriversDir = () => path_1.default.join(getCacheDir(), "drivers");
const getDriverDir = (driverName, driverVersion) => path_1.default.join(getDriversDir(), driverName, driverVersion);
const getOsPackagesDir = (osName, osVersion) => path_1.default.join(getCacheDir(), "packages", osName, osVersion);
exports.getOsPackagesDir = getOsPackagesDir;
const getGeckoDriverDir = (driverVersion) => getDriverDir("geckodriver", (0, exports.getBrowserPlatform)() + "-" + driverVersion);
exports.getGeckoDriverDir = getGeckoDriverDir;
const getEdgeDriverDir = (driverVersion) => getDriverDir("edgedriver", (0, exports.getBrowserPlatform)() + "-" + driverVersion);
exports.getEdgeDriverDir = getEdgeDriverDir;
const getChromiumDriverDir = (driverVersion) => getDriverDir("chromedriver", (0, exports.getBrowserPlatform)() + "-" + driverVersion);
exports.getChromiumDriverDir = getChromiumDriverDir;
const getChromeDriverDir = () => getDriversDir(); // path is set by @puppeteer/browsers.install
exports.getChromeDriverDir = getChromeDriverDir;
const retryFetch = async (url, opts, retry = 3, retryDelay = 100) => {
while (retry > 0) {
try {
return await fetch(url, opts);
}
catch (e) {
retry = retry - 1;
if (retry <= 0) {
throw e;
}
await new Promise(resolve => setTimeout(resolve, retryDelay));
}
}
return null;
};
exports.retryFetch = retryFetch;
const downloadFile = async (url, filePath) => {
const writeStream = fs_extra_1.default.createWriteStream(filePath);
const response = await fetch(url);
if (!response.ok || !response.body) {
throw new Error(`Unable to download file from ${url}: ${response.statusText}`);
}
const stream = stream_1.Readable.fromWeb(response.body).pipe(writeStream);
return new Promise((resolve, reject) => {
stream.on("error", reject);
stream.on("close", resolve);
});
};
exports.downloadFile = downloadFile;
const unzipFile = async (zipPath, outputDir) => {
await fs_extra_1.default.ensureDir(outputDir);
const windowsSystemRoot = process.env.SystemRoot ?? process.env.SYSTEMROOT ?? "C:\\Windows";
// Mirrors @puppeteer/browsers native zip extraction:
// https://github.com/puppeteer/puppeteer/blob/main/packages/browsers/src/fileUtil.ts#L195-L233
const attempts = process.platform === "win32"
? [
{
command: path_1.default.win32.join(windowsSystemRoot, "System32", "tar.exe"),
args: ["-xf", zipPath, "-C", outputDir],
},
{
command: "powershell.exe",
args: [
"-NoProfile",
"-NonInteractive",
"-Command",
"& { Expand-Archive -LiteralPath $args[0] -DestinationPath $args[1] -Force }",
zipPath,
outputDir,
],
},
{
command: "pwsh.exe",
args: [
"-NoProfile",
"-NonInteractive",
"-Command",
"& { Expand-Archive -LiteralPath $args[0] -DestinationPath $args[1] -Force }",
zipPath,
outputDir,
],
},
]
: [{ command: "unzip", args: ["-o", zipPath, "-d", outputDir] }];
const errors = [];
for (const attempt of attempts) {
try {
await execFileAsync(attempt.command, attempt.args, { windowsHide: true });
return outputDir;
}
catch (err) {
const error = err;
const output = [error.stdout, error.stderr].filter(Boolean).join("\n").trim();
errors.push(`${attempt.command} failed: ${error.message}${output ? `\n${output}` : ""}`);
}
}
throw new Error(`Unable to unzip ${zipPath} to ${outputDir}:\n${errors.join("\n\n")}`);
};
exports.unzipFile = unzipFile;
//# sourceMappingURL=utils.js.map