niom-turn/docs/testing.md

61 lines
2.0 KiB
Markdown

# Testing
This project is structured so the most important TURN paths can be exercised via **unit and integration tests**.
## Quick start
- All tests: `cargo test`
- Less output: `cargo test -q`
- With logs (examples):
- `RUST_LOG=warn,niom_turn=info cargo test -- --nocapture`
Note: integration tests initialise `tracing` via helpers in `tests/support`.
## What is covered?
### STUN RFC-Interop (FINGERPRINT)
- Unit tests verify that the server appends `FINGERPRINT` to responses and that CRC32/XOR validation fails when the message is tampered with.
See: unit tests in [src/stun.rs](../src/stun.rs).
### STUN RFC-Interop (MESSAGE-INTEGRITY)
- Unit tests verify `MESSAGE-INTEGRITY` validation (including the “MI + trailing FINGERPRINT” case).
- UDP integration tests verify that responses after successful authentication contain `MESSAGE-INTEGRITY` and are verifiable.
### UDP (turn:)
- Auth challenge (401 + NONCE) and successful allocate
- Refresh with `LIFETIME=0` releases the allocation
- CreatePermission + Send → peer receives UDP payload via the relay
See: `tests/udp_turn.rs` and the topic folders under `tests/`.
### TLS (turns:) / stream-based data plane
- Allocate/Refresh over the TLS stream
- Data-plane return path peer→client over the same TLS stream (Data Indication or ChannelData)
See: `tests/tls_turn.rs` and `tests/tls_data_plane.rs`.
### TCP (turn:?transport=tcp) / stream-based data plane
- Allocate/CreatePermission/Send over TCP
- Peer→client return path as STUN Data Indication over TCP
- ChannelBind + ChannelData in both directions
See: `tests/tcp_turn.rs`.
## Test helpers
- STUN/TURN builder: `tests/support/stun_builders.rs`
- Stream framing (STUN + ChannelData over TCP/TLS): `tests/support/stream.rs`
- TLS test certs: `tests/support/tls.rs`
## Expansion ideas (useful next coverage)
- Split reads/writes (frames spanning multiple TCP reads) as regression tests
- IPv6 encode/decode tests for XOR-ADDRESS variants
- Negative tests: peer not permitted, channel without binding, allocation timeout