|
|
@ -21,11 +21,25 @@ describe('MessageSender', () => {
|
|
|
|
TestUtils.restoreStubs();
|
|
|
|
TestUtils.restoreStubs();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
describe('canSendToSnode', () => {
|
|
|
|
|
|
|
|
it('should return the correct value', () => {
|
|
|
|
|
|
|
|
const stub = TestUtils.stubWindow('lokiMessageAPI', undefined);
|
|
|
|
|
|
|
|
expect(MessageSender.canSendToSnode()).to.equal(
|
|
|
|
|
|
|
|
false,
|
|
|
|
|
|
|
|
'We cannot send if lokiMessageAPI is not set'
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
stub.set(sandbox.createStubInstance(LokiMessageAPI));
|
|
|
|
|
|
|
|
expect(MessageSender.canSendToSnode()).to.equal(
|
|
|
|
|
|
|
|
true,
|
|
|
|
|
|
|
|
'We can send if lokiMessageAPI is set'
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe('send', () => {
|
|
|
|
describe('send', () => {
|
|
|
|
const ourNumber = 'ourNumber';
|
|
|
|
const ourNumber = 'ourNumber';
|
|
|
|
let lokiMessageAPIStub: sinon.SinonStubbedInstance<LokiMessageAPI>;
|
|
|
|
let lokiMessageAPIStub: sinon.SinonStubbedInstance<LokiMessageAPI>;
|
|
|
|
let messageEncyrptReturnEnvelopeType =
|
|
|
|
let encryptStub: sinon.SinonStub<[string, Uint8Array, EncryptionType]>;
|
|
|
|
SignalService.Envelope.Type.CIPHERTEXT;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
beforeEach(() => {
|
|
|
|
// We can do this because LokiMessageAPI has a module export in it
|
|
|
|
// We can do this because LokiMessageAPI has a module export in it
|
|
|
@ -34,10 +48,59 @@ describe('MessageSender', () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
TestUtils.stubWindow('lokiMessageAPI', lokiMessageAPIStub);
|
|
|
|
TestUtils.stubWindow('lokiMessageAPI', lokiMessageAPIStub);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
encryptStub = sandbox.stub(MessageEncrypter, 'encrypt').resolves({
|
|
|
|
|
|
|
|
envelopeType: SignalService.Envelope.Type.CIPHERTEXT,
|
|
|
|
|
|
|
|
cipherText: crypto.randomBytes(10),
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
sandbox.stub(UserUtil, 'getCurrentDevicePubKey').resolves(ourNumber);
|
|
|
|
sandbox.stub(UserUtil, 'getCurrentDevicePubKey').resolves(ourNumber);
|
|
|
|
sandbox
|
|
|
|
});
|
|
|
|
.stub(MessageEncrypter, 'encrypt')
|
|
|
|
|
|
|
|
.callsFake(async (_device, plainTextBuffer, _type) => ({
|
|
|
|
describe('retry', () => {
|
|
|
|
|
|
|
|
const rawMessage = {
|
|
|
|
|
|
|
|
identifier: '1',
|
|
|
|
|
|
|
|
device: '0',
|
|
|
|
|
|
|
|
plainTextBuffer: crypto.randomBytes(10),
|
|
|
|
|
|
|
|
encryption: EncryptionType.Signal,
|
|
|
|
|
|
|
|
timestamp: Date.now(),
|
|
|
|
|
|
|
|
ttl: 100,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should not retry if an error occurred during encryption', async () => {
|
|
|
|
|
|
|
|
encryptStub.throws(new Error('Failed to encrypt.'));
|
|
|
|
|
|
|
|
const promise = MessageSender.send(rawMessage);
|
|
|
|
|
|
|
|
await expect(promise).is.rejectedWith('Failed to encrypt.');
|
|
|
|
|
|
|
|
expect(lokiMessageAPIStub.sendMessage.callCount).to.equal(0);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should only call lokiMessageAPI once if no errors occured', async () => {
|
|
|
|
|
|
|
|
await MessageSender.send(rawMessage);
|
|
|
|
|
|
|
|
expect(lokiMessageAPIStub.sendMessage.callCount).to.equal(1);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should only retry the specified amount of times before throwing', async () => {
|
|
|
|
|
|
|
|
lokiMessageAPIStub.sendMessage.throws(new Error('API error'));
|
|
|
|
|
|
|
|
const attempts = 2;
|
|
|
|
|
|
|
|
const promise = MessageSender.send(rawMessage, attempts);
|
|
|
|
|
|
|
|
await expect(promise).is.rejectedWith('API error');
|
|
|
|
|
|
|
|
expect(lokiMessageAPIStub.sendMessage.callCount).to.equal(attempts);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should not throw error if successful send occurs within the retry limit', async () => {
|
|
|
|
|
|
|
|
lokiMessageAPIStub.sendMessage
|
|
|
|
|
|
|
|
.onFirstCall()
|
|
|
|
|
|
|
|
.throws(new Error('API error'));
|
|
|
|
|
|
|
|
await MessageSender.send(rawMessage, 3);
|
|
|
|
|
|
|
|
expect(lokiMessageAPIStub.sendMessage.callCount).to.equal(2);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
describe('logic', () => {
|
|
|
|
|
|
|
|
let messageEncyrptReturnEnvelopeType =
|
|
|
|
|
|
|
|
SignalService.Envelope.Type.CIPHERTEXT;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
|
|
|
encryptStub.callsFake(async (_device, plainTextBuffer, _type) => ({
|
|
|
|
envelopeType: messageEncyrptReturnEnvelopeType,
|
|
|
|
envelopeType: messageEncyrptReturnEnvelopeType,
|
|
|
|
cipherText: plainTextBuffer,
|
|
|
|
cipherText: plainTextBuffer,
|
|
|
|
}));
|
|
|
|
}));
|
|
|
@ -64,7 +127,8 @@ describe('MessageSender', () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('should correctly build the envelope', async () => {
|
|
|
|
it('should correctly build the envelope', async () => {
|
|
|
|
messageEncyrptReturnEnvelopeType = SignalService.Envelope.Type.CIPHERTEXT;
|
|
|
|
messageEncyrptReturnEnvelopeType =
|
|
|
|
|
|
|
|
SignalService.Envelope.Type.CIPHERTEXT;
|
|
|
|
|
|
|
|
|
|
|
|
// This test assumes the encryption stub returns the plainText passed into it.
|
|
|
|
// This test assumes the encryption stub returns the plainText passed into it.
|
|
|
|
const plainTextBuffer = crypto.randomBytes(10);
|
|
|
|
const plainTextBuffer = crypto.randomBytes(10);
|
|
|
@ -142,6 +206,7 @@ describe('MessageSender', () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe('sendToOpenGroup', () => {
|
|
|
|
describe('sendToOpenGroup', () => {
|
|
|
|
it('should send the message to the correct server and channel', async () => {
|
|
|
|
it('should send the message to the correct server and channel', async () => {
|
|
|
|