wdio-docker-service
Version:
WebdriverIO service to start and stop docker container (for Selenium and more)
100 lines (81 loc) • 2.38 kB
JavaScript
"use strict";
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _docker = _interopRequireDefault(require("./utils/docker"));
var _getFilePath = _interopRequireDefault(require("./utils/getFilePath"));
var _logger = _interopRequireDefault(require("@wdio/logger"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const DEFAULT_LOG_FILENAME = 'docker-log.txt';
const Logger = (0, _logger.default)('wdio-docker-service');
class DockerLauncher {
constructor() {
this.logToStdout = false;
this.docker = null;
this.dockerLogs = null;
}
onPrepare(config) {
this.logToStdout = config.logToStdout;
this.dockerLogs = config.dockerLogs;
this.watchMode = !!config.watch;
Logger.setLevel(config.logLevel || 'info');
const {
dockerOptions: {
args,
command,
healthCheck,
image,
options
},
onDockerReady,
logLevel
} = config;
if (!image) {
return Promise.reject(new Error('dockerOptions.image is a required property'));
}
this.docker = new _docker.default(image, {
args,
command,
healthCheck,
options,
debug: logLevel && logLevel === 'debug'
}, Logger);
if (typeof this.dockerLogs === 'string') {
const logFile = (0, _getFilePath.default)(this.dockerLogs, DEFAULT_LOG_FILENAME);
this.docker.once('processCreated', () => {
this._redirectLogStream(logFile);
});
}
return this.docker.run().then(() => {
if (typeof onDockerReady === 'function') {
onDockerReady();
}
}).catch(err => {
Logger.error(`Failed to run container: ${err.message}`);
});
}
onComplete() {
// do not stop docker if in watch mode
if (!this.watchMode && this.docker) {
return this.docker.stop();
}
}
afterSession() {
if (this.docker) {
this.docker.stop();
}
}
/**
* @param logFile
* @private
*/
_redirectLogStream(logFile) {
// ensure file & directory exists
return _fsExtra.default.ensureFile(logFile).then(() => {
const logStream = _fsExtra.default.createWriteStream(logFile, {
flags: 'w'
});
this.docker.process.stdout.pipe(logStream);
this.docker.process.stderr.pipe(logStream);
});
}
}
module.exports = DockerLauncher;