Skip to content

Commit fa6f209

Browse files
committed
fix(tests): poll for logs in smoke tests to handle CloudWatch ingestion latency
1 parent bd27696 commit fa6f209

2 files changed

Lines changed: 26 additions & 59 deletions

File tree

tests/smoketests/sdk/test_async_devbox.py

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from runloop_api_client.sdk import AsyncDevbox, AsyncRunloopSDK
1212
from tests.smoketests.utils import unique_name
1313
from runloop_api_client.lib.polling import PollingConfig
14+
from runloop_api_client.lib.polling_async import async_poll_until
1415

1516
pytestmark = [pytest.mark.smoketest, pytest.mark.asyncio]
1617

@@ -1040,35 +1041,19 @@ async def test_shell_exec_async_with_both_streams(self, devbox: AsyncDevbox) ->
10401041
class 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)

tests/smoketests/sdk/test_devbox.py

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from runloop_api_client.sdk import Devbox, RunloopSDK
1212
from tests.smoketests.utils import unique_name
13-
from runloop_api_client.lib.polling import PollingConfig
13+
from runloop_api_client.lib.polling import PollingConfig, poll_until
1414

1515
pytestmark = [pytest.mark.smoketest]
1616

@@ -1026,35 +1026,19 @@ def test_shell_exec_async_with_both_streams(self, devbox: Devbox) -> None:
10261026
class TestDevboxLogs:
10271027
"""Test devbox logs retrieval functionality."""
10281028

1029-
@pytest.mark.timeout(THIRTY_SECOND_TIMEOUT)
1030-
def test_logs_basic(self, shared_devbox: Devbox) -> None:
1031-
"""Test retrieving devbox logs returns valid response structure."""
1032-
test_message = "basic log test message"
1033-
result = shared_devbox.cmd.exec(f'echo "{test_message}"')
1034-
assert result.exit_code == 0
1035-
1036-
logs = shared_devbox.logs()
1037-
1038-
assert logs is not None
1039-
assert hasattr(logs, "logs")
1040-
assert isinstance(logs.logs, list)
1041-
log_content = " ".join(str(log) for log in logs.logs)
1042-
assert test_message in log_content
1043-
10441029
@pytest.mark.timeout(THIRTY_SECOND_TIMEOUT)
10451030
def test_logs_with_execution_filter(self, shared_devbox: Devbox) -> None:
10461031
"""Test retrieving devbox logs filtered by execution ID."""
10471032
test_message = "filtered log test"
10481033
result = shared_devbox.cmd.exec(f'echo "{test_message}"')
10491034
assert result.exit_code == 0
10501035

1051-
logs = shared_devbox.logs(execution_id=result.execution_id)
1052-
1053-
assert logs is not None
1054-
assert hasattr(logs, "logs")
1055-
assert isinstance(logs.logs, list)
1056-
log_content = " ".join(str(log) for log in logs.logs)
1057-
assert test_message in log_content
1036+
logs = poll_until(
1037+
retriever=lambda: shared_devbox.logs(execution_id=result.execution_id),
1038+
is_terminal=lambda l: any(test_message in (log.message or "") for log in l.logs),
1039+
config=PollingConfig(timeout_seconds=10, interval_seconds=1),
1040+
)
1041+
assert any(test_message in (log.message or "") for log in logs.logs)
10581042

10591043
@pytest.mark.timeout(THIRTY_SECOND_TIMEOUT)
10601044
def test_logs_with_shell_name_filter(self, shared_devbox: Devbox) -> None:
@@ -1066,10 +1050,9 @@ def test_logs_with_shell_name_filter(self, shared_devbox: Devbox) -> None:
10661050
result = shell.exec(f'echo "{test_message}"')
10671051
assert result.exit_code == 0
10681052

1069-
logs = shared_devbox.logs(shell_name=shell_name)
1070-
1071-
assert logs is not None
1072-
assert hasattr(logs, "logs")
1073-
assert isinstance(logs.logs, list)
1074-
log_content = " ".join(str(log) for log in logs.logs)
1075-
assert test_message in log_content
1053+
logs = poll_until(
1054+
retriever=lambda: shared_devbox.logs(shell_name=shell_name),
1055+
is_terminal=lambda l: any(test_message in (log.message or "") for log in l.logs),
1056+
config=PollingConfig(timeout_seconds=10, interval_seconds=1),
1057+
)
1058+
assert any(test_message in (log.message or "") for log in logs.logs)

0 commit comments

Comments
 (0)