46 lines
2.4 KiB
TypeScript
46 lines
2.4 KiB
TypeScript
import { test } from '@japa/runner'
|
|
import yencode from 'yencode'
|
|
import { sniffContentType } from '#lib/content/index'
|
|
import { crc32Hex, decodeSegment, YencError } from '#lib/yenc/index'
|
|
|
|
test.group('content / sniffContentType', () => {
|
|
test('recognises containers and media by magic bytes', ({ assert }) => {
|
|
const magic = (hex: string, pad = 16) => Buffer.concat([Buffer.from(hex, 'hex'), Buffer.alloc(pad)])
|
|
assert.equal(sniffContentType(Buffer.concat([Buffer.from('nzbe'), Buffer.alloc(40)])), 'nzbe')
|
|
assert.equal(sniffContentType(magic('5041523200504b54')), 'par2')
|
|
assert.equal(sniffContentType(magic('526172211a070100')), 'rar5')
|
|
assert.equal(sniffContentType(magic('526172211a0700')), 'rar4')
|
|
assert.equal(sniffContentType(magic('1a45dfa3')), 'matroska')
|
|
assert.equal(sniffContentType(magic('0000001866747970')), 'mp4')
|
|
assert.equal(sniffContentType(magic('28b52ffd')), 'zstd')
|
|
assert.equal(sniffContentType(Buffer.from('<?xml version="1.0"?>\n<!DOCTYPE nzb PUBLIC "x">')), 'nzb')
|
|
assert.isNull(sniffContentType(Buffer.from('plain text')))
|
|
assert.equal(sniffContentType(magic('ffd8ffe0')), 'jpeg')
|
|
assert.equal(sniffContentType(magic('89504e470d0a1a0a')), 'png')
|
|
assert.equal(sniffContentType(Buffer.concat([Buffer.from('ID3'), Buffer.alloc(16)])), 'mp3')
|
|
assert.equal(sniffContentType(Buffer.concat([Buffer.from('fLaC'), Buffer.alloc(16)])), 'flac')
|
|
assert.equal(sniffContentType(Buffer.from('RIFF\x00\x00\x00\x00AVI LIST', 'latin1')), 'avi')
|
|
|
|
// UDF (Blu-ray) volume recognition sequence at 32 KiB
|
|
const udf = Buffer.alloc(0x9000)
|
|
udf.write('BEA01', 0x8001, 'latin1')
|
|
udf.write('NSR03', 0x8801, 'latin1')
|
|
assert.equal(sniffContentType(udf), 'udf')
|
|
})
|
|
})
|
|
|
|
test.group('yenc / lenientSize', () => {
|
|
test('decodes a part whose declared size leaves out a header, still checking the CRC', ({ assert }) => {
|
|
const data = Buffer.concat([Buffer.from('nzbe'), Buffer.alloc(16, 7), Buffer.from('ciphertext-here')])
|
|
const declared = data.length - 20
|
|
const body = Buffer.from(
|
|
`=ybegin part=1 line=128 size=${declared} name=f6dd6b156692a52b.bin\r\n=ypart begin=1 end=${declared}\r\n` +
|
|
yencode.encode(data).toString('latin1') +
|
|
`\r\n=yend size=${declared} part=1 pcrc32=${crc32Hex(data)}`,
|
|
'latin1'
|
|
)
|
|
assert.throws(() => decodeSegment(body), YencError as any)
|
|
assert.isTrue(decodeSegment(body, { lenientSize: true }).data.equals(data))
|
|
})
|
|
})
|