Skip to content

Commit 198d20a

Browse files
committed
Fix Vertex AI listSessions null handling
1 parent f6ff2f2 commit 198d20a

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

core/src/main/java/com/google/adk/sessions/VertexAiSessionService.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,17 @@ public Single<ListSessionsResponse> listSessions(String appName, String userId)
119119
.map(
120120
listSessionsResponseMap ->
121121
parseListSessionsResponse(listSessionsResponseMap, appName, userId))
122-
.defaultIfEmpty(ListSessionsResponse.builder().build());
122+
.defaultIfEmpty(ListSessionsResponse.builder().sessions(new ArrayList<>()).build());
123123
}
124124

125125
private ListSessionsResponse parseListSessionsResponse(
126126
JsonNode listSessionsResponseMap, String appName, String userId) {
127+
JsonNode sessionsNode = listSessionsResponseMap.get("sessions");
128+
if (sessionsNode == null || sessionsNode.isNull() || sessionsNode.isEmpty()) {
129+
return ListSessionsResponse.builder().sessions(new ArrayList<>()).build();
130+
}
127131
List<Map<String, Object>> apiSessions =
128-
objectMapper.convertValue(
129-
listSessionsResponseMap.get("sessions"),
130-
new TypeReference<List<Map<String, Object>>>() {});
132+
objectMapper.convertValue(sessionsNode, new TypeReference<List<Map<String, Object>>>() {});
131133

132134
List<Session> sessions = new ArrayList<>();
133135
for (Map<String, Object> apiSession : apiSessions) {

core/src/test/java/com/google/adk/sessions/VertexAiSessionServiceTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.util.Optional;
2626
import java.util.concurrent.ConcurrentHashMap;
2727
import java.util.concurrent.ConcurrentMap;
28+
import okhttp3.MediaType;
29+
import okhttp3.ResponseBody;
2830
import org.junit.Before;
2931
import org.junit.Test;
3032
import org.junit.runner.RunWith;
@@ -37,6 +39,20 @@
3739
public class VertexAiSessionServiceTest {
3840

3941
private static final ObjectMapper mapper = JsonBaseModel.getMapper();
42+
private static final MediaType JSON_MEDIA_TYPE =
43+
MediaType.parse("application/json; charset=utf-8");
44+
45+
private static ApiResponse apiResponseJson(String json) {
46+
return new ApiResponse() {
47+
@Override
48+
public ResponseBody getResponseBody() {
49+
return ResponseBody.create(JSON_MEDIA_TYPE, json);
50+
}
51+
52+
@Override
53+
public void close() {}
54+
};
55+
}
4056

4157
private static final String MOCK_SESSION_STRING_1 =
4258
"""
@@ -322,6 +338,24 @@ public void listSessions_empty() {
322338
.isEmpty();
323339
}
324340

341+
@Test
342+
public void listSessions_missingSessionsField_returnsEmpty() {
343+
when(mockApiClient.request("GET", "reasoningEngines/123/sessions?filter=user_id=userX", ""))
344+
.thenReturn(apiResponseJson("{}"));
345+
346+
assertThat(vertexAiSessionService.listSessions("123", "userX").blockingGet().sessions())
347+
.isEmpty();
348+
}
349+
350+
@Test
351+
public void listSessions_nullSessionsField_returnsEmpty() {
352+
when(mockApiClient.request("GET", "reasoningEngines/123/sessions?filter=user_id=userY", ""))
353+
.thenReturn(apiResponseJson("{\"sessions\": null}"));
354+
355+
assertThat(vertexAiSessionService.listSessions("123", "userY").blockingGet().sessions())
356+
.isEmpty();
357+
}
358+
325359
@Test
326360
public void listEvents_empty() {
327361
assertThat(vertexAiSessionService.listEvents("789", "user1", "3").blockingGet().events())

0 commit comments

Comments
 (0)