'use strict'; describe('AccountManager', function() { let accountManager; let originalServer; before(function() { originalServer = window.TextSecureServer; window.TextSecureServer = function() {}; }); after(function() { window.TextSecureServer = originalServer; }); beforeEach(function() { accountManager = new window.textsecure.AccountManager(); }); describe('#cleanSignedPreKeys', function() { let originalProtocolStorage; let signedPreKeys; const DAY = 1000 * 60 * 60 * 24; beforeEach(function() { originalProtocolStorage = window.textsecure.storage.protocol; window.textsecure.storage.protocol = { loadSignedPreKeys: function() { return Promise.resolve(signedPreKeys); }, }; }); afterEach(function() { window.textsecure.storage.protocol = originalProtocolStorage; }); it('keeps three confirmed keys even if over a week old', function() { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 21, confirmed: true, }, { keyId: 2, created_at: now - DAY * 14, confirmed: true, }, { keyId: 3, created_at: now - DAY * 18, confirmed: true, }, ]; // should be no calls to store.removeSignedPreKey, would cause crash return accountManager.cleanSignedPreKeys(); }); it('eliminates confirmed keys over a week old, if more than three', function() { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 21, confirmed: true, }, { keyId: 2, created_at: now - DAY * 14, confirmed: true, }, { keyId: 3, created_at: now - DAY * 4, confirmed: true, }, { keyId: 4, created_at: now - DAY * 18, confirmed: true, }, { keyId: 5, created_at: now - DAY, confirmed: true, }, ]; let count = 0; window.textsecure.storage.protocol.removeSignedPreKey = function(keyId) { if (keyId !== 1 && keyId !== 4) { throw new Error('Wrong keys were eliminated! ' + keyId); } count++; }; return accountManager.cleanSignedPreKeys().then(function() { assert.strictEqual(count, 2); }); }); it('keeps at least three unconfirmed keys if no confirmed', function() { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 14, }, { keyId: 2, created_at: now - DAY * 21, }, { keyId: 3, created_at: now - DAY * 18, }, { keyId: 4, created_at: now - DAY, }, ]; let count = 0; window.textsecure.storage.protocol.removeSignedPreKey = function(keyId) { if (keyId !== 2) { throw new Error('Wrong keys were eliminated! ' + keyId); } count++; }; return accountManager.cleanSignedPreKeys().then(function() { assert.strictEqual(count, 1); }); }); it('if some confirmed keys, keeps unconfirmed to addd up to three total', function() { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 21, confirmed: true, }, { keyId: 2, created_at: now - DAY * 14, confirmed: true, }, { keyId: 3, created_at: now - DAY * 12, }, { keyId: 4, created_at: now - DAY * 8, }, ]; let count = 0; window.textsecure.storage.protocol.removeSignedPreKey = function(keyId) { if (keyId !== 3) { throw new Error('Wrong keys were eliminated! ' + keyId); } count++; }; return accountManager.cleanSignedPreKeys().then(function() { assert.strictEqual(count, 1); }); }); }); });