171 lines
5.5 KiB
JavaScript
171 lines
5.5 KiB
JavaScript
import { dirname, join } from 'node:path'
|
|
import { mkdtempSync, readFileSync, rmSync, writeSync } from 'node:fs'
|
|
import { tmpdir } from 'node:os'
|
|
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
import {
|
|
parseReportGateArgs,
|
|
runTerminalScalePerfReportGate
|
|
} from './run-terminal-scale-perf-report-gate.mjs'
|
|
|
|
const tempDirs = []
|
|
|
|
function tempReportPath() {
|
|
const dir = mkdtempSync(join(tmpdir(), 'orca-terminal-perf-gate-'))
|
|
tempDirs.push(dir)
|
|
return join(dir, 'report.json')
|
|
}
|
|
|
|
function makeSpawnSync({ onScaleRun, scaleStatus = 0 } = {}) {
|
|
const calls = []
|
|
const spawnSyncImpl = vi.fn((command, args, options) => {
|
|
calls.push({ args, command, options })
|
|
if (args[0] === 'config/scripts/run-terminal-scale-perf-e2e.mjs') {
|
|
onScaleRun?.()
|
|
writeSync(options.stdio[1], '{"suites":[]}')
|
|
return { signal: null, status: scaleStatus }
|
|
}
|
|
return { signal: null, status: 0 }
|
|
})
|
|
return { calls, spawnSyncImpl }
|
|
}
|
|
|
|
afterEach(() => {
|
|
while (tempDirs.length > 0) {
|
|
rmSync(tempDirs.pop(), { force: true, recursive: true })
|
|
}
|
|
})
|
|
|
|
describe('run-terminal-scale-perf-report-gate', () => {
|
|
it('parses report path flags while forwarding remaining Playwright args', () => {
|
|
expect(
|
|
parseReportGateArgs(['--', '--report', 'tmp/report.json', '--grep', 'ACK-backpressured'])
|
|
).toEqual({
|
|
passthroughArgs: ['--grep', 'ACK-backpressured'],
|
|
reportPath: 'tmp/report.json'
|
|
})
|
|
|
|
expect(parseReportGateArgs(['--output=out.json'], {})).toEqual({
|
|
passthroughArgs: [],
|
|
reportPath: 'out.json'
|
|
})
|
|
})
|
|
|
|
it('rejects ambiguous report paths and reporter overrides', () => {
|
|
expect(() => parseReportGateArgs(['--report', '--grep', 'ACK'])).toThrow(
|
|
'--report requires a path'
|
|
)
|
|
expect(() => parseReportGateArgs(['--reporter=line'])).toThrow(
|
|
'test:e2e:terminal-perf:scale:report always uses --reporter=json'
|
|
)
|
|
expect(() => parseReportGateArgs(['--reporter', 'line'])).toThrow(
|
|
'test:e2e:terminal-perf:scale:report always uses --reporter=json'
|
|
)
|
|
})
|
|
|
|
it('runs the scale suite with JSON output, then summarizes and budget-checks the report', () => {
|
|
const reportPath = tempReportPath()
|
|
const { calls, spawnSyncImpl } = makeSpawnSync()
|
|
|
|
const status = runTerminalScalePerfReportGate({
|
|
argv: ['--report', reportPath, '--grep', '25 ACK-backpressured real PTYs'],
|
|
env: { ...process.env, ORCA_TEST_MARKER: '1' },
|
|
spawnSyncImpl
|
|
})
|
|
|
|
expect(status).toBe(0)
|
|
expect(readFileSync(reportPath, 'utf8')).toBe('{"suites":[]}')
|
|
expect(calls.map((call) => call.args[0])).toEqual([
|
|
'config/scripts/run-terminal-scale-perf-e2e.mjs',
|
|
'config/scripts/summarize-terminal-perf-report.mjs',
|
|
'config/scripts/check-terminal-perf-report-budgets.mjs',
|
|
'config/scripts/generate-terminal-perf-html-report.mjs'
|
|
])
|
|
expect(calls[0].args).toEqual([
|
|
'config/scripts/run-terminal-scale-perf-e2e.mjs',
|
|
'--',
|
|
'--reporter=json',
|
|
'--grep',
|
|
'25 ACK-backpressured real PTYs'
|
|
])
|
|
expect(calls[0].options.env.ORCA_TEST_MARKER).toBe('1')
|
|
expect(calls[1].args).toEqual(['config/scripts/summarize-terminal-perf-report.mjs', reportPath])
|
|
expect(calls[2].args).toEqual([
|
|
'config/scripts/check-terminal-perf-report-budgets.mjs',
|
|
reportPath
|
|
])
|
|
expect(calls[3].args).toEqual([
|
|
'config/scripts/generate-terminal-perf-html-report.mjs',
|
|
reportPath,
|
|
'--output',
|
|
'test-results/terminal-perf-impact-report.html'
|
|
])
|
|
})
|
|
|
|
it('uses the report path from env when no flag is provided', () => {
|
|
const reportPath = tempReportPath()
|
|
const { calls, spawnSyncImpl } = makeSpawnSync()
|
|
|
|
const status = runTerminalScalePerfReportGate({
|
|
env: { ...process.env, ORCA_E2E_TERMINAL_PERF_REPORT_PATH: reportPath },
|
|
spawnSyncImpl
|
|
})
|
|
|
|
expect(status).toBe(0)
|
|
expect(calls[1].args).toEqual(['config/scripts/summarize-terminal-perf-report.mjs', reportPath])
|
|
})
|
|
|
|
it('uses the HTML report path from env when provided', () => {
|
|
const reportPath = tempReportPath()
|
|
const { calls, spawnSyncImpl } = makeSpawnSync()
|
|
|
|
const status = runTerminalScalePerfReportGate({
|
|
env: {
|
|
...process.env,
|
|
ORCA_E2E_TERMINAL_PERF_HTML_REPORT_PATH: 'tmp/terminal-report.html',
|
|
ORCA_E2E_TERMINAL_PERF_REPORT_PATH: reportPath
|
|
},
|
|
spawnSyncImpl
|
|
})
|
|
|
|
expect(status).toBe(0)
|
|
expect(calls[3].args).toEqual([
|
|
'config/scripts/generate-terminal-perf-html-report.mjs',
|
|
reportPath,
|
|
'--output',
|
|
'tmp/terminal-report.html'
|
|
])
|
|
})
|
|
|
|
it('preserves the report when Playwright clears the target report directory', () => {
|
|
const reportPath = tempReportPath()
|
|
const { spawnSyncImpl } = makeSpawnSync({
|
|
onScaleRun: () => {
|
|
rmSync(dirname(reportPath), { force: true, recursive: true })
|
|
}
|
|
})
|
|
|
|
const status = runTerminalScalePerfReportGate({
|
|
argv: ['--report', reportPath],
|
|
spawnSyncImpl
|
|
})
|
|
|
|
expect(status).toBe(0)
|
|
expect(readFileSync(reportPath, 'utf8')).toBe('{"suites":[]}')
|
|
})
|
|
|
|
it('stops before summarize and budget checks when the scale run fails', () => {
|
|
const reportPath = tempReportPath()
|
|
const { calls, spawnSyncImpl } = makeSpawnSync({ scaleStatus: 7 })
|
|
|
|
const status = runTerminalScalePerfReportGate({
|
|
argv: ['--report', reportPath],
|
|
spawnSyncImpl
|
|
})
|
|
|
|
expect(status).toBe(7)
|
|
expect(calls.map((call) => call.args[0])).toEqual([
|
|
'config/scripts/run-terminal-scale-perf-e2e.mjs'
|
|
])
|
|
})
|
|
})
|