diff --git a/ts/session/utils/SyncMessage.ts b/ts/session/utils/SyncMessage.ts index 5d2d8ad59..4b2c1d852 100644 --- a/ts/session/utils/SyncMessage.ts +++ b/ts/session/utils/SyncMessage.ts @@ -4,6 +4,7 @@ import { getAllConversations } from '../../../js/modules/data'; import { ContentMessage, SyncMessage } from '../messages/outgoing'; import { MultiDeviceProtocol } from '../protocols'; import ByteBuffer from 'bytebuffer'; +import { TestUtils } from '../../test/test-utils'; export function toSyncMessage( message: ContentMessage diff --git a/ts/test/session/utils/String_test.ts b/ts/test/session/utils/String_test.ts index c21fe6556..f9b3be86d 100644 --- a/ts/test/session/utils/String_test.ts +++ b/ts/test/session/utils/String_test.ts @@ -82,7 +82,8 @@ describe('String Utils', () => { }); it('can encode huge string', async () => { - const testString = Array(Math.pow(2, 16)) + const stringSize = Math.pow(2, 16); + const testString = Array(stringSize) .fill('0') .join(''); @@ -127,8 +128,100 @@ describe('String Utils', () => { }); describe('decode', () => { - it('', async () => { - // + it('can decode empty buffer', async () => { + const buffer = new ByteBuffer(0); + + const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array; + + // Each encoding should be valid + encodings.forEach(encoding => { + const decoded = StringUtils.decode(buffer, encoding); + + expect(decoded).to.exist; + expect(typeof decoded === String.name.toLowerCase()); + expect(decoded).to.have.length(0); + }); + }); + + it('can decode huge buffer', async () => { + const bytes = Math.pow(2, 16); + const bufferString = Array(bytes) + .fill('A') + .join(''); + const buffer = ByteBuffer.fromUTF8(bufferString); + + const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array; + + // Each encoding should be valid + encodings.forEach(encoding => { + const decoded = StringUtils.decode(buffer, encoding); + + expect(decoded).to.exist; + expect(typeof decoded === String.name.toLowerCase()); + expect(decoded).to.have.length.greaterThan(0); + }); + }); + + it('can decode from ByteBuffer', async () => { + const buffer = ByteBuffer.fromUTF8('AAAAAAAAAA'); + + const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array; + + // Each encoding should be valid + encodings.forEach(encoding => { + const decoded = StringUtils.decode(buffer, encoding); + + expect(decoded).to.exist; + expect(typeof decoded === String.name.toLowerCase()); + expect(decoded).to.have.length.greaterThan(0); + }); + }); + + it('can decode from Buffer', async () => { + const arrayBuffer = new ArrayBuffer(10); + const buffer = Buffer.from(arrayBuffer); + buffer.writeUInt8(0, 0); + + const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array; + + // Each encoding should be valid + encodings.forEach(encoding => { + const decoded = StringUtils.decode(buffer, encoding); + + expect(decoded).to.exist; + expect(typeof decoded === String.name.toLowerCase()); + expect(decoded).to.have.length.greaterThan(0); + }); + }); + + it('can decode from ArrayBuffer', async () => { + const buffer = new ArrayBuffer(10); + + const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array; + + // Each encoding should be valid + encodings.forEach(encoding => { + const decoded = StringUtils.decode(buffer, encoding); + + expect(decoded).to.exist; + expect(typeof decoded === String.name.toLowerCase()); + expect(decoded).to.have.length.greaterThan(0); + }); + }); + + it('can decode from Uint8Array', async () => { + const buffer = new Uint8Array(10); + + const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array; + + // Each encoding should be valid + encodings.forEach(encoding => { + const decoded = StringUtils.decode(buffer, encoding); + + expect(decoded).to.exist; + expect(typeof decoded === String.name.toLowerCase()); + expect(decoded).to.have.length.greaterThan(0); + }); }); }); }); diff --git a/ts/test/session/utils/SyncMessage_test.ts b/ts/test/session/utils/SyncMessage_test.ts index c2403565f..a687c1de6 100644 --- a/ts/test/session/utils/SyncMessage_test.ts +++ b/ts/test/session/utils/SyncMessage_test.ts @@ -51,10 +51,10 @@ describe('Sync Message Utils', () => { const numConversations = 20; const primaryConversations = new Array(numConversations / 2) .fill({}) - .map(() => new TestUtils.MockConversation({ type: 'primary' })); + .map(() => new TestUtils.MockConversation({ type: TestUtils.MockConversationType.Primary })); const secondaryConversations = new Array(numConversations / 2) .fill({}) - .map(() => new TestUtils.MockConversation({ type: 'secondary' })); + .map(() => new TestUtils.MockConversation({ type: TestUtils.MockConversationType.Secondary })); const conversations = [...primaryConversations, ...secondaryConversations]; const sandbox = sinon.createSandbox(); diff --git a/ts/test/test-utils/.syncthing.testUtils.js.map.tmp b/ts/test/test-utils/.syncthing.testUtils.js.map.tmp deleted file mode 100644 index 4b666e271..000000000 --- a/ts/test/test-utils/.syncthing.testUtils.js.map.tmp +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["testUtils.ts"],"names":[],"mappings":";;;;;;;;;AAAA,6CAA+B;AAC/B,+CAAiC;AAGjC,+BAAkC;AAElC,qDAA8D;AAC9D,8DAIyC;AAIzC,wBAA8B;AAE9B,MAAM,SAAS,GAAQ,MAAM,CAAC;AAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;AAEtC,qEAAqE;AACrE,oDAAoD;AACpD,+DAA+D;AAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAGjD;;;;;GAKG;AACH,SAAgB,QAAQ,CAA+B,EAAK;IAC1D,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAFD,4BAEC;AAID;;;;;GAKG;AACH,SAAgB,UAAU,CACxB,EAAK,EACL,KAAqB;IAErB,gDAAgD;IAChD,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE;QAC3C,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC;KACvB;IAED,MAAM,GAAG,GAAG,CAAC,QAAwB,EAAE,EAAE;QACvC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAmB,CAAC;IAChD,CAAC,CAAC;IAEF,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;IAE7B,OAAO;QACL,GAAG;QACH,GAAG;KACJ,CAAC;AACJ,CAAC;AAvBD,gCAuBC;AAED,SAAgB,YAAY;IAC1B,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,OAAO,EAAE,CAAC;AACpB,CAAC;AAHD,oCAGC;AAED,SAAgB,kBAAkB;IAChC,sCAAsC;IACtC,MAAM,QAAQ,GAAG,cAAM,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,KAAK,SAAS,EAAE,CAAC;IAEtC,OAAO,IAAI,cAAM,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAPD,gDAOC;AAED,SAAgB,mBAAmB,CAAC,MAAc;IAChD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,4DAA4D;IAC5D,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACvE,CAAC;AALD,kDAKC;AAED,SAAgB,mBAAmB,CAAC,UAAmB;IACrD,OAAO,IAAI,sBAAW,CAAC;QACrB,IAAI,EAAE,yDAAyD;QAC/D,UAAU,GAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,SAAI,EAAE,CAAA;QAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,WAAW,EAAE,SAAS;QACtB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC;AAXD,kDAWC;AAED,SAAgB,wBAAwB;IACtC,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC;QAC1B,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,CAAC;QACV,cAAc,EAAE,GAAG;KACpB,CAAC,CAAC;IAEH,OAAO,IAAI,2BAAgB,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK;QACL,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,yDAAyD;QAC/D,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC;AAfD,4DAeC;AAED,SAAgB,0BAA0B,CACxC,OAAgB;IAEhB,OAAO,IAAI,iCAAsB,CAAC;QAChC,UAAU,EAAE,SAAI,EAAE;QAClB,OAAO,GAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,kBAAkB,EAAE,CAAC,GAAG,CAAA;QAC5C,WAAW,EAAE,mBAAmB,EAAE;KACnC,CAAC,CAAC;AACL,CAAC;AARD,gEAQC;AAOD,MAAa,uBAAuB;IAKlC,YAAY,MAAqC;;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC;QAE3B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,EAAE,SAAG,MAAM,CAAC,EAAE,uCAAI,YAAS,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAA,CAAC;QAE1D,IAAI,CAAC,UAAU,GAAG;YAChB,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,YAAY;YACzB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,eAAe,EAAE,CAAC,IAAI,CAAC,SAAS;SACjC,CAAC;IACJ,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,gBAAgB;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,SAAS;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,sBAAsB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,YAAS,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC;IACvE,CAAC;CACF;AAxCD,0DAwCC"} \ No newline at end of file diff --git a/ts/test/test-utils/utils/message.ts b/ts/test/test-utils/utils/message.ts index e2e71504a..1bd76bd32 100644 --- a/ts/test/test-utils/utils/message.ts +++ b/ts/test/test-utils/utils/message.ts @@ -5,7 +5,8 @@ import { } from '../../../session/messages/outgoing'; import { v4 as uuid } from 'uuid'; import { OpenGroup } from '../../../session/types'; -import { generateFakePubKey } from './pubkey'; +import { generateFakePubKey, generateFakePubKeys } from './pubkey'; +import { ConversationAttributes } from '../../../../js/models/conversation'; export function generateChatMessage(identifier?: string): ChatMessage { return new ChatMessage({ @@ -46,3 +47,67 @@ export function generateClosedGroupMessage( chatMessage: generateChatMessage(), }); } + +interface MockConversationParams { + id?: string; + type: MockConversationType; + members?: Array; +} + +export enum MockConversationType { + Primary = 'primary', + Secondary = 'secondary', + Group = 'group', +} + +export class MockConversation { + public id: string; + public type: MockConversationType; + public attributes: ConversationAttributes; + public isPrimary?: boolean; + + constructor(params: MockConversationParams) { + const dayInSeconds = 86400; + + this.type = params.type; + this.id = params.id ?? generateFakePubKey().key; + this.isPrimary = this.type === MockConversationType.Primary; + + const members = this.type === MockConversationType.Group + ? params.members ?? generateFakePubKeys(10).map(m => m.key) + : []; + + this.attributes = { + members, + left: false, + expireTimer: dayInSeconds, + profileSharing: true, + mentionedUs: false, + unreadCount: 99, + isArchived: false, + active_at: Date.now(), + timestamp: Date.now(), + secondaryStatus: !this.isPrimary, + }; + } + + public isPrivate() { + return true; + } + + public isOurLocalDevice() { + return false; + } + + public isBlocked() { + return false; + } + + public getPrimaryDevicePubKey() { + if (this.type === MockConversationType.Group) { + return undefined; + } + + return this.isPrimary ? this.id : generateFakePubKey().key; + } +}