Skip to content

Commit

Permalink
fix: test frees random browser
Browse files Browse the repository at this point in the history
  • Loading branch information
j0tunn committed Jul 25, 2019
1 parent 29fab15 commit f1419e6
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 51 deletions.
2 changes: 1 addition & 1 deletion lib/runner/test-runner/regular-test-runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});

Expand Down
2 changes: 1 addition & 1 deletion lib/worker/runner/test-runner/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions test/lib/_mocha/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
82 changes: 39 additions & 43 deletions test/lib/runner/test-runner/regular-test-runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
});
Expand Down
13 changes: 7 additions & 6 deletions test/lib/worker/runner/test-runner/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -38,6 +38,7 @@ describe('worker/runner/test-runner', () => {
config = _.defaults(config, {resetCursor: true});

return {
id,
publicAPI,
config,
meta: {},
Expand Down Expand Up @@ -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`);
});
});

Expand Down Expand Up @@ -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());
});
Expand All @@ -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'});
});
});
});
Expand Down

0 comments on commit f1419e6

Please sign in to comment.