import { test, expect } from 'bun:test'; import { mkdtempSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { createHash } from 'node:crypto'; import { admitFile, scanFile } from './p2p-admit.js'; import { sha256File, sha256Range } from './hash.js'; const dir = mkdtempSync(join(tmpdir(), 'ytp-admit-')); const file = join(dir, 'f.bin'); const bytes = Buffer.from(Array.from({ length: 300000 }, (_, i) => i % 251)); writeFileSync(file, bytes); const CID = createHash('sha256').update(bytes).digest('hex'); const quiet = { warn() {}, info() {} }; const cfg = (o = {}) => ({ enabled: true, malwareScan: false, scanCmd: 'true', ...o }); const info = { path: file, cid: CID, videoId: 'dQw4w9WgXcQ', size: bytes.length, origin: 'server' }; test('sha256File / sha256Range match node:crypto', async () => { expect(await sha256File(file)).toBe(CID); const want = createHash('sha256').update(bytes.subarray(1000, 1000 + 65536)).digest('hex'); expect(await sha256Range(file, 1000, 65536)).toBe(want); }); test('scan off by default: admitted with scan=skipped', async () => { const rows = []; const r = await admitFile(info, { cfg: cfg(), upsertContent: async (c) => rows.push(c), log: quiet }); expect(r).toEqual({ ok: true, scan: 'skipped' }); expect(rows[0]).toMatchObject({ cid: CID, videoId: 'dQw4w9WgXcQ', origin: 'server', scan: 'skipped' }); }); test('scan on: clean admits, infected and scanner errors do not', async () => { for (const [result, ok] of [['clean', true], ['infected', false], ['error', false]]) { const rows = []; const r = await admitFile(info, { cfg: cfg({ malwareScan: true }), upsertContent: async (c) => rows.push(c), scan: async () => ({ result }), log: quiet }); expect(r.ok).toBe(ok); expect(rows.length).toBe(ok ? 1 : 0); } }); test('disabled P2P or a malformed cid never admits', async () => { const rows = []; expect((await admitFile(info, { cfg: cfg({ enabled: false }), upsertContent: async (c) => rows.push(c) })).ok).toBe(false); expect((await admitFile({ ...info, cid: 'XYZ' }, { cfg: cfg(), upsertContent: async (c) => rows.push(c) })).ok).toBe(false); expect(rows.length).toBe(0); }); test('scanFile maps exit codes', async () => { expect((await scanFile(file, 'true')).result).toBe('clean'); expect((await scanFile(file, 'false')).result).toBe('infected'); // exit 1 expect((await scanFile(file, 'sh -c "exit 2" --')).result).toBe('error'); expect((await scanFile(file, '/nonexistent/scanner')).result).toBe('error'); });