QUIC Interop Runner Integration

February 20, 2026 · View on GitHub

This directory contains the integration for the QUIC Interop Runner.

Quick Start

Build Docker Images

# Build client image
docker build -t erlang-quic-client -f interop/Dockerfile.client .

# Build server image
docker build -t erlang-quic-server -f interop/Dockerfile.server .

Run Locally

# Run server
docker run -p 443:443/udp \
  -v $(pwd)/certs:/certs \
  -v $(pwd)/www:/www \
  -e TESTCASE=handshake \
  erlang-quic-server

# Run client
docker run \
  -e REQUESTS="https://host.docker.internal:443/test.txt" \
  -e TESTCASE=handshake \
  -e DOWNLOADS=/downloads \
  -v $(pwd)/downloads:/downloads \
  erlang-quic-client

Supported Test Cases

All core test cases pass:

Test CaseClientServerNotes
handshakeBasic QUIC handshake
transferFile download with flow control
retryRetry packet handling
keyupdateKey rotation during transfer
chacha20ChaCha20-Poly1305 only
multiconnectMultiple connections
v2QUIC v2 support
resumptionSession resumption with PSK
zerortt0-RTT early data
connectionmigrationActive path migration

Integration with Official Runner

To add erlang-quic to the official interop runner:

  1. Fork https://github.com/quic-interop/quic-interop-runner
  2. Add entry to implementations.json:
{
  "erlang-quic": {
    "name": "erlang-quic",
    "url": "https://github.com/benoitc/erlang_quic",
    "image": "erlang-quic"
  }
}
  1. Push Docker images to a registry (e.g., Docker Hub, GitHub Container Registry)
  2. Submit PR to the interop runner repository

Environment Variables

Client

  • REQUESTS - Space-separated list of URLs to download
  • TESTCASE - Test case name
  • DOWNLOADS - Directory for downloaded files
  • SSLKEYLOGFILE - Optional: Path for TLS key log

Server

  • TESTCASE - Test case name
  • PORT - Listen port (default: 443)
  • CERTS - Certificate directory (expects cert.pem, priv.key)
  • WWW - Directory to serve files from
  • SSLKEYLOGFILE - Optional: Path for TLS key log

Exit Codes

  • 0 - Success
  • 1 - Failure
  • 127 - Test case not supported

Local Testing

Run the local compliance tests:

rebar3 ct --suite=quic_client_compliance_SUITE

Run interop tests against aioquic:

# Start aioquic server
docker compose -f docker/docker-compose.yml up -d

# Run tests
rebar3 ct --suite=quic_interop_SUITE