Hash every validated server copy and register it as verified content
This commit is contained in:
52
server/p2p-admit.test.js
Normal file
52
server/p2p-admit.test.js
Normal file
@@ -0,0 +1,52 @@
|
||||
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');
|
||||
});
|
||||
Reference in New Issue
Block a user