@@ -507,6 +507,60 @@ def test_get_local_booter(self):
507507 # Reset for other tests
508508 computer_client .local_booter = None
509509
510+ @pytest .mark .parametrize ("shell_executable" , ["pwsh.exe" , "powershell.exe" ])
511+ def test_get_local_booter_logs_windows_shell_once (
512+ self ,
513+ monkeypatch ,
514+ shell_executable ,
515+ ):
516+ """Test Windows effective shell is logged once per local booter."""
517+ from astrbot .core .computer import computer_client
518+
519+ mock_logger = MagicMock ()
520+ mock_resolver = MagicMock (return_value = shell_executable )
521+ monkeypatch .setattr (computer_client , "local_booter" , None )
522+ monkeypatch .setattr (computer_client .sys , "platform" , "win32" )
523+ monkeypatch .setattr (computer_client , "logger" , mock_logger )
524+ monkeypatch .setattr (
525+ computer_client ,
526+ "resolve_windows_shell" ,
527+ mock_resolver ,
528+ )
529+
530+ booter1 = computer_client .get_local_booter ()
531+ booter2 = computer_client .get_local_booter ()
532+
533+ assert booter1 is booter2
534+ mock_resolver .assert_called_once_with ()
535+ mock_logger .info .assert_called_once_with (
536+ "[Computer] Windows local runtime shell: %s" ,
537+ shell_executable ,
538+ )
539+
540+ def test_get_local_booter_skips_windows_shell_log_outside_windows (
541+ self ,
542+ monkeypatch ,
543+ ):
544+ """Test non-Windows local booters skip Windows shell resolution logs."""
545+ from astrbot .core .computer import computer_client
546+
547+ mock_logger = MagicMock ()
548+ mock_resolver = MagicMock ()
549+ monkeypatch .setattr (computer_client , "local_booter" , None )
550+ monkeypatch .setattr (computer_client .sys , "platform" , "linux" )
551+ monkeypatch .setattr (computer_client , "logger" , mock_logger )
552+ monkeypatch .setattr (
553+ computer_client ,
554+ "resolve_windows_shell" ,
555+ mock_resolver ,
556+ )
557+
558+ booter = computer_client .get_local_booter ()
559+
560+ assert isinstance (booter , LocalBooter )
561+ mock_resolver .assert_not_called ()
562+ mock_logger .info .assert_not_called ()
563+
510564 @pytest .mark .asyncio
511565 async def test_shutdown_local_booter_clears_singleton (self ):
512566 """Test local managed resources are released during lifecycle shutdown."""
0 commit comments