@@ -70,7 +70,7 @@ def test_cli_module_argument_parsing(self):
7070 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
7171 mock .patch ("subprocess.Popen" ) as mock_popen ,
7272 mock .patch ("socket.socket" ) as mock_socket ,
73- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
73+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
7474 ):
7575 from profiling .sampling .cli import main
7676 self ._setup_sync_mocks (mock_socket , mock_popen )
@@ -97,7 +97,7 @@ def test_cli_module_with_arguments(self):
9797 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
9898 mock .patch ("subprocess.Popen" ) as mock_popen ,
9999 mock .patch ("socket.socket" ) as mock_socket ,
100- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
100+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
101101 ):
102102 self ._setup_sync_mocks (mock_socket , mock_popen )
103103 from profiling .sampling .cli import main
@@ -117,7 +117,7 @@ def test_cli_script_argument_parsing(self):
117117 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
118118 mock .patch ("subprocess.Popen" ) as mock_popen ,
119119 mock .patch ("socket.socket" ) as mock_socket ,
120- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
120+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
121121 ):
122122 self ._setup_sync_mocks (mock_socket , mock_popen )
123123 from profiling .sampling .cli import main
@@ -142,7 +142,7 @@ def test_cli_script_with_arguments(self):
142142 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
143143 mock .patch ("subprocess.Popen" ) as mock_popen ,
144144 mock .patch ("socket.socket" ) as mock_socket ,
145- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
145+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
146146 ):
147147 # Use the helper to set up mocks consistently
148148 mock_process = self ._setup_sync_mocks (mock_socket , mock_popen )
@@ -252,7 +252,7 @@ def test_cli_module_with_profiler_options(self):
252252 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
253253 mock .patch ("subprocess.Popen" ) as mock_popen ,
254254 mock .patch ("socket.socket" ) as mock_socket ,
255- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
255+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
256256 ):
257257 self ._setup_sync_mocks (mock_socket , mock_popen )
258258 from profiling .sampling .cli import main
@@ -283,7 +283,7 @@ def test_cli_script_with_profiler_options(self):
283283 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
284284 mock .patch ("subprocess.Popen" ) as mock_popen ,
285285 mock .patch ("socket.socket" ) as mock_socket ,
286- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
286+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
287287 ):
288288 self ._setup_sync_mocks (mock_socket , mock_popen )
289289 from profiling .sampling .cli import main
@@ -325,7 +325,7 @@ def test_cli_long_module_option(self):
325325 mock .patch ("profiling.sampling.cli.sample" ) as mock_sample ,
326326 mock .patch ("subprocess.Popen" ) as mock_popen ,
327327 mock .patch ("socket.socket" ) as mock_socket ,
328- mock .patch ("profiling.sampling.cli.select.select" , return_value = ([ True ], [], []) ),
328+ mock .patch ("profiling.sampling.cli._wait_for_ready_signal" ),
329329 ):
330330 self ._setup_sync_mocks (mock_socket , mock_popen )
331331 from profiling .sampling .cli import main
@@ -716,3 +716,21 @@ def test_async_aware_incompatible_with_all_threads(self):
716716 error_msg = mock_stderr .getvalue ()
717717 self .assertIn ("--all-threads" , error_msg )
718718 self .assertIn ("incompatible with --async-aware" , error_msg )
719+
720+ @unittest .skipIf (is_emscripten , "subprocess not available" )
721+ def test_run_nonexistent_script_exits_cleanly (self ):
722+ """Test that running a non-existent script exits with a clean error."""
723+ from profiling .sampling .cli import main
724+ with mock .patch ("sys.argv" , ["profiling.sampling.cli" , "run" , "/nonexistent/script.py" ]):
725+ with self .assertRaises (SystemExit ) as cm :
726+ main ()
727+ self .assertIn ("Script not found" , str (cm .exception .code ))
728+
729+ @unittest .skipIf (is_emscripten , "subprocess not available" )
730+ def test_run_nonexistent_module_exits_cleanly (self ):
731+ """Test that running a non-existent module exits with a clean error."""
732+ from profiling .sampling .cli import main
733+ with mock .patch ("sys.argv" , ["profiling.sampling.cli" , "run" , "-m" , "nonexistent_module_xyz" ]):
734+ with self .assertRaises (SystemExit ) as cm :
735+ main ()
736+ self .assertIn ("Module not found" , str (cm .exception .code ))
0 commit comments