* fix(draw-image): per-process output TMP in integration tests * fix(draw-image): per-process output TMP in e2e tests * fix(draw-image): per-process output TMP in cleanup test * docs(handoff): add handoff and ADR for beforeAll output TMP fix * docs(handoff): set PR number * docs(handoff): set PR number 186 --------- Co-authored-by: opencode-agent <agent@opencode.local>
2.2 KiB
ADR-081: Per-process output TMP dirs in draw-image test beforeAll
Статус
Accepted (2026-07-31)
Контекст
Тестовые файлы draw-image использовали общий output-каталог на тест-файл (/tmp/draw-image-<name>), создаваемый/очищаемый в beforeAll. При параллельном запуске нескольких процессов vitest concurrently (внешняя параллель, не intra-pool) процессы с одинаковым набором тест-файлов конкурировали за один каталог: rmSync(TMP, recursive) процесса A удалял PNG + meta.json, только что написанные процессом B → падение assertions (existsSync, skipped vs rendered, unable to open for write). Аналогично race на input.svg (#177, test helper), но для output-каталогов beforeAll. Issue #183.
Решение
Уникализировать output-каталог на процесс через process.pid suffix: TMP = path.join(os.tmpdir(), \draw-image--${process.pid}`). Добавить afterAllcleanup где отсутствовал.process.pidуникален на каждый параллельный vitest-процесс → каталоги не коллизируют. Не использованmkdtempSync` — детерминированный suffixed path проще для assertions и достаточно уникален для внешней параллельности (intra-pool workers у vitest по умолчанию forks → разные PID).
Альтернативы
fs.mkdtempSync(path.join(os.tmpdir(), "draw-image-<name>-"))— гарантированная уникальность даже при одинаковом PID (threads pool), но nondeterministic path усложняет дебаг. PID-suffix достаточен для текущего pool-режима vitest.- Vitest
--no-parallel/--pool=threads --poolOptions.threads.singleThread: true— подавляет параллель, но не устраняет root cause и замедляет CI.