Skip to content

Commit 65dca29

Browse files
LevelDownRefineWorkBuddy
andcommitted
fix: 修正 test_log_monitor 对根目录与日志幂等的 patch 入口
parse_logs 读 config 用的是 collect_log._get_root_dir(),而非 src.utils_logger .get_root_dir;此前测试 patch 错入口,导致 CI 上读真实 config(全部 6 脚本) 而非临时 config,rerun/notify 列表断言失败。改为 patch collect_log._get_root_dir。 setup_logging 幂等测试原本手动置 _configured=False 永久污染源,且断言全局 handler 数为 1(易被其它测试残留 handler 干扰);改为保存/恢复原 _configured, 并断言「本次新增 onedragon_helper.log handler 数==1」。 Co-Authored-By: WorkBuddy <agent@workbuddy.ai>
1 parent baf0185 commit 65dca29

1 file changed

Lines changed: 28 additions & 30 deletions

File tree

‎tests/test_log_monitor.py‎

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ def test_setup_logging_writes_to_framework_log(self):
192192
(用临时根避免污染真实 logs),且不写 collect_log.log。"""
193193
tmp = tempfile.mkdtemp()
194194
orig = src.utils_logger.get_root_dir
195+
configured_saved = src.utils_logger._configured
195196
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
196197
src.utils_logger._configured = False
197198
before = {id(h) for h in _logging.getLogger().handlers}
@@ -217,32 +218,37 @@ def test_setup_logging_writes_to_framework_log(self):
217218
if id(h) in (after - before):
218219
_logging.getLogger().removeHandler(h)
219220
h.close()
220-
src.utils_logger._configured = False
221+
src.utils_logger._configured = configured_saved
221222
src.utils_logger.get_root_dir = orig
222223

223224
def test_setup_logging_is_idempotent(self):
224225
"""重复调用复用框架 setup_logging 不会重复添加 onedragon_helper.log handler。"""
225226
tmp = tempfile.mkdtemp()
226227
orig = src.utils_logger.get_root_dir
228+
configured_saved = src.utils_logger._configured
227229
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
228230
src.utils_logger._configured = False
229231
before = {id(h) for h in _logging.getLogger().handlers}
230232
try:
231233
collect_log.setup_logging()
232234
collect_log.setup_logging()
233-
count = sum(
235+
# 幂等:本次调用(首次因 _configured 被置 False 而添加,第二次 no-op)
236+
# 仅新增 1 个指向 onedragon_helper.log 的 handler;不依赖全局计数,
237+
# 避免被其它测试残留的 handler 干扰。
238+
added = {id(h) for h in _logging.getLogger().handlers} - before
239+
added_count = sum(
234240
1
235241
for h in _logging.getLogger().handlers
236-
if "onedragon_helper.log" in getattr(h, "baseFilename", "")
242+
if id(h) in added and "onedragon_helper.log" in getattr(h, "baseFilename", "")
237243
)
238-
self.assertEqual(count, 1)
244+
self.assertEqual(added_count, 1)
239245
finally:
240246
after = {id(h) for h in _logging.getLogger().handlers}
241247
for h in list(_logging.getLogger().handlers):
242248
if id(h) in (after - before):
243249
_logging.getLogger().removeHandler(h)
244250
h.close()
245-
src.utils_logger._configured = False
251+
src.utils_logger._configured = configured_saved
246252
src.utils_logger.get_root_dir = orig
247253

248254

@@ -266,9 +272,10 @@ def _fake_exe(self, tmp: str, name: str = "fake.exe") -> str:
266272
return script_path
267273

268274
def _run_parse(self, tmp: str, do_log: bool = True) -> list[str]:
269-
orig = src.utils_logger.get_root_dir
270-
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
271-
src.utils_logger._configured = False
275+
# parse_logs 读 config 用的是 collect_log._get_root_dir(),并非
276+
# src.utils_logger.get_root_dir,故此处 patch 前者才能让临时 config 生效。
277+
orig = collect_log._get_root_dir
278+
collect_log._get_root_dir = lambda: tmp # type: ignore[assignment]
272279
before = {id(h) for h in _logging.getLogger().handlers}
273280
try:
274281
return collect_log.parse_logs(do_log=do_log)
@@ -278,8 +285,7 @@ def _run_parse(self, tmp: str, do_log: bool = True) -> list[str]:
278285
if id(h) in (after - before):
279286
_logging.getLogger().removeHandler(h)
280287
h.close()
281-
src.utils_logger._configured = False
282-
src.utils_logger.get_root_dir = orig
288+
collect_log._get_root_dir = orig
283289

284290
def test_parse_logs_includes_no_log_in_rerun_list(self):
285291
"""无日志(NO_LOG)的游戏应被纳入重跑列表(可能未正常启动)。"""
@@ -366,9 +372,8 @@ def fake_parse(script_name, script_path=""):
366372
"extra": None,
367373
}
368374

369-
orig = src.utils_logger.get_root_dir
370-
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
371-
src.utils_logger._configured = False
375+
orig = collect_log._get_root_dir
376+
collect_log._get_root_dir = lambda: tmp # type: ignore[assignment]
372377
before = {id(h) for h in _logging.getLogger().handlers}
373378
try:
374379
with mock.patch.object(collect_log, "parse_log", side_effect=fake_parse):
@@ -379,8 +384,7 @@ def fake_parse(script_name, script_path=""):
379384
if id(h) in (after - before):
380385
_logging.getLogger().removeHandler(h)
381386
h.close()
382-
src.utils_logger._configured = False
383-
src.utils_logger.get_root_dir = orig
387+
collect_log._get_root_dir = orig
384388

385389
self.assertEqual(result["rerun"], ["BetterGI"])
386390
self.assertEqual(result["notify"], ["ok-ww"])
@@ -424,9 +428,8 @@ def fake_parse(script_name, script_path=""):
424428
"extra": None,
425429
}
426430

427-
orig = src.utils_logger.get_root_dir
428-
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
429-
src.utils_logger._configured = False
431+
orig = collect_log._get_root_dir
432+
collect_log._get_root_dir = lambda: tmp # type: ignore[assignment]
430433
before = {id(h) for h in _logging.getLogger().handlers}
431434
try:
432435
with mock.patch.object(collect_log, "parse_log", side_effect=fake_parse):
@@ -437,8 +440,7 @@ def fake_parse(script_name, script_path=""):
437440
if id(h) in (after - before):
438441
_logging.getLogger().removeHandler(h)
439442
h.close()
440-
src.utils_logger._configured = False
441-
src.utils_logger.get_root_dir = orig
443+
collect_log._get_root_dir = orig
442444

443445
# WARN 不影响决策:正常退出 → 不重跑;有报错 → 通知。
444446
self.assertEqual(result["rerun"], [])
@@ -542,9 +544,8 @@ def fake_parse(script_name, script_path=""):
542544
"extra": None,
543545
}
544546

545-
orig = src.utils_logger.get_root_dir
546-
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
547-
src.utils_logger._configured = False
547+
orig = collect_log._get_root_dir
548+
collect_log._get_root_dir = lambda: tmp # type: ignore[assignment]
548549
before = {id(h) for h in _logging.getLogger().handlers}
549550
try:
550551
with mock.patch.object(collect_log, "parse_log", side_effect=fake_parse):
@@ -555,8 +556,7 @@ def fake_parse(script_name, script_path=""):
555556
if id(h) in (after - before):
556557
_logging.getLogger().removeHandler(h)
557558
h.close()
558-
src.utils_logger._configured = False
559-
src.utils_logger.get_root_dir = orig
559+
collect_log._get_root_dir = orig
560560

561561
self.assertNotIn("未知", result["report"])
562562

@@ -1086,9 +1086,8 @@ def test_parse_log_no_log_resolves_exited_false(self):
10861086
},
10871087
f,
10881088
)
1089-
orig = src.utils_logger.get_root_dir
1090-
src.utils_logger.get_root_dir = lambda: tmp # type: ignore[assignment]
1091-
src.utils_logger._configured = False
1089+
orig = collect_log._get_root_dir
1090+
collect_log._get_root_dir = lambda: tmp # type: ignore[assignment]
10921091
before = {id(h) for h in _logging.getLogger().handlers}
10931092
try:
10941093
res = parse_log("ok-ww", os.path.join(tmp, "ok-ww", "ok-ww.exe"))
@@ -1098,8 +1097,7 @@ def test_parse_log_no_log_resolves_exited_false(self):
10981097
if id(h) in (after - before):
10991098
_logging.getLogger().removeHandler(h)
11001099
h.close()
1101-
src.utils_logger._configured = False
1102-
src.utils_logger.get_root_dir = orig
1100+
collect_log._get_root_dir = orig
11031101
self.assertEqual(res["status"], ScriptLogStatus.NO_LOG)
11041102
self.assertFalse(res["exited"])
11051103
self.assertIsInstance(res["exited"], bool)

0 commit comments

Comments
 (0)