@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
89 lines • 12.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug_1 = __importDefault(require("debug"));
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const async_exit_hook_1 = __importDefault(require("async-exit-hook"));
const tmp_1 = __importDefault(require("tmp"));
const make_dir_1 = __importDefault(require("make-dir"));
const lockfile_1 = __importDefault(require("./lockfile"));
const cleanup_process_1 = __importDefault(require("./cleanup-process"));
const promisified_functions_1 = require("../../utils/promisified-functions");
// NOTE: mutable for testing purposes
const TESTCAFE_TMP_DIRS_ROOT = path_1.default.join(os_1.default.tmpdir(), 'testcafe');
const DEFAULT_NAME_PREFIX = 'tmp';
const USED_TEMP_DIRS = {};
const DEBUG_LOGGER = debug_1.default('testcafe:utils:temp-directory');
class TempDirectory {
constructor(namePrefix) {
this.namePrefix = namePrefix || DEFAULT_NAME_PREFIX;
this.path = '';
this.lockFile = null;
}
async _getTmpDirsList() {
const tmpDirNames = await promisified_functions_1.readDir(TempDirectory.TEMP_DIRECTORIES_ROOT);
return tmpDirNames
.filter(tmpDir => !USED_TEMP_DIRS[tmpDir])
.filter(tmpDir => path_1.default.basename(tmpDir).startsWith(this.namePrefix));
}
async _findFreeTmpDir(tmpDirNames) {
for (const tmpDirName of tmpDirNames) {
const tmpDirPath = path_1.default.join(TempDirectory.TEMP_DIRECTORIES_ROOT, tmpDirName);
const lockFile = new lockfile_1.default(tmpDirPath);
if (lockFile.init()) {
this.path = tmpDirPath;
this.lockFile = lockFile;
return true;
}
}
return false;
}
async _createNewTmpDir() {
this.path = tmp_1.default.tmpNameSync({ dir: TempDirectory.TEMP_DIRECTORIES_ROOT, prefix: this.namePrefix + '-' });
await make_dir_1.default(this.path);
this.lockFile = new lockfile_1.default(this.path);
this.lockFile.init();
}
_disposeSync() {
if (!USED_TEMP_DIRS[this.path])
return;
this.lockFile.dispose();
delete USED_TEMP_DIRS[this.path];
}
static async createDirectory(prefix) {
const tmpDir = new TempDirectory(prefix);
await tmpDir.init();
return tmpDir;
}
static disposeDirectoriesSync() {
Object.values(USED_TEMP_DIRS).forEach(tmpDir => tmpDir._disposeSync());
}
async init() {
await make_dir_1.default(TempDirectory.TEMP_DIRECTORIES_ROOT);
const tmpDirNames = await this._getTmpDirsList(this.namePrefix);
DEBUG_LOGGER('Found temp directories:', tmpDirNames);
const existingTmpDirFound = await this._findFreeTmpDir(tmpDirNames);
if (!existingTmpDirFound)
await this._createNewTmpDir();
DEBUG_LOGGER('Temp directory path: ', this.path);
await cleanup_process_1.default.init();
await cleanup_process_1.default.addDirectory(this.path);
USED_TEMP_DIRS[this.path] = this;
}
async dispose() {
if (!USED_TEMP_DIRS[this.path])
return;
this.lockFile.dispose();
await cleanup_process_1.default.removeDirectory(this.path);
delete USED_TEMP_DIRS[this.path];
}
}
exports.default = TempDirectory;
// NOTE: exposed for testing purposes
TempDirectory.TEMP_DIRECTORIES_ROOT = TESTCAFE_TMP_DIRS_ROOT;
async_exit_hook_1.default(TempDirectory.disposeDirectoriesSync);
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvdGVtcC1kaXJlY3RvcnkvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixzRUFBNEM7QUFDNUMsOENBQXNCO0FBQ3RCLHdEQUErQjtBQUMvQiwwREFBa0M7QUFDbEMsd0VBQStDO0FBQy9DLDZFQUE0RDtBQUc1RCxxQ0FBcUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNsRSxNQUFNLG1CQUFtQixHQUFNLEtBQUssQ0FBQztBQUNyQyxNQUFNLGNBQWMsR0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxZQUFZLEdBQWEsZUFBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFFdEUsTUFBcUIsYUFBYTtJQUM5QixZQUFhLFVBQVU7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFFcEQsSUFBSSxDQUFDLElBQUksR0FBTyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLE1BQU0sK0JBQU8sQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUV2RSxPQUFPLFdBQVc7YUFDYixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3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LENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBOUZELGdDQThGQztBQUVELHFDQUFxQztBQUNyQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsc0JBQXNCLENBQUM7QUFFN0QseUJBQWEsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2V0dXBFeGl0SG9vayBmcm9tICdhc3luYy1leGl0LWhvb2snO1xuaW1wb3J0IHRtcCBmcm9tICd0bXAnO1xuaW1wb3J0IG1ha2VEaXIgZnJvbSAnbWFrZS1kaXInO1xuaW1wb3J0IExvY2tGaWxlIGZyb20gJy4vbG9ja2ZpbGUnO1xuaW1wb3J0IGNsZWFudXBQcm9jZXNzIGZyb20gJy4vY2xlYW51cC1wcm9jZXNzJztcbmltcG9ydCB7IHJlYWREaXIgfSBmcm9tICcuLi8uLi91dGlscy9wcm9taXNpZmllZC1mdW5jdGlvbnMnO1xuXG5cbi8vIE5PVEU6IG11dGFibGUgZm9yIHRlc3RpbmcgcHVycG9zZXNcbmNvbnN0IFRFU1RDQUZFX1RNUF9ESVJTX1JPT1QgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksICd0ZXN0Y2FmZScpO1xuY29uc3QgREVGQVVMVF9OQU1FX1BSRUZJWCAgICA9ICd0bXAnO1xuY29uc3QgVVNFRF9URU1QX0RJUlMgICAgICAgICA9IHt9O1xuY29uc3QgREVCVUdfTE9HR0VSICAgICAgICAgICA9IGRlYnVnKCd0ZXN0Y2FmZTp1dGlsczp0ZW1wLWRpcmVjdG9yeScpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW1wRGlyZWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvciAobmFtZVByZWZpeCkge1xuICAgICAgICB0aGlzLm5hbWVQcmVmaXggPSBuYW1lUHJlZml4IHx8IERFRkFVTFRfTkFNRV9QUkVGSVg7XG5cbiAgICAgICAgdGhpcy5wYXRoICAgICA9ICcnO1xuICAgICAgICB0aGlzLmxvY2tGaWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0VG1wRGlyc0xpc3QgKCkge1xuICAgICAgICBjb25zdCB0bXBEaXJOYW1lcyA9IGF3YWl0IHJlYWREaXIoVGVtcERpcmVjdG9yeS5URU1QX0RJUkVDVE9SSUVTX1JPT1QpO1xuXG4gICAgICAgIHJldHVybiB0bXBEaXJOYW1lc1xuICAgICAgICAgICAgLmZpbHRlcih0bXBEaXIgPT4gIVVTRURfVEVNUF9ESVJTW3RtcERpcl0pXG4gICAgICAgICAgICAuZmlsdGVyKHRtcERpciA9PiBwYXRoLmJhc2VuYW1lKHRtcERpcikuc3RhcnRzV2l0aCh0aGlzLm5hbWVQcmVmaXgpKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZmluZEZyZWVUbXBEaXIgKHRtcERpck5hbWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdG1wRGlyTmFtZSBvZiB0bXBEaXJOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgdG1wRGlyUGF0aCA9IHBhdGguam9pbihUZW1wRGlyZWN0b3J5LlRFTVBfRElSRUNUT1JJRVNfUk9PVCwgdG1wRGlyTmFtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2tGaWxlID0gbmV3IExvY2tGaWxlKHRtcERpclBhdGgpO1xuXG4gICAgICAgICAgICBpZiAobG9ja0ZpbGUuaW5pdCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRoICAgICA9IHRtcERpclBhdGg7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NrRmlsZSA9IGxvY2tGaWxlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgX2NyZWF0ZU5ld1RtcERpciAoKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHRtcC50bXBOYW1lU3luYyh7IGRpcjogVGVtcERpcmVjdG9yeS5URU1QX0RJUkVDVE9SSUVTX1JPT1QsIHByZWZpeDogdGhpcy5uYW1lUHJlZml4ICsgJy0nIH0pO1xuXG4gICAgICAgIGF3YWl0IG1ha2VEaXIodGhpcy5wYXRoKTtcblxuICAgICAgICB0aGlzLmxvY2tGaWxlID0gbmV3IExvY2tGaWxlKHRoaXMucGF0aCk7XG5cbiAgICAgICAgdGhpcy5sb2NrRmlsZS5pbml0KCk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VTeW5jICgpIHtcbiAgICAgICAgaWYgKCFVU0VEX1RFTVBfRElSU1t0aGlzLnBhdGhdKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMubG9ja0ZpbGUuZGlzcG9zZSgpO1xuXG4gICAgICAgIGRlbGV0ZSBVU0VEX1RFTVBfRElSU1t0aGlzLnBhdGhdO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGVEaXJlY3RvcnkgKHByZWZpeCkge1xuICAgICAgICBjb25zdCB0bXBEaXIgPSBuZXcgVGVtcERpcmVjdG9yeShwcmVmaXgpO1xuXG4gICAgICAgIGF3YWl0IHRtcERpci5pbml0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRtcERpcjtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzcG9zZURpcmVjdG9yaWVzU3luYyAoKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMoVVNFRF9URU1QX0RJUlMpLmZvckVhY2godG1wRGlyID0+IHRtcERpci5fZGlzcG9zZVN5bmMoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCAoKSB7XG4gICAgICAgIGF3YWl0IG1ha2VEaXIoVGVtcERpcmVjdG9yeS5URU1QX0RJUkVDVE9SSUVTX1JPT1QpO1xuXG4gICAgICAgIGNvbnN0IHRtcERpck5hbWVzID0gYXdhaXQgdGhpcy5fZ2V0VG1wRGlyc0xpc3QodGhpcy5uYW1lUHJlZml4KTtcblxuICAgICAgICBERUJVR19MT0dHRVIoJ0ZvdW5kIHRlbXAgZGlyZWN0b3JpZXM6JywgdG1wRGlyTmFtZXMpO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVG1wRGlyRm91bmQgPSBhd2FpdCB0aGlzLl9maW5kRnJlZVRtcERpcih0bXBEaXJOYW1lcyk7XG5cbiAgICAgICAgaWYgKCFleGlzdGluZ1RtcERpckZvdW5kKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlTmV3VG1wRGlyKCk7XG5cbiAgICAgICAgREVCVUdfTE9HR0VSKCdUZW1wIGRpcmVjdG9yeSBwYXRoOiAnLCB0aGlzLnBhdGgpO1xuXG4gICAgICAgIGF3YWl0IGNsZWFudXBQcm9jZXNzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgY2xlYW51cFByb2Nlc3MuYWRkRGlyZWN0b3J5KHRoaXMucGF0aCk7XG5cbiAgICAgICAgVVNFRF9URU1QX0RJUlNbdGhpcy5wYXRoXSA9IHRoaXM7XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzcG9zZSAoKSB7XG4gICAgICAgIGlmICghVVNFRF9URU1QX0RJUlNbdGhpcy5wYXRoXSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmxvY2tGaWxlLmRpc3Bvc2UoKTtcblxuICAgICAgICBhd2FpdCBjbGVhbnVwUHJvY2Vzcy5yZW1vdmVEaXJlY3RvcnkodGhpcy5wYXRoKTtcblxuICAgICAgICBkZWxldGUgVVNFRF9URU1QX0RJUlNbdGhpcy5wYXRoXTtcbiAgICB9XG59XG5cbi8vIE5PVEU6IGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXNcblRlbXBEaXJlY3RvcnkuVEVNUF9ESVJFQ1RPUklFU19ST09UID0gVEVTVENBRkVfVE1QX0RJUlNfUk9PVDtcblxuc2V0dXBFeGl0SG9vayhUZW1wRGlyZWN0b3J5LmRpc3Bvc2VEaXJlY3Rvcmllc1N5bmMpO1xuIl19