mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-24 07:53:09 +00:00
8b93898b73
The Studio draws the page on request and uploads it once, each provider gets the image where it expects it, and a refusal falls back to the text description. No image is stored.
58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import { readImageHeader } from '../../../../src/nest/common/image-header';
|
|
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
/** SOI, then the given segments, then a baseline frame header of w x h. */
|
|
function jpeg(w: number, h: number, ...before: number[][]): Buffer {
|
|
const sof = Buffer.alloc(19);
|
|
sof.writeUInt16BE(0xffc0, 0);
|
|
sof.writeUInt16BE(17, 2);
|
|
sof.writeUInt8(8, 4);
|
|
sof.writeUInt16BE(h, 5);
|
|
sof.writeUInt16BE(w, 7);
|
|
return Buffer.concat([Buffer.from([0xff, 0xd8]), ...before.map((bytes) => Buffer.from(bytes)), sof]);
|
|
}
|
|
|
|
function webp(chunk: string, length: number): Buffer {
|
|
const out = Buffer.alloc(length);
|
|
out.write('RIFF', 0, 'latin1');
|
|
out.write('WEBP', 8, 'latin1');
|
|
out.write(chunk, 12, 'latin1');
|
|
return out;
|
|
}
|
|
|
|
describe('readImageHeader', () => {
|
|
it('IMGHDR-001: steps over stray bytes, fill bytes and the markers that carry no length', () => {
|
|
const segments = [
|
|
[0x00, 0x12],
|
|
[0xff, 0xff],
|
|
[0xff, 0x01],
|
|
[0xff, 0xd0],
|
|
[0xff, 0xe1, 0x00, 0x04, 0, 0],
|
|
];
|
|
expect(readImageHeader(jpeg(800, 600, ...segments))).toEqual({ mimeType: 'image/jpeg', width: 800, height: 600 });
|
|
});
|
|
|
|
it('IMGHDR-002: a JPEG whose segment length is broken, or whose frame header is cut, says no size', () => {
|
|
expect(readImageHeader(Buffer.from([0xff, 0xd8, 0xff, 0xe0, 0x00, 0x01, 0, 0]))).toBeNull();
|
|
expect(readImageHeader(Buffer.from([0xff, 0xd8, 0xff, 0xc0, 0x00, 0x11, 8, 0]))).toBeNull();
|
|
expect(readImageHeader(Buffer.from([0xff, 0xd8, 0xff, 0xda, 0x00, 0x08]))).toBeNull();
|
|
expect(readImageHeader(jpeg(0, 600))).toBeNull();
|
|
});
|
|
|
|
it('IMGHDR-003: a WebP too short for its chunk, or with a chunk it does not know, says no size', () => {
|
|
expect(readImageHeader(webp('VP8 ', 20))).toBeNull();
|
|
expect(readImageHeader(webp('VP8L', 22))).toBeNull();
|
|
expect(readImageHeader(webp('VP8X', 26))).toBeNull();
|
|
expect(readImageHeader(webp('ALPH', 30))).toBeNull();
|
|
});
|
|
|
|
it('IMGHDR-004: a PNG signature without its IHDR chunk is no PNG', () => {
|
|
const data = Buffer.alloc(24);
|
|
data.writeUInt32BE(0x89504e47, 0);
|
|
data.write('IDAT', 12, 'latin1');
|
|
expect(readImageHeader(data)).toBeNull();
|
|
expect(readImageHeader(Buffer.from([0xff, 0xd8]))).toBeNull();
|
|
});
|
|
});
|