From 3c4420aecddc6f191bd64ab732e5bcadda6e82c3 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Tue, 3 Feb 2026 10:26:12 -0800 Subject: [PATCH] refactor: BaseAgent: Apply Java style, fix a unit test, add a unit test PiperOrigin-RevId: 864938809 --- .../java/com/google/adk/agents/BaseAgent.java | 2 +- .../com/google/adk/agents/BaseAgentTest.java | 20 +++++++++ .../com/google/adk/testing/TestCallback.java | 41 +++++++++++++------ 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/google/adk/agents/BaseAgent.java b/core/src/main/java/com/google/adk/agents/BaseAgent.java index 646072537..255d59c4d 100644 --- a/core/src/main/java/com/google/adk/agents/BaseAgent.java +++ b/core/src/main/java/com/google/adk/agents/BaseAgent.java @@ -76,7 +76,7 @@ public abstract class BaseAgent { public BaseAgent( String name, String description, - List subAgents, + @Nullable List subAgents, @Nullable List beforeAgentCallback, @Nullable List afterAgentCallback) { this.name = name; diff --git a/core/src/test/java/com/google/adk/agents/BaseAgentTest.java b/core/src/test/java/com/google/adk/agents/BaseAgentTest.java index 2ae53d0e1..dec66a77c 100644 --- a/core/src/test/java/com/google/adk/agents/BaseAgentTest.java +++ b/core/src/test/java/com/google/adk/agents/BaseAgentTest.java @@ -316,4 +316,24 @@ public void canonicalCallbacks_returnsListWhenPresent() { assertThat(agent.canonicalBeforeAgentCallbacks()).containsExactly(bc); assertThat(agent.canonicalAfterAgentCallbacks()).containsExactly(ac); } + + @Test + public void runLive_invokesRunLiveImpl() { + var runLiveCallback = TestCallback.returningEmpty(); + Content runLiveImplContent = Content.fromParts(Part.fromText("live_output")); + TestBaseAgent agent = + new TestBaseAgent( + TEST_AGENT_NAME, + TEST_AGENT_DESCRIPTION, + /* beforeAgentCallbacks= */ ImmutableList.of(), + /* afterAgentCallbacks= */ ImmutableList.of(), + runLiveCallback.asRunLiveImplSupplier(runLiveImplContent)); + InvocationContext invocationContext = TestUtils.createInvocationContext(agent); + + List results = agent.runLive(invocationContext).toList().blockingGet(); + + assertThat(results).hasSize(1); + assertThat(results.get(0).content()).hasValue(runLiveImplContent); + assertThat(runLiveCallback.wasCalled()).isTrue(); + } } diff --git a/core/src/test/java/com/google/adk/testing/TestCallback.java b/core/src/test/java/com/google/adk/testing/TestCallback.java index 04f83ed9b..434d85e6f 100644 --- a/core/src/test/java/com/google/adk/testing/TestCallback.java +++ b/core/src/test/java/com/google/adk/testing/TestCallback.java @@ -102,63 +102,80 @@ public Supplier> asRunAsyncImplSupplier(String contentText) { return asRunAsyncImplSupplier(Content.fromParts(Part.fromText(contentText))); } + /** + * Returns a {@link Supplier} that marks this callback as called and returns a {@link Flowable} + * with an event containing the given content. + */ + public Supplier> asRunLiveImplSupplier(Content content) { + return () -> + Flowable.defer( + () -> { + markAsCalled(); + return Flowable.just(Event.builder().content(content).build()); + }); + } + @SuppressWarnings("unchecked") // This cast is safe if T is Content. public BeforeAgentCallback asBeforeAgentCallback() { - return ctx -> (Maybe) callMaybe(); + return (unusedCtx) -> (Maybe) callMaybe(); } @SuppressWarnings("unchecked") // This cast is safe if T is Content. public BeforeAgentCallbackSync asBeforeAgentCallbackSync() { - return ctx -> (Optional) callOptional(); + return (unusedCtx) -> (Optional) callOptional(); } @SuppressWarnings("unchecked") // This cast is safe if T is Content. public AfterAgentCallback asAfterAgentCallback() { - return ctx -> (Maybe) callMaybe(); + return (unusedCtx) -> (Maybe) callMaybe(); } @SuppressWarnings("unchecked") // This cast is safe if T is Content. public AfterAgentCallbackSync asAfterAgentCallbackSync() { - return ctx -> (Optional) callOptional(); + return (unusedCtx) -> (Optional) callOptional(); } @SuppressWarnings("unchecked") // This cast is safe if T is LlmResponse. public BeforeModelCallback asBeforeModelCallback() { - return (ctx, req) -> (Maybe) callMaybe(); + return (unusedCtx, unusedReq) -> (Maybe) callMaybe(); } @SuppressWarnings("unchecked") // This cast is safe if T is LlmResponse. public BeforeModelCallbackSync asBeforeModelCallbackSync() { - return (ctx, req) -> (Optional) callOptional(); + return (unusedCtx, unusedReq) -> (Optional) callOptional(); } @SuppressWarnings("unchecked") // This cast is safe if T is LlmResponse. public AfterModelCallback asAfterModelCallback() { - return (ctx, res) -> (Maybe) callMaybe(); + return (unusedCtx, unusedRes) -> (Maybe) callMaybe(); } @SuppressWarnings("unchecked") // This cast is safe if T is LlmResponse. public AfterModelCallbackSync asAfterModelCallbackSync() { - return (ctx, res) -> (Optional) callOptional(); + return (unusedCtx, unusedRes) -> (Optional) callOptional(); } @SuppressWarnings("unchecked") // This cast is safe if T is Map. public BeforeToolCallback asBeforeToolCallback() { - return (invCtx, tool, toolArgs, toolCtx) -> (Maybe>) callMaybe(); + return (unusedCtx, unusedTool, unusedToolArgs, unusedToolCtx) -> + (Maybe>) callMaybe(); } @SuppressWarnings("unchecked") // This cast is safe if T is Map. public BeforeToolCallbackSync asBeforeToolCallbackSync() { - return (invCtx, tool, toolArgs, toolCtx) -> (Optional>) callOptional(); + return (unusedCtx, unusedTool, unusedToolArgs, unusedToolCtx) -> + (Optional>) callOptional(); } @SuppressWarnings("unchecked") // This cast is safe if T is Map. public AfterToolCallback asAfterToolCallback() { - return (invCtx, tool, toolArgs, toolCtx, res) -> (Maybe>) callMaybe(); + return (unusedCtx, unusedTool, unusedToolArgs, unusedToolCtx, unusedRes) -> + (Maybe>) callMaybe(); } @SuppressWarnings("unchecked") // This cast is safe if T is Map. public AfterToolCallbackSync asAfterToolCallbackSync() { - return (invCtx, tool, toolArgs, toolCtx, res) -> (Optional>) callOptional(); + return (unusedCtx, unusedTool, unusedToolArgs, unusedToolCtx, unusedRes) -> + (Optional>) callOptional(); } }