2022-04-27 20:14:10 +02:00
|
|
|
import { strict as assert } from 'assert';
|
|
|
|
import browser from 'webextension-polyfill';
|
|
|
|
import sinon from 'sinon';
|
|
|
|
import {
|
|
|
|
PLATFORM_CHROME,
|
|
|
|
PLATFORM_EDGE,
|
|
|
|
METAMASK_BETA_CHROME_ID,
|
|
|
|
METAMASK_PROD_CHROME_ID,
|
|
|
|
METAMASK_FLASK_CHROME_ID,
|
2023-03-02 17:17:45 +01:00
|
|
|
METAMASK_MMI_PROD_CHROME_ID,
|
|
|
|
METAMASK_MMI_BETA_CHROME_ID,
|
2022-04-27 20:14:10 +02:00
|
|
|
} from '../../shared/constants/app';
|
|
|
|
import {
|
|
|
|
checkForMultipleVersionsRunning,
|
|
|
|
onMessageReceived,
|
|
|
|
} from './detect-multiple-instances';
|
|
|
|
import * as util from './lib/util';
|
|
|
|
|
|
|
|
describe('multiple instances running detector', function () {
|
|
|
|
const PING_MESSAGE = 'isRunning';
|
|
|
|
|
|
|
|
let sendMessageStub = sinon.stub();
|
|
|
|
|
|
|
|
beforeEach(async function () {
|
|
|
|
sinon.replace(browser, 'runtime', {
|
|
|
|
sendMessage: sendMessageStub,
|
|
|
|
id: METAMASK_BETA_CHROME_ID,
|
|
|
|
});
|
|
|
|
|
|
|
|
sinon.stub(util, 'getPlatform').callsFake((_) => {
|
|
|
|
return PLATFORM_CHROME;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(function () {
|
|
|
|
sinon.restore();
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('checkForMultipleVersionsRunning', function () {
|
|
|
|
it('should send ping message to multiple instances', async function () {
|
|
|
|
await checkForMultipleVersionsRunning();
|
|
|
|
|
2023-03-02 17:17:45 +01:00
|
|
|
assert(sendMessageStub.callCount === 4);
|
2022-04-27 20:14:10 +02:00
|
|
|
assert(
|
|
|
|
sendMessageStub
|
|
|
|
.getCall(0)
|
|
|
|
.calledWithExactly(METAMASK_PROD_CHROME_ID, PING_MESSAGE),
|
|
|
|
);
|
|
|
|
assert(
|
|
|
|
sendMessageStub
|
|
|
|
.getCall(1)
|
|
|
|
.calledWithExactly(METAMASK_FLASK_CHROME_ID, PING_MESSAGE),
|
|
|
|
);
|
2023-03-02 17:17:45 +01:00
|
|
|
assert(
|
|
|
|
sendMessageStub
|
|
|
|
.getCall(2)
|
|
|
|
.calledWithExactly(METAMASK_MMI_BETA_CHROME_ID, PING_MESSAGE),
|
|
|
|
);
|
|
|
|
assert(
|
|
|
|
sendMessageStub
|
|
|
|
.getCall(3)
|
|
|
|
.calledWithExactly(METAMASK_MMI_PROD_CHROME_ID, PING_MESSAGE),
|
|
|
|
);
|
2022-04-27 20:14:10 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should not send ping message if platform is not Chrome or Firefox', async function () {
|
|
|
|
util.getPlatform.restore();
|
|
|
|
sendMessageStub = sinon.stub();
|
|
|
|
|
|
|
|
sinon.stub(util, 'getPlatform').callsFake((_) => {
|
|
|
|
return PLATFORM_EDGE;
|
|
|
|
});
|
|
|
|
|
|
|
|
await checkForMultipleVersionsRunning();
|
|
|
|
|
|
|
|
assert(sendMessageStub.notCalled);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not expose an error outside if sendMessage throws', async function () {
|
|
|
|
sinon.restore();
|
|
|
|
|
|
|
|
sinon.replace(browser, 'runtime', {
|
|
|
|
sendMessage: sinon.stub().throws(),
|
|
|
|
id: METAMASK_BETA_CHROME_ID,
|
|
|
|
});
|
|
|
|
|
|
|
|
const spy = sinon.spy(checkForMultipleVersionsRunning);
|
|
|
|
|
|
|
|
await checkForMultipleVersionsRunning();
|
|
|
|
|
|
|
|
assert(!spy.threw());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('onMessageReceived', function () {
|
|
|
|
beforeEach(function () {
|
|
|
|
sinon.spy(console, 'warn');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should print warning message to on ping message received', async function () {
|
|
|
|
onMessageReceived(PING_MESSAGE);
|
|
|
|
|
|
|
|
assert(
|
|
|
|
console.warn.calledWithExactly(
|
|
|
|
'Warning! You have multiple instances of MetaMask running!',
|
|
|
|
),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not print warning message if wrong message received', async function () {
|
|
|
|
onMessageReceived(PING_MESSAGE.concat('wrong'));
|
|
|
|
|
|
|
|
assert(console.warn.notCalled);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|