Testing and CI
Unit tests run two engines against each other in one process. Interop tests put qrtc against Chromium and OpenSSL. The full browser, SFU and Matrix matrix runs in tauri-plugin-webrtc, where a real page drives the engine.
Unit tests
cargo test --lib
| Area | Tests |
|---|---|
| JSEP | Section parsing, direction and msid rewrites, codec preference filtering, accepted fmtp edits, refused structural edits, glare rollback of the polite offer, explicit rollback, re-offer of an unchanged session |
| Data channels | Loopback between two engines |
| Media | Video both ways with msid; DTMF between engines |
| Audio | Opus round trip keeps a tone; unprocessed capture keeps its level; the echo canceller removes echo and does not inject the far end |
| STUN and TURN | Message integrity and fingerprint, XOR addresses, ChannelData, stream framing with padding, ICE server URLs |
| Post-quantum | DTLS between engines for every policy pair; every group agrees; malformed shares are refused; moduletto and RustCrypto ML-KEM decapsulate each other's output |
Interop tests
Chromium
cargo build --example stdio_peer
cd tests && npm ci && npx playwright-core install chromium && cd ..
node tests/chromium-interop.mjs
Headless Chromium and the stdio_peer example open data channels both ways. Each case also checks the DTLS group each side agreed:
| Case | Chromium | qrtc | Expected |
|---|---|---|---|
classical | Default | prefer | DTLS 1.2, no post-quantum group |
pq | DTLS 1.3 and post-quantum field trials | prefer | X25519MLKEM768, both offer directions |
pq-require | Same | require | X25519MLKEM768 |
require-fail | Default | require | No connection |
OpenSSL
node tests/pq-tls-interop.mjs pq-moduletto
node tests/pq-tls-interop.mjs pq-hybrid
The engine's TURN over TLS client connects to an OpenSSL 3.5 server (Node's TLS) that accepts only X25519MLKEM768.
CI
.github/workflows/ci.yml runs on every push and pull request, and weekly. Actions are pinned by commit.
| Job | What it checks |
|---|---|
| lint | rustfmt; clippy with warnings as errors on every feature set; rustdoc warnings |
| test | Unit tests and examples on x86_64 Linux, aarch64 Linux (moduletto's NEON path) and aarch64 macOS, each with the default, pure Rust and classical feature sets |
| windows | Unit tests on Windows; reported, not blocking, until verified |
| msrv | Builds with Rust 1.91 |
| pure-rust | The pure Rust build contains no crate that compiles C: no cc, cmake, bindgen, pkg-config, vcpkg, ring, aws-lc or openssl-sys |
| supply-chain | cargo-deny: RustSec advisories, licences, sources, bans |
| sbom | sbom/qrtc.cdx.json matches Cargo.lock |
| interop-openssl | Post-quantum TURN over TLS against OpenSSL 3.5, both ML-KEM backends |
| interop-chromium | The four Chromium cases above |
Releases
.github/workflows/release.yml runs on a v* tag. It checks that the tag matches the crate version, runs the tests, and builds the SBOM, the source archive and SHA-256 sums. It attests build provenance for them and attaches them to a GitHub release. Tags and commits are signed.
Consumer tests
tauri-plugin-webrtc runs qrtc inside WebKitGTK against Chromium, LiveKit with end-to-end encryption, matrix-js-sdk voice and video calls, and coturn over UDP, TCP and TLS. Its testing page lists those suites.