160 lines
		
	
	
	
		
			3.5 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
	
		
			3.5 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2025 Signal Messenger, LLC
							 | 
						||
| 
								 | 
							
								// SPDX-License-Identifier: AGPL-3.0-only
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { assert } from 'chai';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { type WritableDB } from '../../sql/Interface';
							 | 
						||
| 
								 | 
							
								import { SignalService as Proto } from '../../protobuf';
							 | 
						||
| 
								 | 
							
								import { generateAci } from '../../types/ServiceId';
							 | 
						||
| 
								 | 
							
								import { createDB, updateToVersion, insertData, getTableData } from './helpers';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('SQL/updateToSchemaVersion1280', () => {
							 | 
						||
| 
								 | 
							
								  let db: WritableDB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const OUR_ACI = generateAci();
							 | 
						||
| 
								 | 
							
								  const THEIR_ACI = generateAci();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  afterEach(() => {
							 | 
						||
| 
								 | 
							
								    db.close();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  beforeEach(() => {
							 | 
						||
| 
								 | 
							
								    db = createDB();
							 | 
						||
| 
								 | 
							
								    updateToVersion(db, 1270);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    insertData(db, 'items', [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'uuid_id',
							 | 
						||
| 
								 | 
							
								        json: {
							 | 
						||
| 
								 | 
							
								          id: 'uuid_id',
							 | 
						||
| 
								 | 
							
								          value: `${OUR_ACI}.2`,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								    ]);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('drops v1 envelopes', () => {
							 | 
						||
| 
								 | 
							
								    insertData(db, 'unprocessed', [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'old',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								    ]);
							 | 
						||
| 
								 | 
							
								    updateToVersion(db, 1280);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    assert.deepStrictEqual(getTableData(db, 'unprocessed'), []);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('does not drop v2 envelopes', () => {
							 | 
						||
| 
								 | 
							
								    insertData(db, 'unprocessed', [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'new',
							 | 
						||
| 
								 | 
							
								        version: 2,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        receivedAtCounter: 1,
							 | 
						||
| 
								 | 
							
								        story: 1,
							 | 
						||
| 
								 | 
							
								        urgent: 1,
							 | 
						||
| 
								 | 
							
								        timestamp: 4,
							 | 
						||
| 
								 | 
							
								        attempts: 5,
							 | 
						||
| 
								 | 
							
								        envelope: Buffer.from(
							 | 
						||
| 
								 | 
							
								          Proto.Envelope.encode({
							 | 
						||
| 
								 | 
							
								            destinationServiceId: THEIR_ACI,
							 | 
						||
| 
								 | 
							
								            content: Buffer.from('encrypted1'),
							 | 
						||
| 
								 | 
							
								            reportingToken: Buffer.from('token'),
							 | 
						||
| 
								 | 
							
								          }).finish()
							 | 
						||
| 
								 | 
							
								        ).toString('base64'),
							 | 
						||
| 
								 | 
							
								        serverTimestamp: 6,
							 | 
						||
| 
								 | 
							
								        serverGuid: 'guid1',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'new-2',
							 | 
						||
| 
								 | 
							
								        version: 2,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        receivedAtCounter: 2,
							 | 
						||
| 
								 | 
							
								        story: 1,
							 | 
						||
| 
								 | 
							
								        urgent: 1,
							 | 
						||
| 
								 | 
							
								        timestamp: 4,
							 | 
						||
| 
								 | 
							
								        attempts: 5,
							 | 
						||
| 
								 | 
							
								        envelope: Buffer.from(
							 | 
						||
| 
								 | 
							
								          Proto.Envelope.encode({
							 | 
						||
| 
								 | 
							
								            type: 3,
							 | 
						||
| 
								 | 
							
								            content: Buffer.from('encrypted2'),
							 | 
						||
| 
								 | 
							
								          }).finish()
							 | 
						||
| 
								 | 
							
								        ).toString('base64'),
							 | 
						||
| 
								 | 
							
								        serverTimestamp: 7,
							 | 
						||
| 
								 | 
							
								        serverGuid: 'guid2',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'new-3',
							 | 
						||
| 
								 | 
							
								        version: 2,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        receivedAtCounter: 3,
							 | 
						||
| 
								 | 
							
								        story: 0,
							 | 
						||
| 
								 | 
							
								        urgent: 0,
							 | 
						||
| 
								 | 
							
								        timestamp: 5,
							 | 
						||
| 
								 | 
							
								        attempts: 6,
							 | 
						||
| 
								 | 
							
								        envelope: Buffer.from(
							 | 
						||
| 
								 | 
							
								          Proto.Envelope.encode({
							 | 
						||
| 
								 | 
							
								            content: Buffer.from('unused'),
							 | 
						||
| 
								 | 
							
								          }).finish()
							 | 
						||
| 
								 | 
							
								        ).toString('base64'),
							 | 
						||
| 
								 | 
							
								        decrypted: 'CAFE',
							 | 
						||
| 
								 | 
							
								        serverTimestamp: 8,
							 | 
						||
| 
								 | 
							
								        serverGuid: 'guid3',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								    ]);
							 | 
						||
| 
								 | 
							
								    updateToVersion(db, 1280);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    assert.deepStrictEqual(getTableData(db, 'unprocessed'), [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'new',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        type: 0,
							 | 
						||
| 
								 | 
							
								        receivedAtCounter: 1,
							 | 
						||
| 
								 | 
							
								        story: 1,
							 | 
						||
| 
								 | 
							
								        urgent: 1,
							 | 
						||
| 
								 | 
							
								        messageAgeSec: 0,
							 | 
						||
| 
								 | 
							
								        timestamp: 4,
							 | 
						||
| 
								 | 
							
								        attempts: 5,
							 | 
						||
| 
								 | 
							
								        destinationServiceId: THEIR_ACI,
							 | 
						||
| 
								 | 
							
								        content: '656e6372797074656431',
							 | 
						||
| 
								 | 
							
								        isEncrypted: 1,
							 | 
						||
| 
								 | 
							
								        serverTimestamp: 6,
							 | 
						||
| 
								 | 
							
								        serverGuid: 'guid1',
							 | 
						||
| 
								 | 
							
								        reportingToken: '746f6b656e',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'new-2',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        receivedAtCounter: 2,
							 | 
						||
| 
								 | 
							
								        story: 1,
							 | 
						||
| 
								 | 
							
								        urgent: 1,
							 | 
						||
| 
								 | 
							
								        timestamp: 4,
							 | 
						||
| 
								 | 
							
								        messageAgeSec: 0,
							 | 
						||
| 
								 | 
							
								        attempts: 5,
							 | 
						||
| 
								 | 
							
								        destinationServiceId: OUR_ACI,
							 | 
						||
| 
								 | 
							
								        content: '656e6372797074656432',
							 | 
						||
| 
								 | 
							
								        isEncrypted: 1,
							 | 
						||
| 
								 | 
							
								        type: 3,
							 | 
						||
| 
								 | 
							
								        serverTimestamp: 7,
							 | 
						||
| 
								 | 
							
								        serverGuid: 'guid2',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        id: 'new-3',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        receivedAtCounter: 3,
							 | 
						||
| 
								 | 
							
								        urgent: 0,
							 | 
						||
| 
								 | 
							
								        story: 0,
							 | 
						||
| 
								 | 
							
								        timestamp: 5,
							 | 
						||
| 
								 | 
							
								        messageAgeSec: 0,
							 | 
						||
| 
								 | 
							
								        attempts: 6,
							 | 
						||
| 
								 | 
							
								        destinationServiceId: OUR_ACI,
							 | 
						||
| 
								 | 
							
								        content: '080144',
							 | 
						||
| 
								 | 
							
								        isEncrypted: 0,
							 | 
						||
| 
								 | 
							
								        type: 0,
							 | 
						||
| 
								 | 
							
								        serverTimestamp: 8,
							 | 
						||
| 
								 | 
							
								        serverGuid: 'guid3',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								    ]);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |