Big News: Socket Selected for OpenAI's Cybersecurity Grant Program.Details
Socket
Book a DemoSign in
Socket

wdio-docker-service

Package Overview
Dependencies
Maintainers
1
Versions
40
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

wdio-docker-service - npm Package Compare versions

Comparing version
1.1.0
to
1.1.1
+490
test/unit/utils/dockerSpec.js
import { expect } from 'chai';
import path from 'path';
import { stub, spy } from 'sinon';
import Docker from '../../../src/utils/docker';
import fs from 'fs-extra';
import * as ChildProcess from '../../../src/utils/child-process';
import Promise from 'bluebird';
describe('Docker', function () {
describe('#constructor', function () {
context('when image argument is not provided', function () {
const tryToInstantiate = () => {
new Docker();
};
it('must throw an error', function () {
expect(tryToInstantiate).to.throw();
});
});
context('when image argument is provided', function () {
context('when optional arguments are not provided', function () {
it('must use defaults', function () {
const docker = new Docker('my-image');
const cidfile = path.join(process.cwd(), 'my_image.cid');
expect(docker.args).to.eql(undefined);
expect(docker.cidfile).to.eql(cidfile);
expect(docker.command).to.eql(undefined);
expect(docker.debug).to.eql(false);
expect(docker.healthCheck).to.eql(undefined);
expect(docker.logger).to.eql(console);
expect(docker.process).to.eql(null);
expect(docker.options).to.eql({
rm: true,
cidfile
});
});
});
context('when debug argument is set', function () {
it('must set debug property', function () {
const docker = new Docker('my-image', { debug: true });
expect(docker.debug).to.eql(true);
});
});
context('when docker options are set', function () {
it('must properly translate them into a docker run command', function () {
const docker = new Docker('my-image', {
options: {
d: true,
p: ['1234:1234'],
foo: 'bar'
}
});
expect(docker.dockerRunCommand).to.eql(`docker run --cidfile ${ docker.cidfile } --rm -d -p 1234:1234 --foo bar my-image`);
});
});
context('when docker command argument is provided ', function () {
it('must place it after image name ', function () {
const docker = new Docker('my-image', { command: 'test' });
expect(docker.dockerRunCommand).to.eql(`docker run --cidfile ${ docker.cidfile } --rm my-image test`);
});
});
context('when docker args argument is provided ', function () {
it('must place it after image name ', function () {
const docker = new Docker('my-image', { args: '-foo' });
expect(docker.dockerRunCommand).to.eql(`docker run --cidfile ${ docker.cidfile } --rm my-image -foo`);
});
});
context('when both command and args arguments are provided', function () {
it('must place both of them after image name where command is followed by args', function () {
const docker = new Docker('my-image', { command: 'test', args: '-foo' });
expect(docker.dockerRunCommand).to.eql(`docker run --cidfile ${ docker.cidfile } --rm my-image test -foo`);
});
});
});
});
describe('#stop', function () {
const killSpy = new spy();
let mockProcess = {
kill: killSpy
};
before(function () {
stub(Docker.prototype, '_removeStaleContainer').returns(Promise.resolve());
});
after(function () {
Docker.prototype._removeStaleContainer.restore();
});
it('must must process', function () {
const docker = new Docker('my-image');
docker.process = mockProcess;
return docker.stop().then(() => {
expect(killSpy.called).to.eql(true);
expect(docker.process).to.eql(null);
});
});
});
describe('#run', function () {
const mockProcess = {
stdout: {
on: new spy()
},
stderr: {
on: new spy()
},
kill: new spy()
};
beforeEach(function () {
stub(ChildProcess, 'runProcess').returns(Promise.resolve(mockProcess));
stub(Docker.prototype, '_removeStaleContainer').returns(Promise.resolve());
stub(Docker.prototype, '_reportWhenDockerIsRunning').returns(Promise.resolve());
});
afterEach(function () {
ChildProcess.runProcess.restore();
Docker.prototype._removeStaleContainer.restore();
Docker.prototype._reportWhenDockerIsRunning.restore();
});
context('when image is not yet pulled (first time)', function () {
before(function () {
stub(Docker.prototype, '_isImagePresent').returns(Promise.reject());
stub(Docker.prototype, '_pullImage').returns(Promise.resolve());
});
after(function () {
Docker.prototype._isImagePresent.restore();
Docker.prototype._pullImage.restore();
});
it('must attempt to pull image', function () {
const docker = new Docker('my-image');
return docker.run().then(() => {
expect(Docker.prototype._pullImage.called).to.eql(true);
});
});
});
context('when image is already pulled', function () {
before(function () {
stub(Docker.prototype, '_isImagePresent').returns(Promise.resolve());
spy(Docker.prototype, '_pullImage');
});
after(function () {
Docker.prototype._isImagePresent.restore();
Docker.prototype._pullImage.restore();
});
it('must just run the command', function () {
const docker = new Docker('my-image');
return docker.run().then(() => {
expect(Docker.prototype._pullImage.called).to.eql(false);
expect(ChildProcess.runProcess.called).to.eql(true);
});
});
it('must emit processCreated event', function () {
const processCreatedSpy = new spy();
const docker = new Docker('my-image');
docker.on('processCreated', processCreatedSpy);
return docker.run().then(() => {
expect(ChildProcess.runProcess.called).to.eql(true);
expect(processCreatedSpy.called).to.eql(true);
});
});
});
context('when running with debug flag enabled', function () {
const mockLogger = {
log: spy(),
info: spy(),
warn: spy(),
error: spy()
};
before(function () {
stub(Docker.prototype, '_isImagePresent').returns(Promise.resolve());
});
after(function () {
Docker.prototype._isImagePresent.restore();
});
it('must log docker run command', function () {
const docker = new Docker('my-image', { debug: true }, mockLogger);
return docker.run().then(() => {
expect(mockLogger.log.calledWith(`Docker command: docker run --cidfile ${ docker.cidfile } --rm my-image`)).to.eql(true);
});
});
it('must listen to stdout data event', function () {
const docker = new Docker('my-image', { debug: true }, mockLogger);
return docker.run().then((process) => {
expect(process.stdout.on.called).to.eql(true);
});
});
it('must listen to stderr data event', function () {
const docker = new Docker('my-image', { debug: true }, mockLogger);
return docker.run().then((process) => {
expect(process.stderr.on.called).to.eql(true);
});
});
});
});
describe('#stopContainer', function () {
before(function () {
stub(ChildProcess, 'runCommand').returns(Promise.resolve());
});
after(function () {
ChildProcess.runCommand.restore();
});
it('must call docker command to stop running conrainer', function () {
return Docker.stopContainer('123').then(() => {
expect(ChildProcess.runCommand.calledWith('docker stop 123')).to.eql(true);
});
});
});
describe('#removeContainer', function () {
before(function () {
stub(ChildProcess, 'runCommand').returns(Promise.resolve());
});
after(function () {
ChildProcess.runCommand.restore();
});
it('must call docker command to stop running conrainer', function () {
return Docker.removeContainer('123').then(() => {
expect(ChildProcess.runCommand.calledWith('docker rm 123')).to.eql(true);
});
});
});
describe('#serializeOption', function () {
describe('when a single letter option', function () {
context('and is a boolean', function () {
it('must serialize correctly', function () {
const option = Docker.serializeOption('d', true);
expect(option).to.eql('-d');
});
});
context('and is a string', function () {
it('must serialize correctly', function () {
const option = Docker.serializeOption('d', 'boo');
expect(option).to.eql('-d boo');
});
});
context('and is an array', function () {
it('must serialize correctly', function () {
const option = Docker.serializeOption('d', ['foo=bar', 'bar=foo']);
expect(option).to.eql(['-d foo=bar', '-d bar=foo']);
});
});
});
describe('when multiple-letter option', function () {
context('and is a boolean', function () {
it('must serialize correctly', function () {
const option = Docker.serializeOption('foo', true);
expect(option).to.eql('--foo');
});
});
context('and is a string', function () {
it('must serialize correctly', function () {
const option = Docker.serializeOption('foo', 'boo');
expect(option).to.eql('--foo boo');
});
});
context('and is an array', function () {
it('must serialize correctly', function () {
const option = Docker.serializeOption('doo', ['foo=bar', 'bar=foo']);
expect(option).to.eql(['--doo foo=bar', '--doo bar=foo']);
});
});
});
});
describe('#serializeOptions', function () {
it('must return an array of serialized options', function () {
const options = {
d: true,
foo: true,
boo: 'bop',
e: ['123=345', '678=901']
};
expect(Docker.serializeOptions(options)).to.deep.eql([
'-d',
'--foo',
'--boo bop',
'-e 123=345',
'-e 678=901'
]);
});
});
describe('#_removeStaleContainer', function () {
beforeEach(function () {
stub(fs, 'remove').returns(Promise.resolve());
stub(Docker, 'stopContainer').returns(Promise.resolve());
stub(Docker, 'removeContainer').returns(Promise.resolve());
});
afterEach(function () {
fs.remove.restore();
Docker.stopContainer.restore();
Docker.removeContainer.restore();
});
context('when cid file exists', function () {
before(function () {
stub(fs, 'readFile').returns(Promise.resolve('123'));
});
after(function () {
fs.readFile.restore();
});
it('must remove stale container', function () {
const docker = new Docker('my-image');
return docker._removeStaleContainer().then(() => {
expect(fs.readFile.calledWith(docker.cidfile)).to.eql(true);
expect(fs.remove.calledWith(docker.cidfile)).to.eql(true);
expect(Docker.stopContainer.calledWith('123')).to.eql(true);
expect(Docker.removeContainer.calledWith('123')).to.eql(true);
});
});
});
context('when cid file does not exist', function () {
before(function () {
stub(fs, 'readFile').returns(Promise.reject());
});
after(function () {
fs.readFile.restore();
});
it('must attempt to remove stale container', function () {
const docker = new Docker('my-image');
return docker._removeStaleContainer().catch(() => {
expect(fs.readFile.calledWith(docker.cidfile)).to.eql(true);
expect(fs.remove.calledWith(docker.cidfile)).to.eql(true);
expect(Docker.stopContainer.calledWith('123')).to.eql(false);
expect(Docker.removeContainer.calledWith('123')).to.eql(false);
});
});
});
});
describe('#_pullImage', function () {
before(function () {
stub(ChildProcess, 'runCommand').returns(Promise.resolve());
});
after(function () {
ChildProcess.runCommand.restore();
});
it('must call runCommand', function () {
const docker = new Docker('my-image');
return docker._pullImage().then(() => {
expect(ChildProcess.runCommand.calledWith('docker pull my-image')).to.eql(true);
});
});
});
describe('#_isImagePresent', function () {
before(function () {
stub(ChildProcess, 'runCommand').returns(Promise.resolve());
});
after(function () {
ChildProcess.runCommand.restore();
});
it('must call runCommand', function () {
const docker = new Docker('my-image');
return docker._isImagePresent().then(() => {
expect(ChildProcess.runCommand.calledWith('docker image inspect my-image')).to.eql(true);
});
});
});
describe('#_reportWhenDockerIsRunning', function () {
context('when healthCheck is not set', function () {
const pingDef = require('../../../src/utils/ping');
before(function () {
stub(pingDef, 'default').returns(Promise.reject());
spy(global, 'clearTimeout');
});
after(function () {
pingDef.default.restore();
global.clearTimeout.restore();
});
it('must resolve promise right away', function () {
const docker = new Docker('my-image');
return docker._reportWhenDockerIsRunning().then(() => {
expect(global.clearTimeout.called).to.eql(true);
expect(pingDef.default.called).to.eql(false);
});
});
});
context('when healthCheck is provided', function () {
const pingDef = require('../../../src/utils/ping');
before(function () {
stub(pingDef, 'default').returns(Promise.resolve());
spy(global, 'clearTimeout');
});
after(function () {
pingDef.default.restore();
global.clearTimeout.restore();
});
it('must Ping the healthCheck url', function () {
const docker = new Docker('my-image', { healthCheck: 'http://localhost:8080' });
return docker._reportWhenDockerIsRunning().then(() => {
expect(global.clearTimeout.called).to.eql(true);
expect(pingDef.default.calledWith('http://localhost:8080')).to.eql(true);
});
});
});
context('when healthCheck is provided but is unreachable', function () {
const pingDef = require('../../../src/utils/ping');
before(function () {
stub(pingDef, 'default').returns(Promise.reject());
spy(global, 'clearTimeout');
});
after(function () {
pingDef.default.restore();
global.clearTimeout.restore();
});
it('must attempt to ping healthCheck url and then exit', function () {
const docker = new Docker('my-image', { healthCheck: 'http://localhost:8080' });
this.timeout(15000);
return docker._reportWhenDockerIsRunning().catch(() => {
expect(global.clearTimeout.called).to.eql(true);
expect(pingDef.default.calledWith('http://localhost:8080')).to.eql(true);
});
});
});
});
});
+269
-137

@@ -17,3 +17,32 @@ <?xml version="1.0" encoding="UTF-8"?>

<component name="FileEditorManager">
<leaf />
<leaf>
<file leaf-file-name="dockerSpec.js" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/test/unit/utils/dockerSpec.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="280">
<caret line="206" column="110" lean-forward="false" selection-start-line="206" selection-start-column="110" selection-end-line="206" selection-end-column="110" />
<folding>
<element signature="e#0#30#0" expanded="true" />
<element signature="e#3747#4408#0" expanded="false" />
<element signature="e#5256#5924#0" expanded="false" />
<element signature="e#5988#7164#0" expanded="false" />
<element signature="e#8082#8324#0" expanded="false" />
<element signature="e#8391#8633#0" expanded="false" />
<element signature="e#8700#9169#0" expanded="false" />
<element signature="e#9218#9687#0" expanded="false" />
<element signature="e#9736#11624#0" expanded="false" />
<element signature="e#11674#12150#0" expanded="false" />
<element signature="e#12205#14280#0" expanded="false" />
<element signature="e#14324#14811#0" expanded="false" />
<element signature="e#14860#15361#0" expanded="false" />
<element signature="e#15421#18057#0" expanded="false" />
<element signature="e#15482#16223#0" expanded="false" />
<element signature="e#16287#17097#0" expanded="false" />
<element signature="e#17180#18049#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>

@@ -42,2 +71,4 @@ <component name="FileTemplateManagerImpl">

<find>&quot;</find>
<find>Promise</find>
<find>--cidfile</find>
</findStrings>

@@ -83,3 +114,2 @@ <replaceStrings>

<option value="$PROJECT_DIR$/test/integration/main.spec.js" />
<option value="$PROJECT_DIR$/src/utils/child-process.js" />
<option value="$PROJECT_DIR$/test/integration/wdio.conf.js" />

@@ -97,3 +127,2 @@ <option value="$PROJECT_DIR$/test/mocks/MockChildProcess.js" />

<option value="$PROJECT_DIR$/test/unit/utils/deepMergeSpec.js" />
<option value="$PROJECT_DIR$/src/utils/docker.js" />
<option value="$PROJECT_DIR$/test/integration/docker-app/wdio.conf.js" />

@@ -105,6 +134,9 @@ <option value="$PROJECT_DIR$/.gitignore" />

<option value="$PROJECT_DIR$/launcher.js" />
<option value="$PROJECT_DIR$/test/unit/launcherSpec.js" />
<option value="$PROJECT_DIR$/README.md" />
<option value="$PROJECT_DIR$/src/launcher.js" />
<option value="$PROJECT_DIR$/test/unit/launcherSpec.js" />
<option value="$PROJECT_DIR$/src/utils/docker.js" />
<option value="$PROJECT_DIR$/src/utils/child-process.js" />
<option value="$PROJECT_DIR$/package.json" />
<option value="$PROJECT_DIR$/README.md" />
<option value="$PROJECT_DIR$/test/unit/utils/dockerSpec.js" />
</list>

@@ -163,2 +195,13 @@ </option>

<item name="wdio-docker-service" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="wdio-docker-service" type="b2602c69:ProjectViewProjectNode" />
<item name="wdio-docker-service" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="utils" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="wdio-docker-service" type="b2602c69:ProjectViewProjectNode" />
<item name="wdio-docker-service" type="462c0819:PsiDirectoryNode" />
<item name="test" type="462c0819:PsiDirectoryNode" />

@@ -172,2 +215,9 @@ </path>

</path>
<path>
<item name="wdio-docker-service" type="b2602c69:ProjectViewProjectNode" />
<item name="wdio-docker-service" type="462c0819:PsiDirectoryNode" />
<item name="test" type="462c0819:PsiDirectoryNode" />
<item name="unit" type="462c0819:PsiDirectoryNode" />
<item name="utils" type="462c0819:PsiDirectoryNode" />
</path>
</expand>

@@ -188,3 +238,3 @@ <select />

<property name="node.js.selected.package.eslint" value="$PROJECT_DIR$/node_modules/eslint" />
<property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
<property name="settings.editor.selected.configurable" value="editing.templates" />
<property name="javascript.nodejs.core.library.configured.version" value="6.10.2" />

@@ -195,3 +245,3 @@ <property name="JavaScriptWeakerCompletionTypeGuess" value="true" />

<property name="DefaultHtmlFileTemplate" value="HTML File" />
<property name="SearchEverywhereHistoryKey" value="docker&#9;FILE&#9;file:///Users/simontsvilik/Development/wdio-docker-service/src/utils/docker.js" />
<property name="SearchEverywhereHistoryKey" value="&#9;FILE&#9;file:///Users/simontsvilik/Development/wdio-docker-service/src/utils/child-process.js&#10;child&#9;FILE&#9;file:///Users/simontsvilik/Development/wdio-docker-service/lib/utils/child-process.js.map&#10;docker&#9;FILE&#9;file:///Users/simontsvilik/Development/wdio-docker-service/src/utils/docker.js" />
</component>

@@ -352,3 +402,3 @@ <component name="RecentsManager">

<workItem from="1515853342240" duration="17000" />
<workItem from="1515853388398" duration="28068000" />
<workItem from="1515853388398" duration="49760000" />
</task>

@@ -614,34 +664,62 @@ <task id="LOCAL-00001" summary="initial commit">

</task>
<option name="localTasksCounter" value="38" />
<task id="LOCAL-00038" summary="chore: v1.1.0">
<created>1515943619857</created>
<option name="number" value="00038" />
<option name="presentableId" value="LOCAL-00038" />
<option name="project" value="LOCAL" />
<updated>1515943619857</updated>
</task>
<task id="LOCAL-00039" summary="feat: use bluebird">
<created>1516080459482</created>
<option name="number" value="00039" />
<option name="presentableId" value="LOCAL-00039" />
<option name="project" value="LOCAL" />
<updated>1516080459482</updated>
</task>
<task id="LOCAL-00040" summary="test: add docker unit tests">
<created>1516080479970</created>
<option name="number" value="00040" />
<option name="presentableId" value="LOCAL-00040" />
<option name="project" value="LOCAL" />
<updated>1516080479970</updated>
</task>
<task id="LOCAL-00041" summary="test: add docker unit tests">
<created>1516080919932</created>
<option name="number" value="00041" />
<option name="presentableId" value="LOCAL-00041" />
<option name="project" value="LOCAL" />
<updated>1516080919932</updated>
</task>
<option name="localTasksCounter" value="42" />
<servers />
</component>
<component name="TestHistory">
<history-entry file="Unit_Tests - 2018.01.13 at 23h 27m 15s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 10m 54s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 35m 57s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 16m 02s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 37m 33s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 16m 26s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 38m 14s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 16m 52s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 40m 41s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 17m 55s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 46m 51s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 19m 50s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 47m 33s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 20m 19s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.13 at 23h 48m 00s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 22m 22s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.14 at 00h 22m 56s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 22m 47s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />
</history-entry>
<history-entry file="Unit_Tests - 2018.01.14 at 00h 23m 08s.xml">
<history-entry file="Unit_Tests - 2018.01.16 at 00h 35m 06s.xml">
<configuration name="Unit Tests" configurationId="mocha-javascript-test-runner" />

@@ -651,3 +729,3 @@ </history-entry>

<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="110608000" />
<option name="totallyTimeSpent" value="132300000" />
</component>

@@ -662,8 +740,9 @@ <component name="ToolWindowManager">

<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32968536" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32968536" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32968536" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="npm" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.17300789" sideWeight="0.504788" order="0" side_tool="true" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Remote Host" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.17229003" sideWeight="0.49521205" order="0" side_tool="false" content_ui="combo" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.17229003" sideWeight="0.49521205" order="0" side_tool="false" content_ui="combo" />
<window_info id="Docker" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />

@@ -728,7 +807,10 @@ <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />

<MESSAGE value="chore: fix travis to upload code coverage" />
<option name="LAST_COMMIT_MESSAGE" value="chore: fix travis to upload code coverage" />
<MESSAGE value="chore: v1.1.0" />
<MESSAGE value="feat: use bluebird" />
<MESSAGE value="test: add docker unit tests" />
<option name="LAST_COMMIT_MESSAGE" value="test: add docker unit tests" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="111" />
<option name="time" value="143" />
</breakpoint-manager>

@@ -742,2 +824,4 @@ <watches-manager>

<watch expression="ColorLogger._writeLog.calledWith('info', 'test')" language="JavaScript" />
<watch expression="fs" language="JavaScript" />
<watch expression="typeof fetchSpy" language="JavaScript" />
</configuration>

@@ -749,2 +833,12 @@ </watches-manager>

<expression>
<expression-string>typeof fetchSpy</expression-string>
<language-id>JavaScript</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>fs</expression-string>
<language-id>JavaScript</language-id>
<evaluation-mode>EXPRESSION</evaluation-mode>
</expression>
<expression>
<expression-string>ColorLogger._writeLog.calledWith('info', 'test')</expression-string>

@@ -767,51 +861,2 @@ <language-id>JavaScript</language-id>

<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/launcher.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="0" lean-forward="false" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/launcher.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="47" lean-forward="false" selection-start-line="3" selection-start-column="47" selection-end-line="3" selection-end-column="47" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15">
<caret line="1" column="20" lean-forward="false" selection-start-line="1" selection-start-column="20" selection-end-line="1" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/launcher.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="0" lean-forward="false" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/launcher.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="47" lean-forward="false" selection-start-line="3" selection-start-column="47" selection-end-line="3" selection-end-column="47" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/.eslintrc">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="6" column="5" lean-forward="false" selection-start-line="6" selection-start-column="5" selection-end-line="6" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/docker-harness.js" />

@@ -834,9 +879,2 @@ <entry file="file://$PROJECT_DIR$/test/selenium_standalone-firefox.cid" />

</entry>
<entry file="file://$PROJECT_DIR$/src/utils/getFilePath.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300">
<caret line="20" column="1" lean-forward="false" selection-start-line="20" selection-start-column="1" selection-end-line="20" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/index.js">

@@ -850,9 +888,2 @@ <provider selected="true" editor-type-id="text-editor">

<entry file="file://$PROJECT_DIR$/docker-service.txt" />
<entry file="file://$PROJECT_DIR$/src/utils/ping.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60">
<caret line="4" column="1" lean-forward="false" selection-start-line="4" selection-start-column="1" selection-end-line="4" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/utils/camel-to-dash.js">

@@ -901,9 +932,2 @@ <provider selected="true" editor-type-id="text-editor">

</entry>
<entry file="file://$PROJECT_DIR$/src/utils/child-process.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="690">
<caret line="46" column="76" lean-forward="false" selection-start-line="46" selection-start-column="29" selection-end-line="46" selection-end-column="76" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/unit/camelToDashSpec.js">

@@ -1014,10 +1038,2 @@ <provider selected="true" editor-type-id="text-editor">

</entry>
<entry file="file://$PROJECT_DIR$/src/utils/docker.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="293">
<caret line="43" column="19" lean-forward="true" selection-start-line="43" selection-start-column="19" selection-end-line="43" selection-end-column="19" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/integration/docker-app/wdio.conf.js">

@@ -1055,18 +1071,55 @@ <provider selected="true" editor-type-id="text-editor">

</entry>
<entry file="file://$PROJECT_DIR$/src/launcher.js">
<entry file="file://$PROJECT_DIR$/.travis.yml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="369">
<caret line="80" column="0" lean-forward="false" selection-start-line="80" selection-start-column="0" selection-end-line="80" selection-end-column="7" />
<folding>
<element signature="e#0#26#0" expanded="false" />
</folding>
<state relative-caret-position="293">
<caret line="27" column="12" lean-forward="false" selection-start-line="27" selection-start-column="12" selection-end-line="27" selection-end-column="12" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="60">
<caret line="4" column="0" lean-forward="false" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
<folding>
<marker date="1515942934461" expanded="true" signature="1982:2031" ph="{...}" />
<marker date="1515942934461" expanded="true" signature="2229:2384" ph="{...}" />
<marker date="1515942934461" expanded="true" signature="2327:2382" ph="{...}" />
<marker date="1515942934461" expanded="true" signature="3471:3586" ph="{...}" />
</folding>
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.babelrc">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="7" lean-forward="false" selection-start-line="5" selection-start-column="7" selection-end-line="5" selection-end-column="7" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.coveralls.yml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="0" lean-forward="false" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105">
<caret line="7" column="0" lean-forward="false" selection-start-line="7" selection-start-column="0" selection-end-line="7" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/unit/launcherSpec.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<state relative-caret-position="-226">
<caret line="5" column="4" lean-forward="false" selection-start-line="5" selection-start-column="4" selection-end-line="6" selection-end-column="57" />
<folding>
<element signature="e#0#30#0" expanded="false" />
<element signature="e#558#799#0" expanded="false" />

@@ -1089,6 +1142,6 @@ <element signature="e#969#1407#0" expanded="false" />

</entry>
<entry file="file://$PROJECT_DIR$/.travis.yml">
<entry file="file://$PROJECT_DIR$/test/unit/utils/deepMergeSpec.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="293">
<caret line="27" column="12" lean-forward="false" selection-start-line="27" selection-start-column="12" selection-end-line="27" selection-end-column="12" />
<state relative-caret-position="15">
<caret line="1" column="0" lean-forward="false" selection-start-line="1" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding />

@@ -1098,22 +1151,19 @@ </state>

</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="60">
<caret line="4" column="0" lean-forward="false" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
<folding>
<marker date="1515942628420" expanded="true" signature="1983:2032" ph="{...}" />
<marker date="1515942628420" expanded="true" signature="2230:2385" ph="{...}" />
<marker date="1515942628420" expanded="true" signature="2328:2383" ph="{...}" />
<marker date="1515942628420" expanded="true" signature="3472:3587" ph="{...}" />
</folding>
</first_editor>
<second_editor />
<entry file="file://$PROJECT_DIR$/test/unit/utils/childProcessSpec.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#41#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<entry file="file://$PROJECT_DIR$/lib/utils/child-process.js.map">
<provider editor-type-id="sourcemapFileViewerProvider">
<state />
</provider>
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-519">
<caret line="4" column="51" lean-forward="true" selection-start-line="4" selection-start-column="51" selection-end-line="4" selection-end-column="51" />
<state relative-caret-position="0">
<caret line="0" column="110" lean-forward="false" selection-start-line="0" selection-start-column="110" selection-end-line="0" selection-end-column="110" />
<folding />

@@ -1123,6 +1173,16 @@ </state>

</entry>
<entry file="file://$PROJECT_DIR$/.babelrc">
<entry file="file://$PROJECT_DIR$/test/unit/utils/getFilePathSpec.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="7" lean-forward="false" selection-start-line="5" selection-start-column="7" selection-end-line="5" selection-end-column="7" />
<state relative-caret-position="-27">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#57#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/utils/getFilePath.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300">
<caret line="20" column="1" lean-forward="false" selection-start-line="20" selection-start-column="1" selection-end-line="20" selection-end-column="1" />
<folding />

@@ -1132,6 +1192,16 @@ </state>

</entry>
<entry file="file://$PROJECT_DIR$/.coveralls.yml">
<entry file="file://$PROJECT_DIR$/src/utils/child-process.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="0" lean-forward="false" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<caret line="2" column="0" lean-forward="true" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding>
<element signature="e#0#38#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/node_modules/node-fetch/lib/request.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300">
<caret line="20" column="9" lean-forward="false" selection-start-line="20" selection-start-column="9" selection-end-line="20" selection-end-column="9" />
<folding />

@@ -1141,6 +1211,6 @@ </state>

</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<entry file="file://$PROJECT_DIR$/node_modules/node-fetch/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105">
<caret line="7" column="0" lean-forward="false" selection-start-line="7" selection-start-column="0" selection-end-line="7" selection-end-column="0" />
<state relative-caret-position="60">
<caret line="35" column="4" lean-forward="false" selection-start-line="35" selection-start-column="4" selection-end-line="35" selection-end-column="4" />
<folding />

@@ -1150,3 +1220,65 @@ </state>

</entry>
<entry file="file://$PROJECT_DIR$/src/utils/ping.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="4" lean-forward="false" selection-start-line="3" selection-start-column="4" selection-end-line="3" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/utils/docker.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2085">
<caret line="139" column="4" lean-forward="false" selection-start-line="139" selection-start-column="4" selection-end-line="139" selection-end-column="4" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="332">
<caret line="34" column="44" lean-forward="true" selection-start-line="34" selection-start-column="44" selection-end-line="34" selection-end-column="44" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/launcher.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-667">
<caret line="14" column="23" lean-forward="false" selection-start-line="14" selection-start-column="23" selection-end-line="14" selection-end-column="23" />
<folding>
<element signature="e#0#26#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/unit/utils/dockerSpec.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="280">
<caret line="206" column="110" lean-forward="false" selection-start-line="206" selection-start-column="110" selection-end-line="206" selection-end-column="110" />
<folding>
<element signature="e#0#30#0" expanded="true" />
<element signature="e#3747#4408#0" expanded="false" />
<element signature="e#5256#5924#0" expanded="false" />
<element signature="e#5988#7164#0" expanded="false" />
<element signature="e#8082#8324#0" expanded="false" />
<element signature="e#8391#8633#0" expanded="false" />
<element signature="e#8700#9169#0" expanded="false" />
<element signature="e#9218#9687#0" expanded="false" />
<element signature="e#9736#11624#0" expanded="false" />
<element signature="e#11674#12150#0" expanded="false" />
<element signature="e#12205#14280#0" expanded="false" />
<element signature="e#14324#14811#0" expanded="false" />
<element signature="e#14860#15361#0" expanded="false" />
<element signature="e#15421#18057#0" expanded="false" />
<element signature="e#15482#16223#0" expanded="false" />
<element signature="e#16287#17097#0" expanded="false" />
<element signature="e#17180#18049#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
</component>
</project>
{
"name": "wdio-docker-service",
"version": "1.1.0",
"version": "1.1.1",
"description": "WebdriverIO service to start and stop docker container (for Selenium and more)",

@@ -48,2 +48,3 @@ "repository": {

"dependencies": {
"bluebird": "^3.5.1",
"chalk": "^2.3.0",

@@ -50,0 +51,0 @@ "fs-extra": "^5.0.0",

import fs from 'fs-extra';
import Docker from './utils/docker';
import getFilePath from './utils/getFilePath';
import Promise from 'bluebird';

@@ -5,0 +6,0 @@ const DEFAULT_LOG_FILENAME = 'docker-log.txt';

import { spawn } from 'child_process';
import Promise from 'bluebird';

@@ -3,0 +4,0 @@ const SPACE = ' ';

@@ -8,2 +8,3 @@ import camelToDash from './camel-to-dash';

import { EventEmitter } from 'events';
import Promise from 'bluebird';

@@ -13,3 +14,2 @@ const SPACE = ' ';

const MAX_INSPECT_ATTEMPTS = 10;
const DEFAULT_HEALTH_CHECK = 'http://localhost:4444';
const DEFAULT_OPTIONS = {

@@ -25,4 +25,4 @@ rm: true

* @param {String} image Docker image/tag name
* @param {Boolean} debug Enables logging
* @param {Object} options
* @param {Boolean} [debug] Enables logging
* @param {Object} [options] Docker run options
* @param {String} [healthCheck] Url that verifies that service is running

@@ -33,10 +33,14 @@ * @param {String} [command] docker command that follows image/tag name

*/
constructor(image, { debug = false, options = {}, healthCheck, command, args }, logger) {
constructor(image, { debug = false, options = {}, healthCheck, command, args } = {}, logger = console) {
super();
if (!image) {
throw new Error('Missing required image argument');
}
this.args = args;
this.cidfile = path.join(process.cwd(), `${ image.replace(/\W+/g, '_') }.cid`);
this.command = command;
this.debug = debug;
this.healthCheck = healthCheck || DEFAULT_HEALTH_CHECK;
this.debug = Boolean(debug);
this.healthCheck = healthCheck;
this.image = image;

@@ -118,2 +122,3 @@ this.logger = logger;

this.process.kill();
this.process = null;
}

@@ -230,3 +235,3 @@

if (typeof value === 'boolean') {
if (typeof value === 'boolean' && value) {
return `${prefix}${key}`;

@@ -233,0 +238,0 @@ }