diff --git a/lib/runner/test-runner/regular-test-runner.js b/lib/runner/test-runner/regular-test-runner.js index dc82a5874..f10d5d25a 100644 --- a/lib/runner/test-runner/regular-test-runner.js +++ b/lib/runner/test-runner/regular-test-runner.js @@ -19,7 +19,7 @@ module.exports = class RegularTestRunner extends Runner { async run(workers) { let freeBrowserPromise; - workers.once(`worker.${this._test.id}.freeBrowser`, (browserState) => { + workers.once(`worker.${this._test.id}.${this._test.browserId}.freeBrowser`, (browserState) => { freeBrowserPromise = this._freeBrowser(browserState); }); diff --git a/lib/worker/runner/test-runner/index.js b/lib/worker/runner/test-runner/index.js index 90ec84550..16b0f416a 100644 --- a/lib/worker/runner/test-runner/index.js +++ b/lib/worker/runner/test-runner/index.js @@ -69,7 +69,7 @@ module.exports = class TestRunner { const {meta, state: browserState} = browser; const results = {hermioneCtx, meta}; - ipc.emit(`worker.${this._test.id}.freeBrowser`, browserState); + ipc.emit(`worker.${this._test.id}.${this._test.browserId}.freeBrowser`, browserState); this._browserAgent.freeBrowser(browser); if (error) { diff --git a/test/lib/_mocha/test.js b/test/lib/_mocha/test.js index 2b601d068..28fe6710f 100644 --- a/test/lib/_mocha/test.js +++ b/test/lib/_mocha/test.js @@ -16,6 +16,7 @@ module.exports = class Test extends Runnable { this.type = 'test'; this.title = options.title || 'some-test'; this.id = options.id || 'some-id'; + this.browserId = options.browserId || 'some-browser-id'; this.fn = options.fn || _.noop; this.file = options.file || ''; this.pending = options.pending || false; diff --git a/test/lib/runner/test-runner/regular-test-runner.js b/test/lib/runner/test-runner/regular-test-runner.js index 80d99f989..ea52dcacc 100644 --- a/test/lib/runner/test-runner/regular-test-runner.js +++ b/test/lib/runner/test-runner/regular-test-runner.js @@ -428,30 +428,39 @@ describe('runner/test-runner/regular-test-runner', () => { }); describe('freeBrowser', () => { - it('should release browser on related event from worker', async () => { - const browser = stubBrowser_(); - BrowserAgent.prototype.getBrowser.resolves(browser); + const runTest_ = async ({onRun, onTestFail}) => { + const test = makeTest({id: 'foo', browserId: 'bar'}); + const runner = mkRunner_({test}); + + if (onTestFail) { + runner.on(Events.TEST_FAIL, onTestFail); + } const workers = mkWorkers_(); - workers.runTest.callsFake((test) => { - workers.emit(`worker.${test.id}.freeBrowser`); + workers.runTest.callsFake(() => { + onRun({workers, test}); return stubTestResult_(); }); - await run_({workers}); + await run_({runner, workers}); + }; + + it('should release browser on related event from worker', async () => { + const browser = stubBrowser_(); + BrowserAgent.prototype.getBrowser.resolves(browser); + + await runTest_({onRun: ({workers, test}) => { + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`); + }}); assert.calledOnceWith(BrowserAgent.prototype.freeBrowser, browser); }); it('should release browser only once', async () => { - const workers = mkWorkers_(); - workers.runTest.callsFake((test) => { - workers.emit(`worker.${test.id}.freeBrowser`); - workers.emit(`worker.${test.id}.freeBrowser`); - return stubTestResult_(); - }); - - await run_({workers}); + await runTest_({onRun: ({workers, test}) => { + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`); + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`); + }}); assert.calledOnce(BrowserAgent.prototype.freeBrowser); }); @@ -460,13 +469,10 @@ describe('runner/test-runner/regular-test-runner', () => { const browser = stubBrowser_(); BrowserAgent.prototype.getBrowser.resolves(browser); - const workers = mkWorkers_(); - workers.runTest.callsFake((test) => { - workers.emit(`worker.${test.id}.freeBrowser`, {foo: 'bar'}); + await runTest_({onRun: ({workers, test}) => { + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`, {foo: 'bar'}); return stubTestResult_(); - }); - - await run_({workers}); + }}); assert.calledOnceWith(browser.applyState, {foo: 'bar'}); assert.callOrder(browser.applyState, BrowserAgent.prototype.freeBrowser); @@ -478,13 +484,10 @@ describe('runner/test-runner/regular-test-runner', () => { BrowserAgent.prototype.freeBrowser.callsFake(() => Promise.delay(10).then(afterBrowserFree)); - const workers = mkWorkers_(); - workers.runTest.callsFake((test) => { - workers.emit(`worker.${test.id}.freeBrowser`); - return stubTestResult_(); - }); + await runTest_({onRun: ({workers, test}) => { + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`); + }}); - await run_({workers}); afterRun(); assert.callOrder(afterBrowserFree, afterRun); @@ -493,30 +496,23 @@ describe('runner/test-runner/regular-test-runner', () => { it('should not reject on browser release fail', async () => { BrowserAgent.prototype.freeBrowser.rejects(); - const workers = mkWorkers_(); - workers.runTest.callsFake((test) => { - workers.emit(`worker.${test.id}.freeBrowser`); - return stubTestResult_(); - }); + const res = runTest_({onRun: ({workers, test}) => { + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`); + }}); - await assert.isFulfilled(run_({workers})); + await assert.isFulfilled(res); }); it('should not fail test on browser release fail', async () => { const onTestFail = sinon.stub().named('onTestFail'); - - const runner = mkRunner_() - .on(Events.TEST_FAIL, onTestFail); - BrowserAgent.prototype.freeBrowser.rejects(); - const workers = mkWorkers_(); - workers.runTest.callsFake((test) => { - workers.emit(`worker.${test.id}.freeBrowser`); - return stubTestResult_(); - }); - - await run_({runner, workers}).catch((e) => e); + await runTest_({ + onRun: ({workers, test}) => { + workers.emit(`worker.${test.id}.${test.browserId}.freeBrowser`); + }, + onTestFail + }).catch((e) => e); assert.notCalled(onTestFail); }); diff --git a/test/lib/worker/runner/test-runner/index.js b/test/lib/worker/runner/test-runner/index.js index 4185be683..5395a3fdb 100644 --- a/test/lib/worker/runner/test-runner/index.js +++ b/test/lib/worker/runner/test-runner/index.js @@ -29,7 +29,7 @@ describe('worker/runner/test-runner', () => { return TestRunner.create(test, config, browserAgent); }; - const mkBrowser_ = ({prototype, config} = {}) => { + const mkBrowser_ = ({prototype, config, id} = {}) => { const publicAPI = _.defaults(prototype, { moveToObject: sandbox.stub().named('moveToObject').resolves(), scroll: sandbox.stub().named('scroll').resolves(), @@ -38,6 +38,7 @@ describe('worker/runner/test-runner', () => { config = _.defaults(config, {resetCursor: true}); return { + id, publicAPI, config, meta: {}, @@ -521,12 +522,12 @@ describe('worker/runner/test-runner', () => { }); it('should send test related freeBrowser event on browser release', async () => { - const test = mkTest_({id: 'foo'}); + const test = mkTest_({id: 'foo', browserId: 'bar'}); const runner = mkRunner_({test}); await run_({runner}); - assert.calledOnceWith(ipc.emit, `worker.foo.freeBrowser`); + assert.calledOnceWith(ipc.emit, `worker.foo.bar.freeBrowser`); }); }); @@ -613,12 +614,12 @@ describe('worker/runner/test-runner', () => { }); it('should send test related freeBrowser event on browser release', async () => { - const test = mkTest_({id: 'foo'}); + const test = mkTest_({id: 'foo', browserId: 'bar'}); const runner = mkRunner_({test}); ExecutionThread.create.callsFake(({browser}) => { ExecutionThread.prototype.run.callsFake(() => { - browser.state.bar = 'baz'; + browser.state.baz = 'qux'; return Promise.reject(new Error()); }); @@ -628,7 +629,7 @@ describe('worker/runner/test-runner', () => { await run_({runner}).catch((e) => e); - assert.calledOnceWith(ipc.emit, `worker.foo.freeBrowser`, {bar: 'baz'}); + assert.calledOnceWith(ipc.emit, `worker.foo.bar.freeBrowser`, {baz: 'qux'}); }); }); });