🚧 Under construction, come back soon! 🚧
THis is currently made and optimized to test RACK, (Stream Schedulers and User Message Interleaving)RFC-8260, and compatiblity testing with older clients
This project is a tool that tests Pion's SCTP implementations across revisions. It can:
- Test any Pion SCTP version or local checkout
- Simulate network conditions such as dynamic RTT, loss, and reordering
- Run cross-version compatibility and regression scenarios
Run the CLI directly with Go:
go run ./cmd/scp <command> [flags]Global flags:
--verboseenable verbose logging--dry-runshow actions without writing results
Resolve ref selectors into .scp/manifest.json and .scp/lock.json:
Selectors:
tag:v1.8.0branch:master(supports wildcards:branch:release/*)commit:deadbeefpr:1234path:/absolute/pathorpath:./relative/pathrange:>=1.9,<1.10(semver constraint, expands to matching tags)
Flags:
--refscomma-separated selector list (may repeat, or pass selectors as args)--reporepository URL to mirror (default:https://github.com/pion/sctp)--cachecache directory for mirrors and checkouts (default:.scp/cache)--include-preinclude prerelease tags when resolving ranges--out-manifestoutput path for manifest JSON (default:.scp/manifest.json)--out-lockoutput path for lock JSON (default:.scp/lock.json)--freeze-atRFC3339 timestamp to pin moving refs--local-allow-dirtypermit path selectors with local modifications
Refresh lock entries for floating selectors in the manifest:
go run ./cmd/scp update --manifest .scp/manifest.json --lock .scp/lock.jsonFlags:
--manifestpath to manifest.json--lockpath to lock.json to update--onlycomma-separated entry names to refresh--freeze-atRFC3339 timestamp to pin moving refs
Generate wrappers, runners, and harness code into generated/:
go run ./cmd/scp generate --lock .scp/lock.json --out generatedFlags:
--lockpath to lock.json--featurespath to features.yaml--outoutput directory for generated code--packagename of generated API package--runner-protorunner transport protocol (stdio-jsonorrpc)--modmodemodule resolve mode (remoteorlocal-cache)--licenseoptional license header file path--onlycomma-separated list of lock entries to generate
Run cross-revision scenarios (this generates and runs the harness under generated/):
go run ./cmd/scp test --lock .scp/lock.json --pairs matrix --cases max-burst --repeat 3Flags:
--lockpath to lock.json--pairspair selection mode:adjacent(default),latest-prev,matrix,explicit,self--includeinclude only these entries (comma-separated)--excludeexclude these entries (comma-separated)--explicitexplicit pairs when--pairs=explicit(comma-separatedA:B, use names from lock.json)--casesscenario IDs to run (comma-separated)--timeoutoverall timeout for each pair (default:2m)--seedbase seed (0 = default)--outpath to write JUnit XML results--out-dirdirectory to write run artifacts--interleavingoverride interleaving mode (auto,on,off)--pprof-cpupath to write CPU profile--pprof-heappath to write heap profile--pprof-allocspath to write allocs profile--repeatnumber of times to run each pair (>=1)
Scenario IDs (with default network profiles):
max-burst(default) — baseline burst with no induced delay/loss/reorderinghandshake— handshake-only scenario with baseline network settingsunordered-late-low-rtt— min delay 10ms, jitter 10ms, unordered, 0% lossunordered-late-high-rtt— min delay 180ms, jitter 60ms, unordered, 0% lossunordered-late-dynamic-rtt— min delay 40ms, jitter 180ms, unordered, 0% losscongestion— min delay 60ms, jitter 40ms, ordered, 2% lossretransmission— min delay 40ms, jitter 20ms, ordered, 5% lossreorder-low— min delay 15ms, jitter 25ms, unordered, 1.5% lossreorder-high— min delay 140ms, jitter 120ms, unordered, 2.5% lossburst-loss— min delay 50ms, jitter 50ms, unordered, 4% lossfragmentation— oversized payloads to trigger fragmentation/reassemblyinterleaving— oversized payloads with interleaving enabled (RFC 8260)media-hevc— one-way 4 Mbps RTP-like HEVC pattern with B-frames (3% loss)fault-checksum— corrupts every 7th data chunk checksum (negative case)fault-bad-chunk-len— corrupts every 7th data chunk length (negative case)fault-nonzero-padding— corrupts every 7th data chunk padding (negative case)
Examples:
go run ./cmd/scp resolve --refs "tag:v1.8.0,branch:master"
go run ./cmd/scp test --lock .scp/lock.jsongo run ./cmd/scp test --pairs explicit --explicit "branch_master_abcdef0:tag_v1_8_0_1234567"go run ./cmd/scp test --cases "congestion,retransmission" --out .scp/out/results.xml.scp/manifest.jsonresolved selector list.scp/lock.jsonpinned revisions.scp/cache/git mirrors and checkoutsgenerated/harness module and wrappers--outJUnit XML report--out-dirper-run artifacts (config.json, results.json, seed.txt, packets//iter.jsonl)--pprof-*optional CPU/heap/allocs profiles
Pion has an active community on the Discord.
Follow the Pion Bluesky or Pion Twitter for project updates and important WebRTC news.
We are always looking to support your projects. Please reach out if you have something to build! If you need commercial support or don't want to use public methods you can contact us at team@pion.ly
Check out the contributing wiki to join the group of amazing people making this project possible
MIT License - see LICENSE for full text