Conversation
Signed-off-by: Dave Grantham <dwg@linuxprogrammer.org>
|
This is a draft PR that I'm working on to make this test suite something that can run natively on Linux, macOS, and Windows (WSL). I got the initial set of errors fixed. Remaining Tasks:
|
|
@K-21 I'm working on making the test scripts work on linux, macos, and windows (wsl). I don't have the capacity to test on windows and would like some help. I'll be focusing entirely on linux + macos functionality. |
Hi @dhuseby, it works in arch linux ./run.sh --test-ignore '~failing' --force-image-rebuild --debug
╲ Collecting results...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ Results:
→ Total: 70
✓ Passed: 70
✗ Failed: 0
→ Total time: 00:01:48
✓ All tests passed!PR 790 is about cross-platform support for Linux, macOS, and WSL (Windows Subsystem for Linux). Here's what it does: Main Changes1. New
|
|
@dhuseby : This looks really solid — thank you for pushing this through, Dave. 🙌 Wish to share a few callouts/ highlights that stood out positively from this PR:
Given:
I’m comfortable with this going in as a first pass. The remaining tasks are well-bounded and can iterate in follow-up PRs without blocking this foundational improvement. From a community + contributor experience standpoint, this materially improves the repo. Happy to see this merged and built on. 🚀 |
|
Current /srv/cache default breaks local development on Windows/WSL (permission denied). Proposed fix: Also need to update: GitHub workflows: Files affected: ~15-20 (1 core + workflows/actions + docs) |
|
@K-21 : This is a great catch — thanks for flagging it. The /srv/cache default causing permission issues on Windows/WSL makes sense, and the proposed move to a project-local cache feels like the right, cross-platform fix. Would you be open to opening a follow-up PR to address this? Updating lib-common-init.sh along with the workflows and docs sounds well-scoped, and it would nicely complement the work already landed in this PR. Happy to help review or coordinate if needed. |
|
@seetadev not yet |
Signed-off-by: Dave Grantham <dwg@linuxprogrammer.org>
|
@K-21 I changed the CACHE_DIR default to ${TEST_ROOT}/.cache as you suggested. That's a great fix, thank you! Will you test this one out on WSL and reply back here with the exact steps to get everything running. I'd like to write three docs I also updated all uses of BTW, I was able to get the tests to execute correctly on an M1Pro MBP running macOS Tahoe 26.2. Here's my steps if anybody wants to follow along. I need to put this in a
|
|
@K-21 I also chose NOT to update the github workflows since those get run on Linux machines that have 1TB of NVME v4 storage mounted at /srv/cache. I want the cache to be re-used across tests and test runs. Thoughts? |
|
Just confirmed this latest version of the PR runs on Linux unmodified. That's 2/3. @K-21 can you confirm Windows? |
Signed-off-by: Dave Grantham <dwg@linuxprogrammer.org>
| println | ||
| exit 0 | ||
| fi | ||
|
|
It seems that it works in windows 11 + wsl + Ubuntu sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo usermod -aG docker $USER
sudo service docker start
docker ps
transport works. ╲ Running tests... (8 workers)
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ [1/131] rust-v0.56 x rust-v0.56 (tcp, noise, yamux)...[SUCCESS]
→ [7/131] rust-v0.56 x rust-v0.56 (ws, tls, yamux)...[SUCCESS]
→ [3/131] rust-v0.56 x rust-v0.56 (tcp, tls, yamux)...[SUCCESS]
→ [6/131] rust-v0.56 x rust-v0.56 (ws, noise, mplex)...[SUCCESS]
→ [4/131] rust-v0.56 x rust-v0.56 (tcp, tls, mplex)...[SUCCESS]
→ [2/131] rust-v0.56 x rust-v0.56 (tcp, noise, mplex)...[SUCCESS]
→ [5/131] rust-v0.56 x rust-v0.56 (ws, noise, yamux)...[SUCCESS]
→ [8/131] rust-v0.56 x rust-v0.56 (ws, tls, mplex)...[SUCCESS]
→ [9/131] rust-v0.56 x rust-v0.56 (quic-v1)...[SUCCESS]
→ [10/131] rust-v0.56 x rust-v0.56 (webrtc-direct)...[SUCCESS]
→ [12/131] rust-v0.56 x python-v0.x (tcp, noise, mplex)...[SUCCESS]
→ [11/131] rust-v0.56 x python-v0.x (tcp, noise, yamux)...[SUCCESS]
→ [13/131] rust-v0.56 x python-v0.x (tcp, tls, yamux)...[SUCCESS]
→ [14/131] rust-v0.56 x python-v0.x (tcp, tls, mplex)...[SUCCESS]
→ [15/131] rust-v0.56 x python-v0.x (ws, noise, yamux)...[SUCCESS]
→ [16/131] rust-v0.56 x python-v0.x (ws, noise, mplex)...[SUCCESS]
→ [17/131] rust-v0.56 x python-v0.x (ws, tls, yamux)...[SUCCESS]
→ [18/131] rust-v0.56 x python-v0.x (ws, tls, mplex)...[SUCCESS]
→ [19/131] rust-v0.56 x python-v0.x (quic-v1)...[SUCCESS]
→ [20/131] rust-v0.56 x js-v1.x (tcp, noise, yamux)...[SUCCESS]
→ [21/131] rust-v0.56 x js-v1.x (tcp, noise, mplex)...[SUCCESS]
→ [23/131] rust-v0.56 x js-v1.x (ws, noise, mplex)...[SUCCESS]
→ [22/131] rust-v0.56 x js-v1.x (ws, noise, yamux)...[SUCCESS]
→ [25/131] rust-v0.56 x js-v2.x (tcp, noise, mplex)...[SUCCESS]
→ [24/131] rust-v0.56 x js-v2.x (tcp, noise, yamux)...[SUCCESS]
→ [26/131] rust-v0.56 x js-v2.x (ws, noise, yamux)...[SUCCESS]
→ [27/131] rust-v0.56 x js-v2.x (ws, noise, mplex)...[SUCCESS]
→ [34/131] python-v0.x x rust-v0.56 (tcp, tls, yamux)...[SUCCESS]
→ [32/131] python-v0.x x rust-v0.56 (tcp, noise, yamux)...[SUCCESS]
→ [33/131] python-v0.x x rust-v0.56 (tcp, noise, mplex)...[SUCCESS]
→ [30/131] rust-v0.56 x js-v3.x (ws, noise, yamux)...[SUCCESS]
→ [31/131] rust-v0.56 x js-v3.x (ws, noise, mplex)...[SUCCESS]
→ [29/131] rust-v0.56 x js-v3.x (tcp, noise, mplex)...[SUCCESS]
→ [28/131] rust-v0.56 x js-v3.x (tcp, noise, yamux)...[SUCCESS]
→ [35/131] python-v0.x x rust-v0.56 (tcp, tls, mplex)...[SUCCESS]
→ [36/131] python-v0.x x rust-v0.56 (ws, noise, yamux)...[SUCCESS]
→ [37/131] python-v0.x x rust-v0.56 (ws, noise, mplex)...[SUCCESS]
→ [39/131] python-v0.x x rust-v0.56 (ws, tls, mplex)...[SUCCESS]
→ [41/131] python-v0.x x python-v0.x (tcp, noise, yamux)...[SUCCESS]
→ [42/131] python-v0.x x python-v0.x (tcp, noise, mplex)...[SUCCESS]
→ [38/131] python-v0.x x rust-v0.56 (ws, tls, yamux)...[SUCCESS]
→ [40/131] python-v0.x x rust-v0.56 (quic-v1)...[SUCCESS]
→ [43/131] python-v0.x x python-v0.x (tcp, tls, yamux)...[SUCCESS]
→ [44/131] python-v0.x x python-v0.x (tcp, tls, mplex)...[SUCCESS]
→ [45/131] python-v0.x x python-v0.x (wss, noise, yamux)...[SUCCESS]
→ [46/131] python-v0.x x python-v0.x (wss, noise, mplex)...[SUCCESS]
→ [48/131] python-v0.x x python-v0.x (wss, tls, mplex)...[SUCCESS]
→ [47/131] python-v0.x x python-v0.x (wss, tls, yamux)...[SUCCESS]
→ [49/131] python-v0.x x python-v0.x (ws, noise, yamux)...[SUCCESS]
→ [50/131] python-v0.x x python-v0.x (ws, noise, mplex)...[SUCCESS]
→ [52/131] python-v0.x x python-v0.x (ws, tls, mplex)...[SUCCESS]
→ [51/131] python-v0.x x python-v0.x (ws, tls, yamux)...[SUCCESS]
→ [53/131] python-v0.x x python-v0.x (quic-v1)...[SUCCESS]
→ [54/131] python-v0.x x js-v1.x (tcp, noise, yamux)...[SUCCESS]
→ [57/131] python-v0.x x js-v1.x (ws, noise, mplex)...[SUCCESS]
→ [56/131] python-v0.x x js-v1.x (ws, noise, yamux)...[SUCCESS]
→ [55/131] python-v0.x x js-v1.x (tcp, noise, mplex)...[SUCCESS]
→ [58/131] python-v0.x x js-v2.x (tcp, noise, yamux)...[SUCCESS]
→ [60/131] python-v0.x x js-v2.x (ws, noise, yamux)...[SUCCESS]
→ [59/131] python-v0.x x js-v2.x (tcp, noise, mplex)...[SUCCESS]
→ [62/131] python-v0.x x js-v3.x (tcp, noise, yamux)...[SUCCESS]
→ [61/131] python-v0.x x js-v2.x (ws, noise, mplex)...[SUCCESS]
→ [63/131] python-v0.x x js-v3.x (tcp, noise, mplex)...[SUCCESS]
→ [64/131] python-v0.x x js-v3.x (ws, noise, yamux)...[SUCCESS]
→ [65/131] python-v0.x x js-v3.x (ws, noise, mplex)...[SUCCESS]
→ [66/131] js-v1.x x rust-v0.56 (tcp, noise, yamux)...[SUCCESS]
→ [67/131] js-v1.x x rust-v0.56 (tcp, noise, mplex)...[SUCCESS]
→ [68/131] js-v1.x x rust-v0.56 (ws, noise, yamux)...[SUCCESS]
→ [70/131] js-v1.x x python-v0.x (tcp, noise, yamux)...[SUCCESS]
→ [69/131] js-v1.x x rust-v0.56 (ws, noise, mplex)...[SUCCESS]
→ [71/131] js-v1.x x python-v0.x (tcp, noise, mplex)...[SUCCESS]
→ [73/131] js-v1.x x python-v0.x (wss, noise, mplex)...[SUCCESS]
→ [72/131] js-v1.x x python-v0.x (wss, noise, yamux)...[SUCCESS]
→ [74/131] js-v1.x x python-v0.x (ws, noise, yamux)...[SUCCESS]
→ [75/131] js-v1.x x python-v0.x (ws, noise, mplex)...[SUCCESS]
→ [76/131] js-v1.x x js-v1.x (tcp, noise, yamux)...[SUCCESS]
→ [77/131] js-v1.x x js-v1.x (tcp, noise, mplex)...[SUCCESS]
→ [78/131] js-v1.x x js-v1.x (ws, noise, yamux)...[SUCCESS]
→ [79/131] js-v1.x x js-v1.x (ws, noise, mplex)...[SUCCESS]
→ [82/131] js-v1.x x js-v2.x (ws, noise, yamux)...[SUCCESS]
→ [80/131] js-v1.x x js-v2.x (tcp, noise, yamux)...[SUCCESS]
→ [81/131] js-v1.x x js-v2.x (tcp, noise, mplex)...[SUCCESS]
→ [83/131] js-v1.x x js-v2.x (ws, noise, mplex)...[SUCCESS]
→ [84/131] js-v1.x x js-v3.x (tcp, noise, yamux)...[SUCCESS]
→ [85/131] js-v1.x x js-v3.x (tcp, noise, mplex)...[SUCCESS]
→ [86/131] js-v1.x x js-v3.x (ws, noise, yamux)...[SUCCESS]
→ [87/131] js-v1.x x js-v3.x (ws, noise, mplex)...[SUCCESS]
→ [88/131] js-v2.x x rust-v0.56 (tcp, noise, yamux)...[SUCCESS]
→ [89/131] js-v2.x x rust-v0.56 (tcp, noise, mplex)...[SUCCESS]
→ [90/131] js-v2.x x rust-v0.56 (ws, noise, yamux)...[SUCCESS]
→ [91/131] js-v2.x x rust-v0.56 (ws, noise, mplex)...[SUCCESS]
→ [92/131] js-v2.x x python-v0.x (tcp, noise, yamux)...[SUCCESS]
→ [93/131] js-v2.x x python-v0.x (tcp, noise, mplex)...[SUCCESS]
→ [94/131] js-v2.x x python-v0.x (wss, noise, yamux)...[SUCCESS]
→ [95/131] js-v2.x x python-v0.x (wss, noise, mplex)...[SUCCESS]
→ [96/131] js-v2.x x python-v0.x (ws, noise, yamux)...[SUCCESS]
→ [97/131] js-v2.x x python-v0.x (ws, noise, mplex)...[SUCCESS]
→ [98/131] js-v2.x x js-v1.x (tcp, noise, yamux)...[SUCCESS]
→ [100/131] js-v2.x x js-v1.x (ws, noise, yamux)...[SUCCESS]
→ [99/131] js-v2.x x js-v1.x (tcp, noise, mplex)...[SUCCESS]
→ [101/131] js-v2.x x js-v1.x (ws, noise, mplex)...[SUCCESS]
→ [102/131] js-v2.x x js-v2.x (tcp, noise, yamux)...[SUCCESS]
→ [103/131] js-v2.x x js-v2.x (tcp, noise, mplex)...[SUCCESS]
→ [104/131] js-v2.x x js-v2.x (ws, noise, yamux)...[SUCCESS]
→ [105/131] js-v2.x x js-v2.x (ws, noise, mplex)...[SUCCESS]
→ [106/131] js-v2.x x js-v3.x (tcp, noise, yamux)...[SUCCESS]
→ [107/131] js-v2.x x js-v3.x (tcp, noise, mplex)...[SUCCESS]
→ [109/131] js-v2.x x js-v3.x (ws, noise, mplex)...[SUCCESS]
→ [108/131] js-v2.x x js-v3.x (ws, noise, yamux)...[SUCCESS]
→ [110/131] js-v3.x x rust-v0.56 (tcp, noise, yamux)...[SUCCESS]
→ [111/131] js-v3.x x rust-v0.56 (tcp, noise, mplex)...[SUCCESS]
→ [112/131] js-v3.x x rust-v0.56 (ws, noise, yamux)...[SUCCESS]
→ [113/131] js-v3.x x rust-v0.56 (ws, noise, mplex)...[SUCCESS]
→ [114/131] js-v3.x x python-v0.x (tcp, noise, yamux)...[SUCCESS]
→ [115/131] js-v3.x x python-v0.x (tcp, noise, mplex)...[SUCCESS]
→ [116/131] js-v3.x x python-v0.x (wss, noise, yamux)...[SUCCESS]
→ [117/131] js-v3.x x python-v0.x (wss, noise, mplex)...[SUCCESS]
→ [118/131] js-v3.x x python-v0.x (ws, noise, yamux)...[SUCCESS]
→ [119/131] js-v3.x x python-v0.x (ws, noise, mplex)...[SUCCESS]
→ [120/131] js-v3.x x js-v1.x (tcp, noise, yamux)...[SUCCESS]
→ [121/131] js-v3.x x js-v1.x (tcp, noise, mplex)...[SUCCESS]
→ [122/131] js-v3.x x js-v1.x (ws, noise, yamux)...[SUCCESS]
→ [123/131] js-v3.x x js-v1.x (ws, noise, mplex)...[SUCCESS]
→ [124/131] js-v3.x x js-v2.x (tcp, noise, yamux)...[SUCCESS]
→ [126/131] js-v3.x x js-v2.x (ws, noise, yamux)...[SUCCESS]
→ [125/131] js-v3.x x js-v2.x (tcp, noise, mplex)...[SUCCESS]
→ [127/131] js-v3.x x js-v2.x (ws, noise, mplex)...[SUCCESS]
→ [128/131] js-v3.x x js-v3.x (tcp, noise, yamux)...[SUCCESS]
→ [129/131] js-v3.x x js-v3.x (tcp, noise, mplex)...[SUCCESS]
→ [130/131] js-v3.x x js-v3.x (ws, noise, yamux)...[SUCCESS]
→ [131/131] js-v3.x x js-v3.x (ws, noise, mplex)...[SUCCESS]
╲ Stopping global services...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ Stopping Redis...stopped
✓ Network removed: transport-network
✓ Global services stopped
╲ Collecting results...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ Results:
→ Total: 131
✓ Passed: 131
✗ Failed: 0
→ Total time: 00:15:38
✓ All tests passed!
╲ Generating results dashboard...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
✓ Generated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/results.yaml
✓ Generated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/LATEST_TEST_RESULTS.md
✓ Generated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/results.md
✓ Generated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/results.html
✓ Dashboard generation completeperf also ✓ All images built successfully
╲ Staring global services...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
✓ Created network: perf-network
→ Starting Redis...Unable to find image 'redis:7-alpine' locally
7-alpine: Pulling from library/redis
d75b3becd998: Pull complete
c70aae7b5e0d: Pull complete
232f7549c9b0: Pull complete
380e8aa8b1fd: Pull complete
60c57c0072ef: Pull complete
4f4fb700ef54: Pull complete
fc4343b4accd: Pull complete
f637881d1138: Pull complete
95050f4fb536: Download complete
5f8375faf7cb: Download complete
Digest: sha256:ee64a64eaab618d88051c3ade8f6352d11531fcf79d9a4818b9b183d8c1d18ba
Status: Downloaded newer image for redis:7-alpine
started
✓ Global services ready
╲ Running baseline tests... (1 worker)
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ [1/3] https x https (https)...[SUCCESS]
→ [2/3] quic-go x quic-go (quic)...[SUCCESS]
→ [3/3] iperf x iperf (tcp)...[SUCCESS]
╲ Running tests... (1 worker)
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ [1/9] rust-v0.56 x rust-v0.56 (tcp, noise, yamux)...[SUCCESS]
→ [2/9] rust-v0.56 x rust-v0.56 (tcp, noise, mplex)...[SUCCESS]
→ [3/9] rust-v0.56 x rust-v0.56 (tcp, tls, yamux)...[SUCCESS]
→ [4/9] rust-v0.56 x rust-v0.56 (tcp, tls, mplex)...[SUCCESS]
→ [5/9] rust-v0.56 x rust-v0.56 (ws, noise, yamux)...[SUCCESS]
→ [6/9] rust-v0.56 x rust-v0.56 (ws, noise, mplex)...[SUCCESS]
→ [7/9] rust-v0.56 x rust-v0.56 (ws, tls, yamux)...[SUCCESS]
→ [8/9] rust-v0.56 x rust-v0.56 (ws, tls, mplex)...[SUCCESS]
→ [9/9] rust-v0.56 x rust-v0.56 (quic-v1)...[SUCCESS]
╲ Stopping global services...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ Stopping Redis...stopped
✓ Network removed: perf-network
✓ Global services stopped
╲ Collecting results...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ Results:
→ Total: 12 (3 baseline + 9 main)
✓ Passed: 12
✗ Failed: 0
→ Total time: 00:17:03
✓ All tests passed!
╲ Generating results dashboard...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
✓ Generated ./.cache/test-run/perf-738539db-045806-27-01-2026/results.yaml
✓ Generated ./.cache/test-run/perf-738539db-045806-27-01-2026/LATEST_TEST_RESULTS.md
✓ Generated ./.cache/test-run/perf-738539db-045806-27-01-2026/results.md
✓ Generated ./.cache/test-run/perf-738539db-045806-27-01-2026/results.html
✓ Dashboard generation complete
╲ Generating box plots...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
→ Found 3 baseline results and 9 test results
→ Extracting upload data...
→ Extracting download data...
→ Extracting latency data...
→ Generating plots with gnuplot...
✓ Generated boxplot-upload.png
✓ Generated boxplot-download.png
✓ Generated boxplot-latency.png
✓ Box plot generation complete |
|
@acul71 I just confirmed this works on wsl with the Debian image installed. I think we can safely merge this. |
This is the first pass at truly supporting running this on linux, macos, and wsl.
Why? Well, this test framework generates snapshots that contain all data, including docker images, needed to replicate any given test pass run on CI/CD. If the framework scripts run on linux, macos, and wsl, then any developer can grab the snapshot artifact, unpack it, and just run
./run.shin their terminal to recreate the test locally. This is designed to drastically increase developer velocity when it comes to debugging and profiling libp2p protocols.Signed-off-by: Dave Grantham dwg@linuxprogrammer.org