Skip to content

first pass at linux+macos+wsl support#790

Merged
dhuseby merged 7 commits intomasterfrom
dhuseby/feature/linux-macos-wsl-support
Jan 27, 2026
Merged

first pass at linux+macos+wsl support#790
dhuseby merged 7 commits intomasterfrom
dhuseby/feature/linux-macos-wsl-support

Conversation

@dhuseby
Copy link
Contributor

@dhuseby dhuseby commented Jan 24, 2026

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.sh in 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

Signed-off-by: Dave Grantham <dwg@linuxprogrammer.org>
@dhuseby dhuseby requested review from acul71, pacrob and seetadev January 24, 2026 02:18
@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 24, 2026

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:

  • Create a QUICKSTART.md file in the root that has the copy-paste commands for setting up Linux, macOS, and WSL with the correct versions of the dependencies.
  • Fix the patches/Dockerfiles in this repo to be responsive to the new HOST_OS environment variable so that it runs the correct build commands to build for linux/arm64 when on Apple Silicon
  • Test test test...then test again.

@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 24, 2026

@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.

@acul71
Copy link
Contributor

acul71 commented Jan 25, 2026

@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 --debugCollecting results...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  → Results:
    → Total: 70Passed: 70Failed: 0Total time: 00:01:48All tests passed!

PR 790 is about cross-platform support for Linux, macOS, and WSL (Windows Subsystem for Linux). Here's what it does:

Main Changes

1. New lib-host-os.sh library (66 lines)

Adds OS detection and cross-platform helper functions:

  • detect_host_os() - Detects if running on Linux, macOS, or WSL
  • format_timestamp() - Cross-platform timestamp formatting (macOS uses -r flag, Linux uses -d)
  • get_cpu_count() - Cross-platform CPU count (macOS uses sysctl, Linux uses nproc)

2. Shebang standardization (#!/bin/bash#!/usr/bin/env bash)

All 39 shell scripts updated to use #!/usr/bin/env bash instead of #!/bin/bash. This is more portable since bash may be located in different paths on different systems (especially macOS where Homebrew installs bash to /usr/local/bin/bash).

3. Platform-aware dependency instructions

Updated check-dependencies.sh to provide OS-specific install instructions:

  • macOS: Homebrew commands (brew install coreutils flock gnu-sed...)
  • WSL: Ubuntu apt-get commands
  • Linux: Standard apt-get commands

4. Cross-platform date formatting

Replaced hardcoded Linux date commands with the new format_timestamp() function that works on both macOS and Linux.

5. Array handling fix

Fixed bash array expansion (${YAML_ARGS[@]}${YAML_ARGS[@]+"${YAML_ARGS[@]}"}) to handle empty arrays correctly and avoid "unbound variable" errors in strict mode.

6. HOST_OS variable

Added HOST_OS environment variable tracking throughout the codebase, including passing it to Docker builds via --build-arg HOST_OS="${HOST_OS}".

7. macOS paste compatibility

Changed paste -sd'|' - to paste -sd'|' (removed trailing -) for macOS compatibility.


In summary: This PR makes the test-plans repository work on macOS and WSL in addition to Linux, primarily by handling differences in command-line tools between platforms.

Copy link
Contributor

@acul71 acul71 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM
In summary: This PR makes the test-plans repository work on macOS and WSL in addition to Linux, primarily by handling differences in command-line tools between platforms.

@seetadev seetadev marked this pull request as ready for review January 25, 2026 06:14
@seetadev
Copy link
Collaborator

@dhuseby : This looks really solid — thank you for pushing this through, Dave. 🙌
Huge step forward for the repo.

Wish to share a few callouts/ highlights that stood out positively from this PR:

  • The lib-host-os.sh abstraction is clean and well-scoped. Centralizing OS detection + helpers (timestamp formatting, CPU count) makes the rest of the scripts much easier to reason about and extend.
  • Shebang standardization to /usr/bin/env bash across all scripts is exactly the right call for macOS/Homebrew users — small change, big portability win.
  • The platform-aware dependency guidance in check-dependencies.sh is thoughtful and pragmatic. This will significantly reduce friction for first-time contributors on macOS and WSL.
  • Nice catch on the bash array expansion fix — that’s one of those subtle issues that only shows up under strict mode, and fixing it now avoids future paper cuts.
  • Passing HOST_OS consistently through to Docker builds sets us up well for Apple Silicon and future cross-arch work.
  • Great to see real-world validation: Arch Linux passing cleanly with all tests green is a strong signal 👍

Given:

  • LGTM from @acul71
  • All checks passing

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. 🚀

@K-21
Copy link
Contributor

K-21 commented Jan 26, 2026

@dhuseby @seetadev @acul71

Current /srv/cache default breaks local development on Windows/WSL (permission denied).

Proposed fix:
Change lib-common-init.sh to use project-local cache: CACHE_DIR="${CACHE_DIR:-${TEST_ROOT}/.cache}"

Also need to update:

GitHub workflows: cache-dir: ${{ github.workspace }}/.cache
Documentation examples
Benefits: Works cross-platform without sudo, backwards compatible.

Files affected: ~15-20 (1 core + workflows/actions + docs)

@seetadev
Copy link
Collaborator

@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
Copy link
Collaborator

@dhuseby : Merging this PR so that @K-21 and @acul71 can pull the changes and submit new PRs for improving linux+macos+wsl support.

@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 26, 2026

@seetadev not yet

Signed-off-by: Dave Grantham <dwg@linuxprogrammer.org>
@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 26, 2026

@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 linux-local-dev.md, macos-local-dev.md and windows-local-dev.md.

I also updated all uses of nproc to correctly use the get_num_cpu function and I updated all of the documentation.

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 macos-local-dev.md doc at some point.

  1. Install the command line tools for Xcode
  2. Install homebrew
  3. Use homebrew to install: bash, yq, pandoc, gnuplot, docker, wget, flock, and coreutils
  4. Run the DockerDesktop app and log into your free docker hub account.
  5. Clone the repo and cd into the transport folder. Try running ./run.sh --check-deps it should work.
  6. Run ./run.sh --test-ignore '~failing' --snapshot and watch it complete correctly, including building the docker images and the snapshot correctly.
  7. cd into the .cache/... folder as it tells you to do and run ./run.sh and watch it repeat the test exactly. 🚀

@dhuseby dhuseby removed the request for review from pacrob January 26, 2026 23:45
@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 26, 2026

@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?

@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 26, 2026

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

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks I like that

@acul71
Copy link
Contributor

acul71 commented Jan 27, 2026

Just confirmed this latest version of the PR runs on Linux unmodified. That's 2/3. @K-21 can you confirm Windows?

It seems that it works in windows 11 + wsl + Ubuntu
But I had to add repositories to make docker install.

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...stoppedNetwork removed: transport-networkGlobal services stoppedCollecting results...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  → Results:
    → Total: 131Passed: 131Failed: 0Total time: 00:15:38All tests passed!

╲ Generating results dashboard...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  ✓ Generated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/results.yamlGenerated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/LATEST_TEST_RESULTS.mdGenerated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/results.mdGenerated ./.cache/test-run/transport-bf295a19-045055-27-01-2026/results.htmlDashboard generation complete

perf also

All images built successfullyStaring global services...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  ✓ Created network: perf-networkStarting 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
startedGlobal services readyRunning 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...stoppedNetwork removed: perf-networkGlobal services stoppedCollecting results...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  → Results:
    → Total: 12 (3 baseline + 9 main)
    ✓ Passed: 12Failed: 0Total time: 00:17:03All tests passed!

╲ Generating results dashboard...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  ✓ Generated ./.cache/test-run/perf-738539db-045806-27-01-2026/results.yamlGenerated ./.cache/test-run/perf-738539db-045806-27-01-2026/LATEST_TEST_RESULTS.mdGenerated ./.cache/test-run/perf-738539db-045806-27-01-2026/results.mdGenerated ./.cache/test-run/perf-738539db-045806-27-01-2026/results.htmlDashboard generation completeGenerating box plots...
 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  → Found 3 baseline results and 9 test resultsExtracting upload data...
  → Extracting download data...
  → Extracting latency data...
  → Generating plots with gnuplot...
    ✓ Generated boxplot-upload.pngGenerated boxplot-download.pngGenerated boxplot-latency.pngBox plot generation complete

@dhuseby
Copy link
Contributor Author

dhuseby commented Jan 27, 2026

@acul71 I just confirmed this works on wsl with the Debian image installed.

I think we can safely merge this.

@dhuseby dhuseby merged commit d6e5bea into master Jan 27, 2026
6 checks passed
@dhuseby dhuseby deleted the dhuseby/feature/linux-macos-wsl-support branch January 27, 2026 04:33
@K-21
Copy link
Contributor

K-21 commented Jan 27, 2026

@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?

@dhuseby Thanks — agreed to leave workflows using /srv/cache for CI performance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants