1111from runloop_api_client .sdk import AsyncDevbox , AsyncRunloopSDK
1212from tests .smoketests .utils import unique_name
1313from runloop_api_client .lib .polling import PollingConfig
14+ from runloop_api_client .lib .polling_async import async_poll_until
1415
1516pytestmark = [pytest .mark .smoketest , pytest .mark .asyncio ]
1617
@@ -1040,35 +1041,19 @@ async def test_shell_exec_async_with_both_streams(self, devbox: AsyncDevbox) ->
10401041class TestAsyncDevboxLogs :
10411042 """Test async devbox logs retrieval functionality."""
10421043
1043- @pytest .mark .timeout (THIRTY_SECOND_TIMEOUT )
1044- async def test_logs_basic (self , shared_devbox : AsyncDevbox ) -> None :
1045- """Test retrieving devbox logs returns valid response structure."""
1046- test_message = "async basic log test message"
1047- result = await shared_devbox .cmd .exec (f'echo "{ test_message } "' )
1048- assert result .exit_code == 0
1049-
1050- logs = await shared_devbox .logs ()
1051-
1052- assert logs is not None
1053- assert hasattr (logs , "logs" )
1054- assert isinstance (logs .logs , list )
1055- log_content = " " .join (str (log ) for log in logs .logs )
1056- assert test_message in log_content
1057-
10581044 @pytest .mark .timeout (THIRTY_SECOND_TIMEOUT )
10591045 async def test_logs_with_execution_filter (self , shared_devbox : AsyncDevbox ) -> None :
10601046 """Test retrieving devbox logs filtered by execution ID."""
10611047 test_message = "async filtered log test"
10621048 result = await shared_devbox .cmd .exec (f'echo "{ test_message } "' )
10631049 assert result .exit_code == 0
10641050
1065- logs = await shared_devbox .logs (execution_id = result .execution_id )
1066-
1067- assert logs is not None
1068- assert hasattr (logs , "logs" )
1069- assert isinstance (logs .logs , list )
1070- log_content = " " .join (str (log ) for log in logs .logs )
1071- assert test_message in log_content
1051+ logs = await async_poll_until (
1052+ retriever = lambda : shared_devbox .logs (execution_id = result .execution_id ),
1053+ is_terminal = lambda l : any (test_message in (log .message or "" ) for log in l .logs ),
1054+ config = PollingConfig (timeout_seconds = 10 , interval_seconds = 1 ),
1055+ )
1056+ assert any (test_message in (log .message or "" ) for log in logs .logs )
10721057
10731058 @pytest .mark .timeout (THIRTY_SECOND_TIMEOUT )
10741059 async def test_logs_with_shell_name_filter (self , shared_devbox : AsyncDevbox ) -> None :
@@ -1080,10 +1065,9 @@ async def test_logs_with_shell_name_filter(self, shared_devbox: AsyncDevbox) ->
10801065 result = await shell .exec (f'echo "{ test_message } "' )
10811066 assert result .exit_code == 0
10821067
1083- logs = await shared_devbox .logs (shell_name = shell_name )
1084-
1085- assert logs is not None
1086- assert hasattr (logs , "logs" )
1087- assert isinstance (logs .logs , list )
1088- log_content = " " .join (str (log ) for log in logs .logs )
1089- assert test_message in log_content
1068+ logs = await async_poll_until (
1069+ retriever = lambda : shared_devbox .logs (shell_name = shell_name ),
1070+ is_terminal = lambda l : any (test_message in (log .message or "" ) for log in l .logs ),
1071+ config = PollingConfig (timeout_seconds = 10 , interval_seconds = 1 ),
1072+ )
1073+ assert any (test_message in (log .message or "" ) for log in logs .logs )
0 commit comments