mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-08 19:06:15 -08:00
61 lines
2.4 KiB
JavaScript
61 lines
2.4 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { Buffer } from 'node:buffer'
|
|
// eslint-disable-next-line test/no-import-node-test -- Exercise binary diagnostic metadata without requiring a real browser crash.
|
|
import { test } from 'node:test'
|
|
import { inspectFirefoxMinidump } from './firefox-minidump.mjs'
|
|
|
|
function fixture() {
|
|
const bytes = Buffer.alloc(512)
|
|
bytes.write('MDMP')
|
|
bytes.writeUInt32LE(3, 8)
|
|
bytes.writeUInt32LE(32, 12)
|
|
for (const [i, type, size, rva] of [[0, 6, 168, 80], [1, 4, 112, 248], [2, 24, 16, 360]]) {
|
|
bytes.writeUInt32LE(type, 32 + i * 12)
|
|
bytes.writeUInt32LE(size, 36 + i * 12)
|
|
bytes.writeUInt32LE(rva, 40 + i * 12)
|
|
}
|
|
bytes.writeUInt32LE(123, 80)
|
|
bytes.writeUInt32LE(0xC0000005, 88)
|
|
bytes.writeBigUInt64LE(0x10000000008n, 104)
|
|
bytes.writeUInt32LE(2, 112)
|
|
bytes.writeBigUInt64LE(8n, 128)
|
|
bytes.writeUInt32LE(1, 248)
|
|
bytes.writeBigUInt64LE(0x10000000000n, 252)
|
|
bytes.writeUInt32LE(1024, 260)
|
|
bytes.writeUInt32LE(380, 272)
|
|
bytes.writeUInt32LE(14, 380)
|
|
bytes.write('xul.dll', 384, 'utf16le')
|
|
bytes.writeUInt32LE(1, 360)
|
|
bytes.writeUInt32LE(123, 364)
|
|
bytes.writeBigUInt64LE(410n, 368)
|
|
bytes.writeUInt32LE(20, 410)
|
|
bytes.write('DOM Worker', 414, 'utf16le')
|
|
return bytes
|
|
}
|
|
|
|
test('exception metadata identifies the module and thread without inventing a stack', () => {
|
|
const result = inspectFirefoxMinidump(fixture())
|
|
assert.equal(result.exception.code, '0xc0000005')
|
|
assert.deepEqual(result.exception.parameters, ['0x0', '0x8'])
|
|
assert.equal(result.faultModule.name, 'xul.dll')
|
|
assert.equal(result.moduleOffset, '0x8')
|
|
assert.equal(result.threadName, 'DOM Worker')
|
|
assert.equal(result.stackResolved, false)
|
|
})
|
|
|
|
test('invalid binary regions, counts and encoding are rejected', () => {
|
|
assert.throws(() => inspectFirefoxMinidump(Buffer.alloc(4)), /signature/)
|
|
assert.throws(() => inspectFirefoxMinidump(fixture().subarray(0, 100)), /Truncated/)
|
|
for (const [offset, value, message] of [[8, 5000, /stream count/], [112, 16, /parameter count/], [248, 1000, /module list/], [360, 1000, /thread name list/], [380, 15, /UTF-16/]]) {
|
|
const bytes = fixture()
|
|
bytes.writeUInt32LE(value, offset)
|
|
assert.throws(() => inspectFirefoxMinidump(bytes), message)
|
|
}
|
|
})
|
|
|
|
test('addresses outside all module ranges remain unattributed', () => {
|
|
const bytes = fixture()
|
|
bytes.writeBigUInt64LE(8n, 104)
|
|
assert.equal(inspectFirefoxMinidump(bytes).faultModule, undefined)
|
|
})
|