From 617dfbf5ab7be1f02a3da1579f04b884061cb2df Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Wed, 16 Jul 2025 00:51:32 +0530 Subject: [PATCH 1/6] Fix: Add Input Validation for Task IDs in TaskManager --- src/a2a/server/tasks/task_manager.py | 3 +++ tests/server/tasks/test_task_manager.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/a2a/server/tasks/task_manager.py b/src/a2a/server/tasks/task_manager.py index 5474e155..7e632ab0 100644 --- a/src/a2a/server/tasks/task_manager.py +++ b/src/a2a/server/tasks/task_manager.py @@ -41,6 +41,9 @@ def __init__( initial_message: The `Message` that initiated the task, if any. Used when creating a new task object. """ + if task_id is not None and not isinstance(task_id, str) or task_id == "": + raise ValueError("Task ID must be a non-empty string") + self.task_id = task_id self.context_id = context_id self.task_store = task_store diff --git a/tests/server/tasks/test_task_manager.py b/tests/server/tasks/test_task_manager.py index 95297971..4041731d 100644 --- a/tests/server/tasks/test_task_manager.py +++ b/tests/server/tasks/test_task_manager.py @@ -45,6 +45,23 @@ def task_manager(mock_task_store: AsyncMock) -> TaskManager: ) +def test_task_manager_invalid_task_id(mock_task_store: AsyncMock): + with pytest.raises(ValueError): + TaskManager( + task_id="", + context_id="test_context", + task_store=mock_task_store, + initial_message=None, + ) + with pytest.raises(ValueError): + TaskManager( + task_id=123, + context_id="test_context", + task_store=mock_task_store, + initial_message=None, + ) + + @pytest.mark.asyncio async def test_get_task_existing( task_manager: TaskManager, mock_task_store: AsyncMock From f253ecda731c353328ad65f5fb3093dd58a7d87c Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind <73558583+pankaj-bind@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:57:34 +0530 Subject: [PATCH 2/6] Update src/a2a/server/tasks/task_manager.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/a2a/server/tasks/task_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/a2a/server/tasks/task_manager.py b/src/a2a/server/tasks/task_manager.py index 7e632ab0..13d658e2 100644 --- a/src/a2a/server/tasks/task_manager.py +++ b/src/a2a/server/tasks/task_manager.py @@ -41,7 +41,7 @@ def __init__( initial_message: The `Message` that initiated the task, if any. Used when creating a new task object. """ - if task_id is not None and not isinstance(task_id, str) or task_id == "": + if task_id is not None and not (isinstance(task_id, str) and task_id): raise ValueError("Task ID must be a non-empty string") self.task_id = task_id From 91a3f31bd15d098af7301a5b27af32bb8f3fc84a Mon Sep 17 00:00:00 2001 From: Holt Skinner Date: Tue, 15 Jul 2025 20:30:46 +0100 Subject: [PATCH 3/6] formatting --- src/a2a/server/tasks/task_manager.py | 2 +- tests/server/tasks/test_task_manager.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/a2a/server/tasks/task_manager.py b/src/a2a/server/tasks/task_manager.py index 13d658e2..cf763396 100644 --- a/src/a2a/server/tasks/task_manager.py +++ b/src/a2a/server/tasks/task_manager.py @@ -42,7 +42,7 @@ def __init__( Used when creating a new task object. """ if task_id is not None and not (isinstance(task_id, str) and task_id): - raise ValueError("Task ID must be a non-empty string") + raise ValueError('Task ID must be a non-empty string') self.task_id = task_id self.context_id = context_id diff --git a/tests/server/tasks/test_task_manager.py b/tests/server/tasks/test_task_manager.py index 4041731d..ec06622a 100644 --- a/tests/server/tasks/test_task_manager.py +++ b/tests/server/tasks/test_task_manager.py @@ -48,15 +48,15 @@ def task_manager(mock_task_store: AsyncMock) -> TaskManager: def test_task_manager_invalid_task_id(mock_task_store: AsyncMock): with pytest.raises(ValueError): TaskManager( - task_id="", - context_id="test_context", + task_id='', + context_id='test_context', task_store=mock_task_store, initial_message=None, ) with pytest.raises(ValueError): TaskManager( task_id=123, - context_id="test_context", + context_id='test_context', task_store=mock_task_store, initial_message=None, ) From f0f798c5decf5cfda4a3ebb6f340b63d5d5205df Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind <73558583+pankaj-bind@users.noreply.github.com> Date: Wed, 16 Jul 2025 01:12:11 +0530 Subject: [PATCH 4/6] Update test_task_manager.py --- tests/server/tasks/test_task_manager.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/server/tasks/test_task_manager.py b/tests/server/tasks/test_task_manager.py index ec06622a..7f658e07 100644 --- a/tests/server/tasks/test_task_manager.py +++ b/tests/server/tasks/test_task_manager.py @@ -45,18 +45,15 @@ def task_manager(mock_task_store: AsyncMock) -> TaskManager: ) -def test_task_manager_invalid_task_id(mock_task_store: AsyncMock): - with pytest.raises(ValueError): +@pytest.mark.parametrize("invalid_task_id", ["", 123]) +def test_task_manager_invalid_task_id( + mock_task_store: AsyncMock, invalid_task_id: Any +): + """Test that TaskManager raises ValueError for an invalid task_id.""" + with pytest.raises(ValueError, match=r"Task ID must be a non-empty string"): TaskManager( - task_id='', - context_id='test_context', - task_store=mock_task_store, - initial_message=None, - ) - with pytest.raises(ValueError): - TaskManager( - task_id=123, - context_id='test_context', + task_id=invalid_task_id, + context_id="test_context", task_store=mock_task_store, initial_message=None, ) From f03d5fffb36daad30d885e618c6627f0f1df8720 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind <73558583+pankaj-bind@users.noreply.github.com> Date: Wed, 16 Jul 2025 01:18:45 +0530 Subject: [PATCH 5/6] Update test_task_manager.py --- tests/server/tasks/test_task_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/server/tasks/test_task_manager.py b/tests/server/tasks/test_task_manager.py index 7f658e07..7123e519 100644 --- a/tests/server/tasks/test_task_manager.py +++ b/tests/server/tasks/test_task_manager.py @@ -53,7 +53,7 @@ def test_task_manager_invalid_task_id( with pytest.raises(ValueError, match=r"Task ID must be a non-empty string"): TaskManager( task_id=invalid_task_id, - context_id="test_context", + context_id='test_context', task_store=mock_task_store, initial_message=None, ) From 9a250780b82d90c49ff84f440c091ab71585a7c9 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind <73558583+pankaj-bind@users.noreply.github.com> Date: Wed, 16 Jul 2025 01:21:45 +0530 Subject: [PATCH 6/6] fix linting --- tests/server/tasks/test_task_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/server/tasks/test_task_manager.py b/tests/server/tasks/test_task_manager.py index 7123e519..0f32864b 100644 --- a/tests/server/tasks/test_task_manager.py +++ b/tests/server/tasks/test_task_manager.py @@ -45,12 +45,12 @@ def task_manager(mock_task_store: AsyncMock) -> TaskManager: ) -@pytest.mark.parametrize("invalid_task_id", ["", 123]) +@pytest.mark.parametrize('invalid_task_id', ['', 123]) def test_task_manager_invalid_task_id( mock_task_store: AsyncMock, invalid_task_id: Any ): """Test that TaskManager raises ValueError for an invalid task_id.""" - with pytest.raises(ValueError, match=r"Task ID must be a non-empty string"): + with pytest.raises(ValueError, match='Task ID must be a non-empty string'): TaskManager( task_id=invalid_task_id, context_id='test_context',