75 lines
2.7 KiB
TypeScript
75 lines
2.7 KiB
TypeScript
|
|
import { describe, test, expect } from 'bun:test';
|
||
|
|
import { StaleCleanupTask } from '../src/cleanup.js';
|
||
|
|
import { MemoryPrekeyStore } from '../src/memory-store.js';
|
||
|
|
|
||
|
|
function rand(n: number): Uint8Array {
|
||
|
|
const buf = new Uint8Array(n);
|
||
|
|
globalThis.crypto.getRandomValues(buf);
|
||
|
|
return buf;
|
||
|
|
}
|
||
|
|
|
||
|
|
describe('StaleCleanupTask', () => {
|
||
|
|
test('runs once immediately on start', async () => {
|
||
|
|
const store = new MemoryPrekeyStore();
|
||
|
|
// Save an untouched (so stale) identity
|
||
|
|
await store.saveIdentity('ancient', rand(32), rand(32));
|
||
|
|
|
||
|
|
const task = new StaleCleanupTask(store, { staleDays: 1, intervalHours: 24 });
|
||
|
|
task.start();
|
||
|
|
// Give the immediate run a microtask to complete
|
||
|
|
await new Promise((r) => setTimeout(r, 50));
|
||
|
|
|
||
|
|
expect(await store.getIdentity('ancient')).toBeNull();
|
||
|
|
task.stop();
|
||
|
|
});
|
||
|
|
|
||
|
|
test('runOnce returns count of purged addresses', async () => {
|
||
|
|
const store = new MemoryPrekeyStore();
|
||
|
|
await store.saveIdentity('ancient1', rand(32), rand(32));
|
||
|
|
await store.saveIdentity('ancient2', rand(32), rand(32));
|
||
|
|
|
||
|
|
const task = new StaleCleanupTask(store, { staleDays: 1 });
|
||
|
|
const count = await task.runOnce();
|
||
|
|
expect(count).toBe(2);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('leaves fresh identities alone', async () => {
|
||
|
|
const store = new MemoryPrekeyStore();
|
||
|
|
await store.saveIdentity('fresh', rand(32), rand(32));
|
||
|
|
await store.touchIdentity('fresh');
|
||
|
|
|
||
|
|
const task = new StaleCleanupTask(store, { staleDays: 30 });
|
||
|
|
const count = await task.runOnce();
|
||
|
|
expect(count).toBe(0);
|
||
|
|
expect(await store.getIdentity('fresh')).not.toBeNull();
|
||
|
|
});
|
||
|
|
|
||
|
|
test('stop clears the interval', () => {
|
||
|
|
const store = new MemoryPrekeyStore();
|
||
|
|
const task = new StaleCleanupTask(store, { staleDays: 1, intervalHours: 1 });
|
||
|
|
task.start();
|
||
|
|
expect(task.isRunning).toBe(true);
|
||
|
|
task.stop();
|
||
|
|
expect(task.isRunning).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('reads defaults from env vars', () => {
|
||
|
|
const store = new MemoryPrekeyStore();
|
||
|
|
const oldDays = process.env.SHADE_STALE_DAYS;
|
||
|
|
const oldHours = process.env.SHADE_CLEANUP_INTERVAL_HOURS;
|
||
|
|
process.env.SHADE_STALE_DAYS = '7';
|
||
|
|
process.env.SHADE_CLEANUP_INTERVAL_HOURS = '12';
|
||
|
|
try {
|
||
|
|
const task = new StaleCleanupTask(store);
|
||
|
|
// staleMs = 7 days, intervalMs = 12 hours
|
||
|
|
expect((task as any).staleMs).toBe(7 * 24 * 60 * 60 * 1000);
|
||
|
|
expect((task as any).intervalMs).toBe(12 * 60 * 60 * 1000);
|
||
|
|
} finally {
|
||
|
|
if (oldDays !== undefined) process.env.SHADE_STALE_DAYS = oldDays;
|
||
|
|
else delete process.env.SHADE_STALE_DAYS;
|
||
|
|
if (oldHours !== undefined) process.env.SHADE_CLEANUP_INTERVAL_HOURS = oldHours;
|
||
|
|
else delete process.env.SHADE_CLEANUP_INTERVAL_HOURS;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|