diff --git a/macho/universal.test.ts b/macho/universal.test.ts index 8b37b60..127b6db 100644 --- a/macho/universal.test.ts +++ b/macho/universal.test.ts @@ -5,7 +5,10 @@ import { assertLessOrEqual, assertThrows, } from '@std/assert'; -import { MH_DYLIB, MH_EXECUTE } from '../const.ts'; +import { FAT_MAGIC, MH_DYLIB, MH_EXECUTE } from '../const.ts'; +import { FatArch } from '../mach/fatarch.ts'; +import { FatHeader } from '../mach/fatheader.ts'; +import { MachHeader } from '../mach/machheader.ts'; import { fixtureMacho, fixtureMachos } from '../spec/fixture.ts'; import { Architecture } from './architecture.ts'; import { Universal } from './universal.ts'; @@ -74,3 +77,33 @@ for (const { kind, arch, file, archs } of fixtures) { } }); } + +Deno.test('typeOf under header', async () => { + const blob = new Blob([new ArrayBuffer(MachHeader.BYTE_LENGTH - 1)]); + assertEquals(await Universal.typeOf(blob), 0); +}); + +Deno.test('typeOf unknown magic', async () => { + const blob = new Blob([new ArrayBuffer(MachHeader.BYTE_LENGTH)]); + assertEquals(await Universal.typeOf(blob), 0); +}); + +Deno.test('typeOf fat arch under', async () => { + const data = new ArrayBuffer(FatHeader.BYTE_LENGTH + FatArch.BYTE_LENGTH); + const header = new FatHeader(data); + header.magic = FAT_MAGIC; + header.nfatArch = 1; + const arch = new FatArch(data, FatHeader.BYTE_LENGTH); + arch.offset = data.byteLength; + const blob = new Blob([data]); + assertEquals(await Universal.typeOf(blob), 0); +}); + +Deno.test('typeOf fat infinite loop', async () => { + const data = new ArrayBuffer(FatHeader.BYTE_LENGTH + FatArch.BYTE_LENGTH); + const header = new FatHeader(data); + header.magic = FAT_MAGIC; + header.nfatArch = 1; + const blob = new Blob([data]); + assertEquals(await Universal.typeOf(blob), 0); +});