Skip to content

Commit 7926f57

Browse files
committed
feat: Add session history retriever test
1 parent 7468367 commit 7926f57

File tree

9 files changed

+99
-17
lines changed

9 files changed

+99
-17
lines changed

changes/4697.feature.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add session status history retrieval test validating history not empty and contains valid statuses

src/ai/backend/test/contexts/session.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import override
2-
from uuid import UUID
32

43
from ai.backend.test.contexts.context import BaseTestContext, ContextName
4+
from ai.backend.test.data.session import CreatedSessionMeta
55
from ai.backend.test.tester.dependency import (
66
BatchSessionDep,
77
ClusterDep,
@@ -45,7 +45,7 @@ def name(cls) -> ContextName:
4545
return ContextName.CREATED_SESSION_TEMPLATE_ID
4646

4747

48-
class CreatedSessionIDContext(BaseTestContext[UUID]):
48+
class CreatedSessionMetaContext(BaseTestContext[CreatedSessionMeta]):
4949
@override
5050
@classmethod
5151
def name(cls) -> ContextName:

src/ai/backend/test/data/session.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import uuid
2+
from dataclasses import dataclass
3+
4+
5+
@dataclass
6+
class CreatedSessionMeta:
7+
id: uuid.UUID
8+
name: str

src/ai/backend/test/templates/session/batch_session.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99
from ai.backend.test.contexts.session import (
1010
BatchSessionContext,
1111
ClusterContext,
12-
CreatedSessionIDContext,
12+
CreatedSessionMetaContext,
1313
SessionContext,
1414
)
1515
from ai.backend.test.contexts.sse import (
1616
SSEContext,
1717
)
1818
from ai.backend.test.contexts.tester import TestSpecMetaContext
19+
from ai.backend.test.data.session import CreatedSessionMeta
1920
from ai.backend.test.templates.session.utils import verify_session_events
2021
from ai.backend.test.templates.template import (
2122
WrapperTestTemplate,
@@ -78,5 +79,7 @@ async def _context(self) -> AsyncIterator[None]:
7879
session_name = f"test_session_{str(test_id)}"
7980

8081
session_id = await self._verify_session_creation(client_session, session_name)
81-
with CreatedSessionIDContext.with_current(session_id):
82+
with CreatedSessionMetaContext.with_current(
83+
CreatedSessionMeta(id=session_id, name=session_name)
84+
):
8285
yield

src/ai/backend/test/templates/session/interactive_session.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
from ai.backend.test.contexts.image import ImageContext
99
from ai.backend.test.contexts.session import (
1010
ClusterContext,
11-
CreatedSessionIDContext,
11+
CreatedSessionMetaContext,
1212
SessionContext,
1313
)
1414
from ai.backend.test.contexts.sse import (
1515
SSEContext,
1616
)
1717
from ai.backend.test.contexts.tester import TestSpecMetaContext
18+
from ai.backend.test.data.session import CreatedSessionMeta
1819
from ai.backend.test.templates.session.utils import (
1920
verify_session_events,
2021
)
@@ -100,7 +101,9 @@ async def _context(self) -> AsyncIterator[None]:
100101
session_id = None
101102
try:
102103
session_id = await self._verify_session_creation(client_session, session_name)
103-
with CreatedSessionIDContext.with_current(session_id):
104+
with CreatedSessionMetaContext.with_current(
105+
CreatedSessionMeta(id=session_id, name=session_name)
106+
):
104107
yield
105108
finally:
106109
if session_id:

src/ai/backend/test/templates/session/session_template.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
from ai.backend.test.contexts.session import (
1111
BatchSessionContext,
1212
ClusterContext,
13-
CreatedSessionIDContext,
13+
CreatedSessionMetaContext,
1414
CreatedSessionTemplateIDContext,
1515
SessionContext,
1616
)
1717
from ai.backend.test.contexts.sse import (
1818
SSEContext,
1919
)
2020
from ai.backend.test.contexts.tester import TestSpecMetaContext
21+
from ai.backend.test.data.session import CreatedSessionMeta
2122
from ai.backend.test.templates.session.utils import (
2223
verify_session_events,
2324
)
@@ -151,7 +152,9 @@ async def _context(self) -> AsyncIterator[None]:
151152
session_name = f"test_session_{str(test_id)}"
152153

153154
session_id = await self._verify_session_creation(client_session, session_name)
154-
with CreatedSessionIDContext.with_current(session_id):
155+
with CreatedSessionMetaContext.with_current(
156+
CreatedSessionMeta(id=session_id, name=session_name)
157+
):
155158
yield
156159

157160

@@ -228,7 +231,9 @@ async def _context(self) -> AsyncIterator[None]:
228231
session_id = None
229232
try:
230233
session_id = await self._verify_session_creation(client_session, session_name)
231-
with CreatedSessionIDContext.with_current(session_id):
234+
with CreatedSessionMetaContext.with_current(
235+
CreatedSessionMeta(id=session_id, name=session_name)
236+
):
232237
yield
233238
finally:
234239
if session_id:

src/ai/backend/test/testcases/session/execution.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from ai.backend.test.contexts.client_session import ClientSessionContext
2-
from ai.backend.test.contexts.session import CodeExecutionContext, CreatedSessionIDContext
2+
from ai.backend.test.contexts.session import CodeExecutionContext, CreatedSessionMetaContext
33
from ai.backend.test.templates.template import TestCode
44

55

66
class InteractiveSessionExecuteCodeSuccess(TestCode):
77
async def test(self) -> None:
88
client_session = ClientSessionContext.current()
9-
session_id = CreatedSessionIDContext.current()
9+
session_meta = CreatedSessionMetaContext.current()
10+
session_id = session_meta.id
1011
code_dep = CodeExecutionContext.current()
1112

1213
result = await client_session.ComputeSession(str(session_id)).execute(
@@ -41,7 +42,8 @@ async def test(self) -> None:
4142
class InteractiveSessionExecuteCodeFailureWrongCommand(TestCode):
4243
async def test(self) -> None:
4344
client_session = ClientSessionContext.current()
44-
session_id = CreatedSessionIDContext.current()
45+
session_meta = CreatedSessionMetaContext.current()
46+
session_id = session_meta.id
4547
WRONG_CMD = "some wrong command !@#"
4648

4749
result = await client_session.ComputeSession(str(session_id)).execute(
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from typing import override
2+
3+
from ai.backend.test.contexts.client_session import ClientSessionContext
4+
from ai.backend.test.contexts.session import CreatedSessionMetaContext
5+
from ai.backend.test.templates.template import TestCode
6+
7+
8+
class StatusHistoryRetriever(TestCode):
9+
@override
10+
async def test(self) -> None:
11+
session = ClientSessionContext.current()
12+
session_meta = CreatedSessionMetaContext.current()
13+
session_name = session_meta.name
14+
15+
expected_status = set([
16+
"PENDING",
17+
"SCHEDULED",
18+
"PREPARING",
19+
"PULLING",
20+
"PREPARED",
21+
"CREATING",
22+
"RUNNING",
23+
"RESTARTING",
24+
"RUNNING_DEGRADED",
25+
"TERMINATING",
26+
"TERMINATED",
27+
"ERROR",
28+
"CANCELED",
29+
])
30+
31+
result = await session.ComputeSession(name=session_name).get_status_history()
32+
assert result["result"] != "", "Status history should not be empty"
33+
# NOTE: SessionStatus enum is not available due to BUILD rules
34+
# NOTE: src/ai/backend/test/BUILD[//src/ai/backend/**] -> src/ai/backend/manager/BUILD[!*] : DENY
35+
for status_key, status_value in result["result"].items():
36+
assert status_key in expected_status, (
37+
f"Status {status_key} is not a valid session status"
38+
)

src/ai/backend/test/testcases/session/testspecs.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
InteractiveSessionFromTemplateTemplate,
1111
SessionTemplateTemplate,
1212
)
13+
from ai.backend.test.templates.template import BasicTestTemplate, NopTestCode
1314
from ai.backend.test.testcases.session.creation_failure_low_resources import (
1415
SessionCreationFailureLowResources,
1516
)
@@ -23,11 +24,10 @@
2324
InteractiveSessionExecuteCodeFailureWrongCommand,
2425
InteractiveSessionExecuteCodeSuccess,
2526
)
27+
from ai.backend.test.testcases.session.status_history_retriever import StatusHistoryRetriever
2628
from ai.backend.test.testcases.spec_manager import TestSpec, TestTag
2729
from ai.backend.test.tester.dependency import ClusterDep, CodeExecutionDep
2830

29-
from ...templates.template import BasicTestTemplate, NopTestCode
30-
3131
BATCH_SESSION_TEST_SPECS = {
3232
"creation_batch_session_success": TestSpec(
3333
name="creation_batch_session_success",
@@ -265,9 +265,31 @@
265265
),
266266
}
267267

268+
SESSION_INFO_RETRIEVER_TEST_SPECS = {
269+
"session_status_history": TestSpec(
270+
name="session_status_history",
271+
description=textwrap.dedent("""
272+
Tests retrieval of session status history
273+
Validate that the status history is not empty and contains valid statuses
274+
"""),
275+
tags={TestTag.SESSION, TestTag.MANAGER},
276+
template=BasicTestTemplate(
277+
testcode=StatusHistoryRetriever(),
278+
).with_wrappers(KeypairAuthTemplate, InteractiveSessionTemplate),
279+
parametrizes={
280+
ContextName.CLUSTER_CONFIG: [
281+
ClusterDep(
282+
cluster_mode=ClusterMode.SINGLE_NODE,
283+
cluster_size=1,
284+
),
285+
]
286+
},
287+
),
288+
}
268289

269290
SESSION_TEST_SPECS = {
270-
**BATCH_SESSION_TEST_SPECS,
271-
**INTERACTIVE_SESSION_TEST_SPECS,
272-
**SESSION_TEMPLATE_TEST_SPECS,
291+
# **BATCH_SESSION_TEST_SPECS,
292+
# **INTERACTIVE_SESSION_TEST_SPECS,
293+
# **SESSION_TEMPLATE_TEST_SPECS,
294+
**SESSION_INFO_RETRIEVER_TEST_SPECS
273295
}

0 commit comments

Comments
 (0)