2020
2121import com .google .common .collect .ImmutableList ;
2222import com .google .genai .types .Content ;
23+ import com .google .genai .types .FunctionCall ;
2324import com .google .genai .types .LiveServerContent ;
2425import com .google .genai .types .LiveServerMessage ;
26+ import com .google .genai .types .LiveServerSetupComplete ;
27+ import com .google .genai .types .LiveServerToolCall ;
28+ import com .google .genai .types .LiveServerToolCallCancellation ;
2529import com .google .genai .types .Part ;
30+ import com .google .genai .types .UsageMetadata ;
2631import org .junit .Test ;
2732import org .junit .runner .RunWith ;
2833import org .junit .runners .JUnit4 ;
@@ -34,8 +39,7 @@ public final class GeminiLlmConnectionTest {
3439 public void convertToServerResponse_withInterruptedTrue_mapsInterruptedField () {
3540 LiveServerContent serverContent =
3641 LiveServerContent .builder ()
37- .modelTurn (
38- Content .builder ().parts (ImmutableList .of (Part .fromText ("Model response" ))).build ())
42+ .modelTurn (Content .fromParts (Part .fromText ("Model response" )))
3943 .turnComplete (false )
4044 .interrupted (true )
4145 .build ();
@@ -55,10 +59,7 @@ public void convertToServerResponse_withInterruptedTrue_mapsInterruptedField() {
5559 public void convertToServerResponse_withInterruptedFalse_mapsInterruptedField () {
5660 LiveServerContent serverContent =
5761 LiveServerContent .builder ()
58- .modelTurn (
59- Content .builder ()
60- .parts (ImmutableList .of (Part .fromText ("Continuing response" )))
61- .build ())
62+ .modelTurn (Content .fromParts (Part .fromText ("Continuing response" )))
6263 .turnComplete (false )
6364 .interrupted (false )
6465 .build ();
@@ -75,8 +76,7 @@ public void convertToServerResponse_withInterruptedFalse_mapsInterruptedField()
7576 public void convertToServerResponse_withoutInterruptedField_mapsEmptyOptional () {
7677 LiveServerContent serverContent =
7778 LiveServerContent .builder ()
78- .modelTurn (
79- Content .builder ().parts (ImmutableList .of (Part .fromText ("Normal response" ))).build ())
79+ .modelTurn (Content .fromParts (Part .fromText ("Normal response" )))
8080 .turnComplete (true )
8181 .build ();
8282
@@ -87,4 +87,92 @@ public void convertToServerResponse_withoutInterruptedField_mapsEmptyOptional()
8787 assertThat (response .interrupted ()).isEmpty ();
8888 assertThat (response .turnComplete ()).hasValue (true );
8989 }
90+
91+ @ Test
92+ public void convertToServerResponse_withTurnCompleteTrue_mapsPartialFalse () {
93+ LiveServerContent serverContent =
94+ LiveServerContent .builder ()
95+ .modelTurn (Content .fromParts (Part .fromText ("Final response" )))
96+ .turnComplete (true )
97+ .build ();
98+
99+ LiveServerMessage message = LiveServerMessage .builder ().serverContent (serverContent ).build ();
100+
101+ LlmResponse response = GeminiLlmConnection .convertToServerResponse (message ).get ();
102+
103+ assertThat (response .partial ()).hasValue (false );
104+ assertThat (response .turnComplete ()).hasValue (true );
105+ }
106+
107+ @ Test
108+ public void convertToServerResponse_withTurnCompleteFalse_mapsPartialTrue () {
109+ LiveServerContent serverContent =
110+ LiveServerContent .builder ()
111+ .modelTurn (Content .fromParts (Part .fromText ("Partial response" )))
112+ .turnComplete (false )
113+ .build ();
114+
115+ LiveServerMessage message = LiveServerMessage .builder ().serverContent (serverContent ).build ();
116+
117+ LlmResponse response = GeminiLlmConnection .convertToServerResponse (message ).get ();
118+
119+ assertThat (response .partial ()).hasValue (true );
120+ assertThat (response .turnComplete ()).hasValue (false );
121+ }
122+
123+ @ Test
124+ public void convertToServerResponse_withToolCall_mapsContentWithFunctionCall () {
125+ FunctionCall functionCall = FunctionCall .builder ().name ("tool" ).build ();
126+ LiveServerToolCall toolCall =
127+ LiveServerToolCall .builder ().functionCalls (ImmutableList .of (functionCall )).build ();
128+
129+ LiveServerMessage message = LiveServerMessage .builder ().toolCall (toolCall ).build ();
130+
131+ LlmResponse response = GeminiLlmConnection .convertToServerResponse (message ).get ();
132+
133+ assertThat (response .content ()).isPresent ();
134+ assertThat (response .content ().get ().parts ()).isPresent ();
135+ assertThat (response .content ().get ().parts ().get ()).hasSize (1 );
136+ assertThat (response .content ().get ().parts ().get ().get (0 ).functionCall ()).hasValue (functionCall );
137+ assertThat (response .partial ()).hasValue (false );
138+ assertThat (response .turnComplete ()).hasValue (false );
139+ }
140+
141+ @ Test
142+ public void convertToServerResponse_withUsageMetadata_returnsEmptyOptional () {
143+ LiveServerMessage message =
144+ LiveServerMessage .builder ().usageMetadata (UsageMetadata .builder ().build ()).build ();
145+
146+ assertThat (GeminiLlmConnection .convertToServerResponse (message )).isEmpty ();
147+ }
148+
149+ @ Test
150+ public void convertToServerResponse_withToolCallCancellation_returnsEmptyOptional () {
151+ LiveServerMessage message =
152+ LiveServerMessage .builder ()
153+ .toolCallCancellation (LiveServerToolCallCancellation .builder ().build ())
154+ .build ();
155+
156+ assertThat (GeminiLlmConnection .convertToServerResponse (message )).isEmpty ();
157+ }
158+
159+ @ Test
160+ public void convertToServerResponse_withSetupComplete_returnsEmptyOptional () {
161+ LiveServerMessage message =
162+ LiveServerMessage .builder ()
163+ .setupComplete (LiveServerSetupComplete .builder ().build ())
164+ .build ();
165+
166+ assertThat (GeminiLlmConnection .convertToServerResponse (message )).isEmpty ();
167+ }
168+
169+ @ Test
170+ public void convertToServerResponse_withUnknownMessage_returnsErrorResponse () {
171+ LiveServerMessage message = LiveServerMessage .builder ().build ();
172+
173+ LlmResponse response = GeminiLlmConnection .convertToServerResponse (message ).get ();
174+
175+ assertThat (response .errorCode ()).isPresent ();
176+ assertThat (response .errorMessage ()).hasValue ("Received unknown server message." );
177+ }
90178}
0 commit comments