From b763b69f406c65eb9179fd0c26ed1e819d15258c Mon Sep 17 00:00:00 2001 From: Zhoujie628 Date: Mon, 17 Aug 2026 14:54:55 +0800 Subject: [PATCH] test: add unit tests for A2ATransport header injection and AgentAuthManager - A2ATransportHeaderTest: verifies Authorization and A2A-Extensions headers are correctly forwarded to the client runtime via ClientCallContext - AgentAuthManagerTest: verifies credential loading from JSON file and graceful handling of missing config files - test-agent-credentials.json: test fixture for credential loading Signed-off-by: Zhoujie628 --- .../engine/client/A2ATransportHeaderTest.java | 106 ++++++++++++++++++ .../engine/client/AgentAuthManagerTest.java | 41 +++++++ .../resources/test-agent-credentials.json | 14 +++ 3 files changed, 161 insertions(+) create mode 100644 workflow-engine/src/test/java/dev/openan/workflow/engine/client/A2ATransportHeaderTest.java create mode 100644 workflow-engine/src/test/java/dev/openan/workflow/engine/client/AgentAuthManagerTest.java create mode 100644 workflow-engine/src/test/resources/test-agent-credentials.json diff --git a/workflow-engine/src/test/java/dev/openan/workflow/engine/client/A2ATransportHeaderTest.java b/workflow-engine/src/test/java/dev/openan/workflow/engine/client/A2ATransportHeaderTest.java new file mode 100644 index 00000000..5bc3f1f3 --- /dev/null +++ b/workflow-engine/src/test/java/dev/openan/workflow/engine/client/A2ATransportHeaderTest.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2026 Huawei Technologies Co., Ltd. + * All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.openan.workflow.engine.client; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.a2aproject.sdk.client.ClientEvent; +import org.a2aproject.sdk.client.transport.spi.interceptors.ClientCallContext; +import org.a2aproject.sdk.spec.AgentCard; +import org.a2aproject.sdk.spec.MessageSendParams; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +class A2ATransportHeaderTest { + + private static final String TASK_T_URI = + "https://projects.tmforum.org/a2aproject/telecommunication/extensions/Task-T/v1"; + + @Test + void forwardsAuthorizationAndActiveExtensionHeadersToRuntime() throws Exception { + AtomicReference> capturedHeaders = new AtomicReference<>(); + A2AJavaClientRuntime runtime = new CapturingRuntime(capturedHeaders); + AgentCard card = agentCard(); + WorkflowEngineClientConfig config = + WorkflowEngineClientConfig.builder() + .authProvider( + (agentName, ignored, headers) -> + headers.put("Authorization", "Bearer test-token")) + .build(); + + try (A2ATransport transport = new A2ATransport(List.of(card), runtime, config)) { + transport.send( + card, + card.name(), + "diagnose", + "context-1", + Map.of(TASK_T_URI, "structured task"), + null) + .join(); + } + + assertEquals("Bearer test-token", capturedHeaders.get().get("Authorization")); + assertEquals(TASK_T_URI, capturedHeaders.get().get("A2A-Extensions")); + } + + private static AgentCard agentCard() throws Exception { + String json = + """ + { + "name": "Test Agent", + "description": "test", + "version": "1.0", + "capabilities": { + "streaming": false, + "extensions": [ + {"uri": "%s", "required": false} + ] + }, + "defaultInputModes": ["text/plain"], + "defaultOutputModes": ["text/plain"], + "skills": [], + "supportedInterfaces": [ + { + "protocolBinding": "HTTP+JSON", + "protocolVersion": "1.0", + "url": "https://agent.example.test/a2a/json", + "tenant": "" + } + ] + } + """ + .formatted(TASK_T_URI); + return new ObjectMapper() + .registerModule(new AgentCardJacksonModule()) + .readValue(json, AgentCard.class); + } + + private record CapturingRuntime(AtomicReference> capturedHeaders) + implements A2AJavaClientRuntime { + + @Override + public Iterable sendMessage( + AgentCard agentCard, + MessageSendParams params, + ClientCallContext callContext, + Consumer eventSink, + Consumer logSink) { + capturedHeaders.set(Map.copyOf(callContext.getHeaders())); + return List.of(); + } + + @Override + public void close() {} + } +} diff --git a/workflow-engine/src/test/java/dev/openan/workflow/engine/client/AgentAuthManagerTest.java b/workflow-engine/src/test/java/dev/openan/workflow/engine/client/AgentAuthManagerTest.java new file mode 100644 index 00000000..8f7aba7b --- /dev/null +++ b/workflow-engine/src/test/java/dev/openan/workflow/engine/client/AgentAuthManagerTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2026 Huawei Technologies Co., Ltd. + * All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.openan.workflow.engine.client; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.junit.jupiter.api.Test; + +import java.net.URL; + +class AgentAuthManagerTest { + + @Test + void loadsCredentialsFromClasspathLocation() throws Exception { + URL resource = getClass().getClassLoader().getResource("test-agent-credentials.json"); + assertNotNull(resource, "test resource must exist on classpath"); + AgentAuthManager manager = new AgentAuthManager(resource.getPath()); + + var config = manager.getConfig("Test Agent"); + + assertNotNull(config); + assertEquals( + "https://auth.example.test/token", + config.get("bearerAuth").get("login_url")); + } + + @Test + void missingFileDoesNotCreateCredentials() { + AgentAuthManager manager = + new AgentAuthManager("/nonexistent/missing-agent-credentials.json"); + + assertNull(manager.getConfig("Test Agent")); + } +} diff --git a/workflow-engine/src/test/resources/test-agent-credentials.json b/workflow-engine/src/test/resources/test-agent-credentials.json new file mode 100644 index 00000000..c394ae7a --- /dev/null +++ b/workflow-engine/src/test/resources/test-agent-credentials.json @@ -0,0 +1,14 @@ +{ + "Test Agent": { + "bearerAuth": { + "login_url": "https://auth.example.test/token", + "method": "POST", + "request_fields": { + "username": "demo", + "password": "placeholder" + }, + "token_field": "access_token", + "token_ttl": 3600 + } + } +}