JJ_MKVMaker/test/support/temp_dirs.dart

43 lines
1.9 KiB
Dart

import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
/// 뒤에서 저장이 끝나는 것 (책갈피 저장 등) 을 기다렸다가 지울 임시 폴더 - 시험 파일이 끝날 때 지운다.
/// 시험마다 바로 지우면 늦게 끝난 저장이 폴더를 다시 만들어 %TEMP% 에 jj_* 가 남았다 (관리자 지시 10/17, tool/test_temp_check.ps1).
final _later = <Directory>[];
/// [prefix] 로 임시 폴더를 만들고, 파일 끝 ([deleteTempDirsAtEnd]) 에 지우도록 적어 둔다
Directory tempDirUntilEnd(String prefix) {
final d = Directory.systemTemp.createTempSync(prefix);
_later.add(d);
expectInTaggedTemp(d);
return d;
}
/// 관리자 지시 (10/20): tool/test_temp_check.ps1 이 TEMP · TMP 를 실행 폴더 (%TEMP%\t_jjrun_<표>) 로 돌리고 표를 JJ_TEST_TMP_TAG 로 넘긴다.
/// 표가 있는데 임시 폴더가 그 밖에 생기면 (환경 변수가 시험 · 앱까지 오지 않음) 다른 세션 시험과 섞이므로 시험을 실패시킨다
void expectInTaggedTemp(Directory dir) {
final tag = Platform.environment['JJ_TEST_TMP_TAG'] ?? '';
if (tag.isEmpty) return;
expect(dir.absolute.path.toLowerCase(), contains('t_jjrun_$tag'.toLowerCase()),
reason: 'TEMP 가 시험 실행 폴더로 오지 않음 (JJ_TEST_TMP_TAG=$tag)');
}
/// main() 에서 한 번 부른다: 파일의 시험이 다 끝나면 [tempDirUntilEnd] 로 만든 폴더를 지운다
/// (늦게 끝난 저장이 다시 만들 수 있어 잠깐씩 기다리며 몇 번 본다)
void deleteTempDirsAtEnd() {
tearDownAll(() async {
for (var round = 0; round < 5; round++) {
await Future<void>.delayed(const Duration(milliseconds: 200));
for (final d in _later) {
try {
if (d.existsSync()) d.deleteSync(recursive: true);
} on FileSystemException {
// 잠깐 잡혀 있으면 다음 차례에
}
}
}
_later.removeWhere((d) => !d.existsSync());
});
}