From c2f7445c74950fce4c755a5b4cc4a72839e29329 Mon Sep 17 00:00:00 2001 From: Vinayak Doifode Date: Fri, 17 Jul 2026 01:34:12 +0530 Subject: [PATCH 1/2] fix(a2a): forward get_session_config in _prepare_session() --- src/google/adk/a2a/executor/a2a_agent_executor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/google/adk/a2a/executor/a2a_agent_executor.py b/src/google/adk/a2a/executor/a2a_agent_executor.py index 11303a8e3a..01f3f9a7d4 100644 --- a/src/google/adk/a2a/executor/a2a_agent_executor.py +++ b/src/google/adk/a2a/executor/a2a_agent_executor.py @@ -317,10 +317,14 @@ async def _prepare_session( session_id = run_request.session_id # create a new session if not exists user_id = run_request.user_id + get_session_config = None + if run_request.run_config: + get_session_config = run_request.run_config.get_session_config session = await runner.session_service.get_session( app_name=runner.app_name, user_id=user_id, session_id=session_id, + config=get_session_config, ) if session is None: session = await runner.session_service.create_session( From 0bcce31c21286f2faf74e0e9f93ac910cf6f5484 Mon Sep 17 00:00:00 2001 From: Vinayak Doifode Date: Fri, 17 Jul 2026 01:37:17 +0530 Subject: [PATCH 2/2] test(a2a): add tests for get_session_config forwarding Add 3 unit tests to verify _prepare_session() forwards get_session_config: - test_prepare_session_passes_get_session_config - test_prepare_session_none_run_config - test_prepare_session_no_get_session_config Also update existing tests to use RunConfig() instances instead of Mock(spec=RunConfig) which doesn't expose Pydantic v2 fields. --- .../a2a/executor/test_a2a_agent_executor.py | 113 +++++++++++++++--- 1 file changed, 99 insertions(+), 14 deletions(-) diff --git a/tests/unittests/a2a/executor/test_a2a_agent_executor.py b/tests/unittests/a2a/executor/test_a2a_agent_executor.py index c5e0b13d82..c2866e6c96 100644 --- a/tests/unittests/a2a/executor/test_a2a_agent_executor.py +++ b/tests/unittests/a2a/executor/test_a2a_agent_executor.py @@ -30,6 +30,7 @@ from google.adk.events.event import Event from google.adk.runners import RunConfig from google.adk.runners import Runner +from google.adk.sessions.base_session_service import GetSessionConfig from google.genai.types import Content import pytest @@ -133,7 +134,7 @@ async def test_execute_success_new_task(self): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service mock_session = Mock() @@ -235,7 +236,7 @@ async def test_execute_new_task_enqueues_leading_task_on_v1(self): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) mock_session = Mock() mock_session.id = "test-session" @@ -300,7 +301,7 @@ async def test_execute_existing_task(self): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -364,7 +365,7 @@ async def test_prepare_session_new_session(self): user_id="test-user", session_id=None, new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -392,7 +393,7 @@ async def test_prepare_session_existing_session(self): user_id="test-user", session_id="existing-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -411,6 +412,90 @@ async def test_prepare_session_existing_session(self): assert result == mock_session self.mock_runner.session_service.create_session.assert_not_called() + @pytest.mark.asyncio + async def test_prepare_session_passes_get_session_config(self): + """Test that _prepare_session forwards get_session_config to get_session.""" + session_config = GetSessionConfig(num_recent_events=10) + run_config = RunConfig(get_session_config=session_config) + run_args = AgentRunRequest( + user_id="test-user", + session_id="existing-session", + new_message=Mock(spec=Content), + run_config=run_config, + ) + + mock_session = Mock() + mock_session.id = "existing-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + await self.executor._prepare_session( + self.mock_context, run_args, self.mock_runner + ) + + self.mock_runner.session_service.get_session.assert_called_once_with( + app_name=self.mock_runner.app_name, + user_id="test-user", + session_id="existing-session", + config=session_config, + ) + + @pytest.mark.asyncio + async def test_prepare_session_none_run_config(self): + """Test that _prepare_session handles run_config=None gracefully.""" + run_args = AgentRunRequest( + user_id="test-user", + session_id="existing-session", + new_message=Mock(spec=Content), + run_config=None, + ) + + mock_session = Mock() + mock_session.id = "existing-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + await self.executor._prepare_session( + self.mock_context, run_args, self.mock_runner + ) + + self.mock_runner.session_service.get_session.assert_called_once_with( + app_name=self.mock_runner.app_name, + user_id="test-user", + session_id="existing-session", + config=None, + ) + + @pytest.mark.asyncio + async def test_prepare_session_no_get_session_config(self): + """Test that _prepare_session passes config=None when get_session_config is not set.""" + run_config = RunConfig() + run_args = AgentRunRequest( + user_id="test-user", + session_id="existing-session", + new_message=Mock(spec=Content), + run_config=run_config, + ) + + mock_session = Mock() + mock_session.id = "existing-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + await self.executor._prepare_session( + self.mock_context, run_args, self.mock_runner + ) + + self.mock_runner.session_service.get_session.assert_called_once_with( + app_name=self.mock_runner.app_name, + user_id="test-user", + session_id="existing-session", + config=None, + ) + def test_constructor_with_callable_runner(self): """Test constructor with callable runner.""" callable_runner = Mock() @@ -536,7 +621,7 @@ def create_runner(): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -595,7 +680,7 @@ async def create_runner(): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -652,7 +737,7 @@ async def test_handle_request_integration(self): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -794,7 +879,7 @@ async def test_handle_request_with_aggregator_message(self): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -865,7 +950,7 @@ async def test_handle_request_with_non_working_aggregator_state(self): user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -939,7 +1024,7 @@ async def test_handle_request_with_working_state_publishes_artifact_and_complete user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -1027,7 +1112,7 @@ async def test_handle_request_with_non_working_state_publishes_status_only( user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service @@ -1104,7 +1189,7 @@ async def test_after_event_interceptors_receive_correct_arguments_and_can_modify user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Setup Interceptor @@ -1210,7 +1295,7 @@ async def test_handle_request_preserves_metadata_in_final_events( user_id="test-user", session_id="test-session", new_message=Mock(spec=Content), - run_config=Mock(spec=RunConfig), + run_config=RunConfig(), ) # Mock session service