@@ -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