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
38 changes: 38 additions & 0 deletions .github/workflows/test-integrations.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ on:
required: false
default: true
type: boolean
skip_a2a_test:
description: "Skip A2A Rust-Go interoperability tests"
required: false
default: false
type: boolean
run_agentic_apps_test:
description: "Run agentic apps tests"
required: false
Expand Down Expand Up @@ -177,6 +182,38 @@ jobs:
with:
artifact-name: "directory-test-result"

run-tests-a2a:
if: ${{ github.event_name != 'workflow_dispatch' || !inputs.skip_a2a_test }}
runs-on: ubuntu-latest

permissions:
contents: "read"

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Environment
uses: ./.github/actions/setup-env
with:
go: true
go-version: "1.24.4"

- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Run A2A interoperability tests
run: task integrations:a2a:test:rust-go
shell: bash

- name: Create artifact from integrations test reports
uses: ./.github/actions/create-artifact
with:
artifact-name: "a2a-rust-go-test-result"
path-to-archive: "./integrations/agntcy-a2a/reports/*"

run-agentic-apps:
if: ${{ inputs.run_agentic_apps_test }}
runs-on: ubuntu-latest
Expand Down Expand Up @@ -208,6 +245,7 @@ jobs:
[
run-tests-slim-topology,
run-tests-directory,
run-tests-a2a,
]
if: ${{ always() }}
runs-on: ubuntu-latest
Expand Down
48 changes: 45 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- [Integration tests](#integration-tests)
- [Directory structure](#directory-structure)
- [Running tests](#running-tests)
- [A2A interoperability smoke tests](#a2a-interoperability-smoke-tests)
- [Running tests using GitHub actions](#running-tests-using-github-actions)
- [How to extend tests with your own test](#how-to-extend-tests-with-your-own-test)
- [Updating the agntcy/dir testdata](#updating-the-agntcydir-testdata)
Expand All @@ -31,6 +32,10 @@ csit
│   ├── go.sum
│   └── Taskfile.yml
├── integrations # Integration tests
│   ├── agntcy-a2a # Integration tests for Rust/Go A2A interoperability
│   │   ├── fixtures
│   │   ├── Taskfile.yml # Tasks for A2A interoperability tests
│   │   └── tests
│   ├── agntcy-slim # Integration tests for [agntcy/slim](https://github.com/agntcy/slim)
│   │   ├── agentic-apps
│   │   ├── Taskfile.yml # Tasks for Slim integration tests
Expand Down Expand Up @@ -63,6 +68,12 @@ The following tasks are defined:
task: Available tasks for this project:
* benchmarks:directory:test: All ADS benchmark test
* benchmarks:slim:test: All Slim benchmark test
* integrations:a2a:test: All A2A interoperability tests
* integrations:a2a:test:rust-go:jsonrpc: Rust and Go JSON-RPC interoperability smoke test
* integrations:a2a:test:rust-go:jsonrpc:go-go: Go client to Go server JSON-RPC interoperability test
* integrations:a2a:test:rust-go:jsonrpc:go-rust: Go client to Rust server JSON-RPC interoperability test
* integrations:a2a:test:rust-go:jsonrpc:rust-go: Rust client to Go server JSON-RPC interoperability test
* integrations:a2a:test:rust-go:jsonrpc:rust-rust: Rust client to Rust server JSON-RPC interoperability test
* integrations:apps:download:wfsm-bin: Get wfsm binary from GitHub
* integrations:apps:get-marketing-campaign-cfgs: Populate marketing campaign config file
* integrations:apps:init-submodules: Initialize submodules
Expand Down Expand Up @@ -136,9 +147,12 @@ environment, deploying the components that will be tested, and running the tests
## Running tests

We can launch tests using taskfile locally or in GitHub actions.
Running locally we need to create a test cluster and deploy the test env on
it before running the tests.
It requires the following tools to be installed on local machine:
Some suites are self-contained and run directly on the host, while others need
a Kubernetes-based test environment.

Suites that deploy components on Kubernetes require creating a test cluster and
deploying the test environment before running the tests.
They require the following tools to be installed on the local machine:
- [Taskfile](https://taskfile.dev/installation/)
- [Go](https://go.dev/doc/install)
- [Docker](https://docs.docker.com/get-started/get-docker/)
Expand All @@ -162,6 +176,34 @@ After we finish the tests we can destroy the test cluster
task integratons:kind:destroy
```

## A2A interoperability smoke tests

The `integrations/agntcy-a2a` suite is self-contained and does not require a
Kind cluster, Helm, or repository sibling checkouts. It builds and runs small
Go and Rust JSON-RPC fixtures locally to exercise this matrix:

- Go client -> Go server
- Go client -> Rust server
- Rust client -> Go server
- Rust client -> Rust server

To run it from the repository root you need:

- [Taskfile](https://taskfile.dev/installation/)
- [Go](https://go.dev/doc/install)
- [Rust and Cargo](https://www.rust-lang.org/tools/install)

```bash
task integrations:a2a:test
task integrations:a2a:test:rust-go:jsonrpc
task integrations:a2a:test:rust-go:jsonrpc:go-go
task integrations:a2a:test:rust-go:jsonrpc:go-rust
task integrations:a2a:test:rust-go:jsonrpc:rust-go
task integrations:a2a:test:rust-go:jsonrpc:rust-rust
```

The suite writes Ginkgo JSON and JUnit reports under `integrations/agntcy-a2a/reports/`.


## Running tests using GitHub actions

Expand Down
5 changes: 5 additions & 0 deletions integrations/Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ version: '3'
silent: true

includes:
a2a:
taskfile: ./agntcy-a2a/Taskfile.yml
dir: ./agntcy-a2a
excludes: [ default ]

slim:
taskfile: ./agntcy-slim/Taskfile.yml
dir: ./agntcy-slim
Expand Down
4 changes: 4 additions & 0 deletions integrations/agntcy-a2a/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fixtures/rust/target/
reports/
!fixtures/rust/src/bin/
!fixtures/rust/src/bin/*.rs
94 changes: 94 additions & 0 deletions integrations/agntcy-a2a/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# A2A Interoperability CSIT

This component hosts cross-SDK A2A interoperability checks.

The current slice covers Rust and Go across the released JSON-RPC, HTTP+JSON, and gRPC bindings.

All 12 Rust/Go client-server legs in the current core lifecycle matrix are green across JSON-RPC, HTTP+JSON, and gRPC.

The released Rust fixture now exposes push-config CRUD. CSIT validates that path from the Rust client across all three transports and from the Go client against Rust-server targets across JSON-RPC, HTTP+JSON, and gRPC.

The Go fixture still models the current unsupported push-config behavior, and the Rust-probe scenarios keep validating that negative path against Go-server targets.

Across the matrix, the scenarios validate the same core interoperability behavior:

- unary and streaming `SendMessage`
- lifecycle methods across `GetTask`, `ListTasks`, and `CancelTask`
- negative-path error semantics for missing and non-cancelable tasks
- successful push-config CRUD on the Rust-server paths across all three transports and unsupported push-config errors against the Go fixture where exercised
- preservation of a mixed text plus structured-data request payload and message metadata through task history

The fixtures are intentionally small and deterministic so the suite can run the same way locally and in CI without depending on sibling SDK checkouts.

Each scenario is tagged with a dedicated Ginkgo label and exposed through a matching Task target so the full matrix and each individual leg can be run independently.

The gRPC legs follow the same agent-card discovery path as the other transports: each fixture serves `/.well-known/agent-card.json` over HTTP and advertises a separate gRPC transport endpoint from that card.

## Matrix

| Transport | Label | Scenario | Current outcome | Component task | Repository task |
| --- | --- | --- | --- | --- | --- |
| JSON-RPC | `go-go` | Go client -> Go server | Pass | `task test:rust-go:jsonrpc:go-go` | `task integrations:a2a:test:rust-go:jsonrpc:go-go` |
| JSON-RPC | `go-rust` | Go client -> Rust server | Pass | `task test:rust-go:jsonrpc:go-rust` | `task integrations:a2a:test:rust-go:jsonrpc:go-rust` |
| JSON-RPC | `rust-go` | Rust client -> Go server | Pass | `task test:rust-go:jsonrpc:rust-go` | `task integrations:a2a:test:rust-go:jsonrpc:rust-go` |
| JSON-RPC | `rust-rust` | Rust client -> Rust server | Pass | `task test:rust-go:jsonrpc:rust-rust` | `task integrations:a2a:test:rust-go:jsonrpc:rust-rust` |
| HTTP+JSON | `go-go` | Go client -> Go server | Pass | `task test:rust-go:rest:go-go` | `task integrations:a2a:test:rust-go:rest:go-go` |
| HTTP+JSON | `go-rust` | Go client -> Rust server | Pass | `task test:rust-go:rest:go-rust` | `task integrations:a2a:test:rust-go:rest:go-rust` |
| HTTP+JSON | `rust-go` | Rust client -> Go server | Pass | `task test:rust-go:rest:rust-go` | `task integrations:a2a:test:rust-go:rest:rust-go` |
| HTTP+JSON | `rust-rust` | Rust client -> Rust server | Pass | `task test:rust-go:rest:rust-rust` | `task integrations:a2a:test:rust-go:rest:rust-rust` |
| gRPC | `go-go` | Go client -> Go server | Pass | `task test:rust-go:grpc:go-go` | `task integrations:a2a:test:rust-go:grpc:go-go` |
| gRPC | `go-rust` | Go client -> Rust server | Pass | `task test:rust-go:grpc:go-rust` | `task integrations:a2a:test:rust-go:grpc:go-rust` |
| gRPC | `rust-go` | Rust client -> Go server | Pass | `task test:rust-go:grpc:rust-go` | `task integrations:a2a:test:rust-go:grpc:rust-go` |
| gRPC | `rust-rust` | Rust client -> Rust server | Pass | `task test:rust-go:grpc:rust-rust` | `task integrations:a2a:test:rust-go:grpc:rust-rust` |

## Running the Suite

From `integrations/agntcy-a2a/`:

```sh
task test
task test:rust-go
task test:rust-go:jsonrpc
task test:rust-go:rest
task test:rust-go:grpc
task test:rust-go:jsonrpc:go-go
task test:rust-go:jsonrpc:go-rust
task test:rust-go:jsonrpc:rust-go
task test:rust-go:jsonrpc:rust-rust
task test:rust-go:rest:go-go
task test:rust-go:rest:go-rust
task test:rust-go:rest:rust-go
task test:rust-go:rest:rust-rust
task test:rust-go:grpc:go-go
task test:rust-go:grpc:go-rust
task test:rust-go:grpc:rust-go
task test:rust-go:grpc:rust-rust
```

`task test` is an alias for the full `task test:rust-go` transport matrix run.

From the repository root:

```sh
task integrations:a2a:test
task integrations:a2a:test:rust-go
task integrations:a2a:test:rust-go:jsonrpc
task integrations:a2a:test:rust-go:rest
task integrations:a2a:test:rust-go:grpc
task integrations:a2a:test:rust-go:jsonrpc:go-go
task integrations:a2a:test:rust-go:jsonrpc:go-rust
task integrations:a2a:test:rust-go:jsonrpc:rust-go
task integrations:a2a:test:rust-go:jsonrpc:rust-rust
task integrations:a2a:test:rust-go:rest:go-go
task integrations:a2a:test:rust-go:rest:go-rust
task integrations:a2a:test:rust-go:rest:rust-go
task integrations:a2a:test:rust-go:rest:rust-rust
task integrations:a2a:test:rust-go:grpc:go-go
task integrations:a2a:test:rust-go:grpc:go-rust
task integrations:a2a:test:rust-go:grpc:rust-go
task integrations:a2a:test:rust-go:grpc:rust-rust
```

`task integrations:a2a:test` is the repository-level alias for the same full matrix run.

Each run writes Ginkgo JSON and JUnit reports under `integrations/agntcy-a2a/reports/`. The full transport matrix emits `report-agntcy-a2a.{json,xml}`, the transport-scoped tasks emit `report-agntcy-a2a-jsonrpc.{json,xml}`, `report-agntcy-a2a-rest.{json,xml}`, and `report-agntcy-a2a-grpc.{json,xml}`, and the per-case tasks emit scenario-specific report names via `-ginkgo.label-filter`.
Loading
Loading