# Week 20 — Update
## TL;DR
Started upstreaming QUIC interop support for `eth-p2p-z` into the libp2p test ecosystem by adding a new interop target to the `libp2p/test-plans` repository. This makes it possible to run automated QUIC interoperability tests between `eth-p2p-z` and other libp2p implementations.
PR: https://github.com/libp2p/test-plans/pull/694
---
## Test plan behavior
- Add `eth-p2p-z` as a QUIC-capable libp2p node type in the test plans:
- Uses the same interface/contract as other language implementations (go, rust, js, etc.).
- Hooks into the existing QUIC topology and round-trip tests.
- Ensure the new target can:
- Participate as both dialer and listener in QUIC connections.
- Exchange basic ping-style traffic and protocol messages as required by the test cases.
- Cleanly open/close connections and streams so the harness can assert success/failure.
- Align CLI / configuration shape with existing runners so the harness can:
- Control listen addresses and ports.
- Toggle transports (enable QUIC, optionally disable others).
- Pass in test-case-specific parameters if needed.
---
## Per-node configuration & invariants
For each `eth-p2p-z` node launched by the test harness:
- Configuration surface:
- `--listen-addr` / `--multiaddr`: specifies QUIC listen endpoint.
- `--peer-id` / key configuration: deterministic identity for reproducible tests.
- `--enable-quic`: explicit transport flag (where applicable).
- Optional knobs for logging / debug to help inspect interop failures.
- Invariants within the test environment:
- Node must be able to start and reach “ready” state within a bounded time (startup timeout).
- Node must expose its observed multiaddrs back to the harness so other peers can dial it.
- When the test harness requests shutdown, the node must terminate cleanly (no hanging processes).
- Exit codes are meaningful:
- `0`: test-run success from the node’s perspective.
- Non-zero: indicates failure that the harness can surface.
---
## Internal APIs / harness integration
On the `libp2p/test-plans` side, the PR wires an `eth-p2p-z` runner into the existing test framework:
- `eth_p2p_z.spawn(config) -> NodeHandle`
- Spawns an `eth-p2p-z` binary/container with the proper flags for QUIC interop.
- Waits until the node is reachable on the configured multiaddr.
- `eth_p2p_z.get_multiaddrs(handle) -> [Multiaddr]`
- Returns the addresses to be used by other nodes in the test plan.
- `eth_p2p_z.stop(handle)`
- Sends a shutdown signal and waits for clean termination.
These entry points are then plugged into existing QUIC-focused test scenarios, so `eth-p2p-z` can be used as:
- A dialer against other libp2p QUIC implementations.
- A listener that other implementations connect to for handshake/stream tests.
---
## Example pseudocode
```pseudo
function setup_eth_p2p_z_node(role, config):
args = [
"--listen-addr", config.listen_addr,
"--enable-quic",
"--peer-key", config.key_path,
]
if role == "dialer":
args.append("--dial-target")
args.append(config.target_multiaddr)
handle = spawn_process("eth-p2p-z", args)
wait_until_ready(handle, timeout=config.startup_timeout)
return handle
function run_quic_interop_scenario():
listener = setup_eth_p2p_z_node("listener", listener_config)
listener_addrs = get_multiaddrs(listener)
dialer = setup_other_impl_node("dialer", target=listener_addrs)
run_quic_roundtrip_test(dialer, listener)
stop_node(dialer)
stop_node(listener)
```
---
## Next
- Iterate on the `eth-p2p-z` test target based on feedback from libp2p maintainers and interop runs.
---
## References
- PR: https://github.com/libp2p/test-plans/pull/694