Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/google/adk/a2a/executor/a2a_agent_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
113 changes: 99 additions & 14 deletions tests/unittests/a2a/executor/test_a2a_agent_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading