Skip to content

Commit cb4caec

Browse files
add WebTransport test specification
1 parent fc3b7e8 commit cb4caec

File tree

3 files changed

+164
-66
lines changed

3 files changed

+164
-66
lines changed

README.md

Lines changed: 46 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,90 @@
11
# Interop Test Runner
22

3-
The Interop Test Runner aims to automatically generate an interop matrix by running multiple **test cases** using different QUIC implementations.
3+
The Interop Test Runner automatically generates interoperability matrices by running test cases across different implementations. It currently supports two protocols:
4+
5+
* **[QUIC](quic.md)**
6+
* **[WebTransport](webtransport.md)**
7+
8+
Registered implementations and their Docker images are listed in [implementations_quic.json](implementations_quic.json) and [implementations_webtransport.json](implementations_webtransport.json).
9+
10+
Live results are published at [interop.seemann.io](https://interop.seemann.io/).
11+
12+
## Publications
413

514
* Research Article: [Automating QUIC Interoperability Testing](https://dl.acm.org/doi/10.1145/3405796.3405826)
615
* IETF Blog Post: [Automating interoperability testing to improve open standards for the Internet](https://www.ietf.org/blog/quic-automated-interop-testing/)
716

817
## Requirements
918

10-
The Interop Runner is written in Python 3. You'll need to install the
11-
following softwares to run the interop test:
19+
The Interop Runner is written in Python 3. You'll need:
1220

13-
* Python3 modules. Run the following command:
21+
* Python 3 modules:
1422

15-
```bash
16-
pip3 install -r requirements.txt
17-
```
23+
```bash
24+
pip3 install -r requirements.txt
25+
```
1826

1927
* [Docker](https://docs.docker.com/engine/install/) and [docker compose](https://docs.docker.com/compose/).
20-
21-
* [Development version of Wireshark](https://www.wireshark.org/download.html) (version 4.5.0 or newer).
28+
* [Wireshark](https://www.wireshark.org/download.html) (version 4.5.0 or newer).
2229

2330
## Running the Interop Runner
2431

25-
Run the interop tests:
32+
Run the QUIC interop tests:
2633

2734
```bash
2835
python3 run.py
2936
```
3037

31-
## IPv6 support
32-
33-
To enable IPv6 support for the simulator on Linux, the `ip6table_filter` kernel module needs to be loaded on the host. If it isn't loaded on your machine, you'll need to run `sudo modprobe ip6table_filter`.
38+
Run WebTransport interop tests:
3439

35-
## Building a QUIC endpoint
40+
```bash
41+
python3 run.py -p webtransport
42+
```
3643

37-
To include your QUIC implementation in the Interop Runner, create a Docker image following the instructions for [setting up an endpoint in the quic-network-simulator](https://github.com/quic-interop/quic-network-simulator), publish it on [Docker Hub](https://hub.docker.com) and add it to [implementations.json](implementations.json). Once your implementation is ready to interop, please send us a PR with this addition. Read on for more instructions on what to do within the Docker image.
44+
Use `-s` and `-c` to select specific server and client implementations, and `-t` to select specific test cases:
3845

39-
Typically, a test case will require a server to serve files from a directory, and a client to download files. Different test cases will specify the behavior to be tested. For example, the Retry test case expects the server to use a Retry before accepting the connection from the client. All configuration information from the test framework to your implementation is fed into the Docker image using environment variables. The test case is passed into your Docker container using the `TESTCASE` environment variable. If your implementation doesn't support a test case, it MUST exit with status code 127. This will allow us to add new test cases in the future, and correctly report test failures und successes, even if some implementations have not yet implented support for this new test case.
46+
```bash
47+
python3 run.py -s quic-go -c ngtcp2 -t handshake,transfer
48+
```
4049

41-
The Interop Runner mounts the directory `/www` into your server Docker container. This directory will contain one or more randomly generated files. Your server implementation is expected to run on port 443 and serve files from this directory.
42-
Equivalently, the Interop Runner mounts `/downloads` into your client Docker container. The directory is initially empty, and your client implementation is expected to store downloaded files into this directory. The URLs of the files to download are passed to the client using the environment variable `REQUESTS`, which contains one or more URLs, separated by a space.
50+
## Building an Endpoint
4351

44-
After the transfer is completed, the client container is expected to exit with exit status 0. If an error occurred during the transfer, the client is expected to exit with exit status 1.
45-
After completion of the test case, the Interop Runner will verify that the client downloaded the files it was expected to transfer, and that the file contents match. Additionally, for certain test cases, the Interop Runner will use the pcap of the transfer to verify that the implementations fulfilled the requirements of the test (for example, for the Retry test case, the pcap should show that a Retry packet was sent, and that the client used the Token provided in that packet).
52+
Each implementation is packaged as a Docker image. The test runner communicates with implementations entirely through environment variables and mounted directories.
4653

47-
The Interop Runner generates a key and a certificate chain and mounts it into `/certs`. The server needs to load its private key from `priv.key`, and the certificate chain from `cert.pem`.
54+
The test case is passed using the `TESTCASE` environment variable. If your implementation doesn't support a test case, it MUST exit with status code 127. This allows new test cases to be added without breaking existing implementations.
4855

49-
### Examples
56+
See [quic.md](quic.md) and [webtransport.md](webtransport.md) for protocol-specific setup instructions and test case definitions.
5057

51-
If you're not familiar with Docker, it might be helpful to have a look at the Dockerfiles and scripts that other implementations use:
58+
To add your implementation, create a Docker image following the instructions for [setting up an endpoint in the quic-network-simulator](https://github.com/quic-interop/quic-network-simulator), publish it on [Docker Hub](https://hub.docker.com) and add it to [implementations_quic.json](implementations_quic.json) or [implementations_webtransport.json](implementations_webtransport.json). Once your implementation is ready to interop, please send us a PR with this addition.
5259

53-
* quic-go: [Dockerfile](https://github.com/quic-go/quic-go/blob/master/interop/Dockerfile), [run_endpoint.sh](https://github.com/quic-go/quic-go/blob/master/interop/run_endpoint.sh) and [CI config](https://github.com/quic-go/quic-go/blob/master/.github/workflows/build-interop-docker.yml)
54-
* quicly: [Dockerfile](https://github.com/h2o/quicly/blob/master/misc/quic-interop-runner/Dockerfile) and [run_endpoint.sh](https://github.com/h2o/quicly/blob/master/misc/quic-interop-runner/run_endpoint.sh) and [run_endpoint.sh](https://github.com/cloudflare/quiche/blob/master/tools/qns/run_endpoint.sh)
55-
* quiche: [Dockerfile](https://github.com/cloudflare/quiche/blob/master/Dockerfile)
56-
* neqo: [Dockerfile](https://github.com/mozilla/neqo/blob/main/qns/Dockerfile) and [interop.sh](https://github.com/mozilla/neqo/blob/main/qns/interop.sh)
57-
* msquic: [Dockerfile](https://github.com/microsoft/msquic/blob/master/Dockerfile), [run_endpoint.sh](https://github.com/microsoft/msquic/blob/master/scripts/run_endpoint.sh) and [CI config](https://github.com/microsoft/msquic/blob/master/.azure/azure-pipelines.docker.yml)
60+
### Multi-Platform Builds
5861

59-
Implementers: Please feel free to add links to your implementation here!
62+
The [online interop runner](https://interop.seemann.io/) requires `linux/amd64` images. If you build on a different architecture (e.g. Apple silicon), use `--platform linux/amd64` with `docker build`.
6063

61-
Note that the [online interop](https://interop.seemann.io/) runner requires `linux/amd64` architecture, so if you build on a different architecture (e.g. "Apple silicon"), you would need to use `--platform linux/amd64` with `docker build` to create a compatible image.
62-
Even better, and the recommended approach, is to use a multi-platform build to provide both `amd64` and `arm64` images, so everybody can run the interop locally with your implementation. To build the multi-platform image, you can use the `docker buildx` command:
64+
The recommended approach is a multi-platform build providing both `amd64` and `arm64` images:
6365

6466
```bash
6567
docker buildx create --use
6668
docker buildx build --pull --push --platform linux/amd64,linux/arm64 -t <name:tag> .
6769
```
6870

69-
## Logs
70-
71-
To facilitate debugging, the Interop Runner saves the log files to the logs directory. This directory is overwritten every time the Interop Runner is executed.
72-
73-
The log files are saved to a directory named `#server_#client/#testcase`. `output.txt` contains the console output of the interop test runner (which might contain information why a test case failed). The server and client logs are saved in the `server` and `client` directory, respectively. The `sim` directory contains pcaps recorded by the simulator.
71+
## IPv6 Support
7472

75-
If implementations wish to export the TLS secrets, they are encouraged to do so in the format in the [NSS Key Log format](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format). The interop runner sets the SSLKEYLOGFILE environment variable to a file in the logs directory. In the future, the interop runner might use those files to decode the traces.
73+
To enable IPv6 support for the simulator on Linux, the `ip6table_filter` kernel module needs to be loaded on the host:
7674

77-
Implementations that implement [qlog](https://github.com/quiclog/internet-drafts) should export the log files to the directory specified by the `QLOGDIR` environment variable.
78-
79-
## Test cases
80-
81-
The Interop Runner implements the following test cases. Unless noted otherwise, test cases use HTTP/0.9 for file transfers. More test cases will be added in the future, to test more protocol features. The name in parentheses is the value of the `TESTCASE` environment variable passed into your Docker container.
82-
83-
* **Version Negotiation** (`versionnegotiation`): Tests that a server sends a Version Negotiation packet in response to an unknown QUIC version number. The client should start a connection using an unsupported version number (it can use a reserved version number to do so), and should abort the connection attempt when receiving the Version Negotiation packet.
84-
Currently disabled due to #20.
85-
86-
* **Handshake** (`handshake`): Tests the successful completion of the handshake. The client is expected to establish a single QUIC connection to the server and download one or multiple small files. Servers should not send a Retry packet in this test case.
87-
88-
* **Transfer** (`transfer`): Tests both flow control and stream multiplexing. The client should use small initial flow control windows for both stream- and connection-level flow control, such that the during the transfer of files on the order of 1 MB the flow control window needs to be increased. The client is exepcted to establish a single QUIC connection, and use multiple streams to concurrently download the files.
89-
90-
* **ChaCha20** (`chacha20`): In this test, client and server are expected to offer **only** ChaCha20 as a ciphersuite. The client then downloads the files.
91-
92-
* **KeyUpdate** (`keyupdate`, only for the client): The client is expected to make sure that a key update happens early in the connection (during the first MB transferred). It doesn't matter which peer actually initiated the update.
93-
94-
* **Retry** (`retry`): Tests that the server can generate a Retry, and that the client can act upon it (i.e. use the Token provided in the Retry packet in the Initial packet).
95-
96-
* **Resumption** (`resumption`): Tests QUIC session resumption (without 0-RTT). The client is expected to establish a connection and download the first file. The server is expected to provide the client with a session ticket that allows it to resume the connection. After downloading the first file, the client has to close the connection, establish a resumed connection using the session ticket, and use this connection to download the remaining file(s).
97-
98-
* **0-RTT** (`zerortt`): Tests QUIC 0-RTT. The client is expected to establish a connection and download the first file. The server is expected to provide the client with a session ticket that allows it establish a 0-RTT connection on the next connection attempt. After downloading the first file, the client has to close the connection, establish and request the remaining file(s) in 0-RTT.
99-
100-
* **HTTP3** (`http3`): Tests a simple HTTP/3 connection. The client is expected to download multiple files using HTTP/3. Files should be requested and transfered in parallel.
75+
```bash
76+
sudo modprobe ip6table_filter
77+
```
10178

102-
* **Handshake Loss** (`multiconnect`): Tests resilience of the handshake to high loss. The client is expected to establish multiple connections, sequential or in parallel, and use each connection to download a single file.
79+
## Logs
10380

104-
* **V2** (`v2`): In this test, client starts connecting server in QUIC v1 with `version_information` transport parameter that includes QUIC v2 (`0x6b3343cf`) in `other_versions` field. Server should select QUIC v2 in compatible version negotiation. Client is expected to download one small file in QUIC v2.
81+
The Interop Runner saves log files to the `logs` directory (overwritten on each run).
10582

106-
* **Port Rebinding** (`rebind-port`): In this test case, a NAT is simulated that changes the client port (as observed by the server) after the handshake. Server should perform path vaildation.
83+
Log files are organized as `<server>_<client>/<testcase>/`. Each directory contains:
84+
* `output.txt` — console output from the test runner (including failure reasons).
85+
* `server/` and `client/` — server and client log files.
86+
* `sim/` — pcaps recorded by the simulator.
10787

108-
* **Address Rebinding** (`rebind-addr`): In this test case, a NAT is simulated that changes the client IP address (as observed by the server) after the handshake. Server should perform path vaildation.
88+
Implementations that export TLS secrets should use the [NSS Key Log format](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format). The `SSLKEYLOGFILE` environment variable points to a file in the logs directory.
10989

110-
* **Connection Migratioon** (`connectionmigration`): In this test case, the server is expected to provide its preferred addresses to the client during the handshake. The client is expected to perform active migration to one of those addresses.
90+
Implementations that support [qlog](https://github.com/quiclog/internet-drafts) should export log files to the directory specified by the `QLOGDIR` environment variable.

0 commit comments

Comments
 (0)