Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
5b9da3f
feat(serf-proto): scaffold on memberlist-proto 0.4; isolate old crate…
al8n Jun 23, 2026
98693b6
feat(serf-proto): buffa codegen + UserEventMessage round-trip
al8n Jun 23, 2026
2ac06c1
feat(serf-proto): MessageType enum + plain-frame encode/decode
al8n Jun 23, 2026
f0c5fc8
feat(serf-proto): QueryFlag, Coordinate, Tags, Filter typed types + p…
al8n Jun 23, 2026
9c81d69
feat(proto): membership messages JoinMessage, LeaveMessage, ConflictR…
al8n Jun 23, 2026
bc55ae8
feat(serf-proto): Filter<I> retrofit + QueryMessage + QueryResponseMe…
al8n Jun 23, 2026
c85c2be
feat(serf-proto): PushPullMessage, UserEvents, KeyRequest/Response, R…
al8n Jun 23, 2026
d33cfc7
feat(serf-proto): AnyMessage enum + minor sweeps
al8n Jun 23, 2026
8c79ff7
feat(serf-proto): serf Endpoint super-machine over memberlist-proto
al8n Jun 26, 2026
311f213
ci: test serf-proto across feature combos and add to coverage
al8n Jun 26, 2026
f6ce74c
feat(serf-proto): add the Reliable seam bridging the memberlist coord…
al8n Jun 26, 2026
0ab7ce5
refactor(serf-proto): restructure Endpoint into the serf-logic core o…
al8n Jun 26, 2026
7043bbf
feat(serf-proto): StreamEndpoint super-machine over the memberlist St…
al8n Jun 26, 2026
6edaf31
feat(serf-proto): QuicEndpoint super-machine over the memberlist Quic…
al8n Jun 26, 2026
397320f
refactor(serf-proto): cut over to the StreamEndpoint/QuicEndpoint sup…
al8n Jun 26, 2026
aee212f
docs(serf-proto): doc(cfg) on the super-machine impl blocks
al8n Jun 26, 2026
1ff24df
fix(serf-proto): gate the membership FSM module behind a transport
al8n Jun 26, 2026
0936797
feat(serf-proto): add Endpoint::set_tags over the Reliable update_met…
al8n Jun 26, 2026
c140f93
feat(serf-driver): runtime-agnostic pure-data crate shared by the ser…
al8n Jun 26, 2026
9cccf61
feat(serf-proto): additive endpoint forwarders for the driver layer
al8n Jun 27, 2026
606414b
refactor(serf-driver): drop the unused JoinFailed payload
al8n Jun 27, 2026
d3560cc
feat(serf-compio): compio async driver for the serf Sans-I/O machine
al8n Jun 27, 2026
af58a79
feat(serf): await-result address-set join, per-exchange ignore_old, w…
al8n Jun 28, 2026
caec31e
chore(deps): bump buffa and compio to latest (#66)
al8n Jun 29, 2026
f499bda
feat(serf-reactor): foundation — crate, command, delegate, error, eve…
al8n Jul 1, 2026
122bed5
feat(serf-reactor): reactor substrate + stream/TCP driver
al8n Jul 1, 2026
ae19315
feat(serf-reactor): handle constructors, snapshot accessors, real-nod…
al8n Jul 1, 2026
6887906
fix(serf-reactor): drain the socket and machine surfaces to quiescenc…
al8n Jul 1, 2026
d06c715
fix(serf-reactor): fixed-point surface drain + bounded-deferral timer…
al8n Jul 1, 2026
55c76ad
test(serf-reactor): encrypted-gossip convergence + mismatched-key enf…
al8n Jul 1, 2026
55b2220
fix(serf-reactor): residence-scoped pump gates — exact inbound waterm…
al8n Jul 2, 2026
be31707
fix(serf-reactor): reap watermark covers the latest due deadline, not…
al8n Jul 2, 2026
033c1bd
fix(serf-reactor): reconcile the caller join/leave deadline with the …
al8n Jul 2, 2026
d974d3d
feat(serf-reactor): QUIC driver
al8n Jul 2, 2026
b91ac3d
fix(serf-reactor): route QUIC gossip through the configured datagram …
al8n Jul 2, 2026
eaccc14
fix(serf-reactor): QUIC recv error parks on a bounded backoff instead…
al8n Jul 2, 2026
faf6fa4
feat(serf-reactor): TLS record-layer transport + DNS/getifs resolvers
al8n Jul 2, 2026
9ff719f
fix(serf-reactor): DNS resolution timeout is not bypassed by the OS f…
al8n Jul 2, 2026
0e2def7
docs(serf-reactor): state the TLS reliable-plane boundary precisely p…
al8n Jul 2, 2026
8c3eae9
feat(serf-reactor): deterministic non-vacuous negative-encryption tes…
al8n Jul 2, 2026
a93a59c
ci: port memberlist Sans-I/O workflows to serf's new crate architectu…
al8n Jul 2, 2026
93812e8
feat(serf-proto): no_std+alloc support (#72)
al8n Jul 3, 2026
79de6e4
feat(serf-embedded): shared no_std driving core (SerfEngine)
al8n Jul 3, 2026
bbbbd84
fix(serf-embedded): two-RNG constructor + core-owned join fan-out/cor…
al8n Jul 3, 2026
e38caa7
fix(serf-embedded): decouple leave from ignore_old cleanup; guard ref…
al8n Jul 3, 2026
43e635a
fix(serf-embedded): fold-before-leave join resolution, leak-free reap…
al8n Jul 3, 2026
84252d6
fix(serf-embedded): retain join result until delivery/cancel; cancel_…
al8n Jul 3, 2026
4ab0943
fix(serf-embedded): fold join completions in the pump, not poll_event
al8n Jul 3, 2026
e66f5d1
fix(serf-embedded): bound the pump event buffer with drop+counter
al8n Jul 3, 2026
9271e06
fix(serf-embedded): deliver mandatory control events on a non-lossy path
al8n Jul 3, 2026
0d2b889
fix(serf-embedded): bound the mandatory control queue by liveness
al8n Jul 3, 2026
92c18f7
fix(serf-proto): prune expired received-queries before the inbound cap
al8n Jul 3, 2026
c2737a6
fix(serf-proto): align received-query prune with the inclusive respon…
al8n Jul 3, 2026
c71634e
fix(serf-embedded): retain a KeyRequest through its exact deadline
al8n Jul 3, 2026
6ddd357
feat(serf-smoltcp): sync caller-poll serf driver over the smoltcp stack
al8n Jul 10, 2026
363ab0b
fix(serf-smoltcp): loop back self-addressed gossip, wake on queued re…
al8n Jul 10, 2026
314194e
feat(serf-embedded): apply key-management requests to the live wire k…
al8n Jul 10, 2026
311cc1b
fix(serf-smoltcp): drop the shadow keyring for the engine's live keyring
al8n Jul 10, 2026
4566e84
fix(serf-embedded): variant-exact key operations, cross-cipher collis…
al8n Jul 10, 2026
96e7e39
fix(serf-smoltcp): gate the key-management suite on an AEAD backend
al8n Jul 10, 2026
4077252
feat(serf-embassy): async no_std serf driver over embassy-net
al8n Jul 10, 2026
54da7ea
fix(serf-embassy): make the conflict-loss shutdown terminal
al8n Jul 10, 2026
910dcf5
feat(serf-embassy): public shutdown command, drop the test seam
al8n Jul 10, 2026
8b9f29b
fix(serf-embassy): close the post-latch pump and parked-resolution sh…
al8n Jul 10, 2026
2fd88d3
feat(serf): bare-metal qemu execution proof + embedded CI
al8n Jul 10, 2026
2465b37
fix(serf-embassy-qemu): bound the whole scenario with a phase-labeled…
al8n Jul 10, 2026
4a81fcb
fix(serf-proto): tcp-gate the drain-now test seam, pin alloc on the m…
al8n Jul 10, 2026
9364558
chore(codecov): absorb async-coverage noise with a project threshold
al8n Jul 10, 2026
f4acc66
feat(serf-proto): expose the live encryption options on the QUIC endp…
al8n Jul 10, 2026
978c22d
fix(serf-reactor,serf-compio): rotate the live wire keyring, demote t…
al8n Jul 10, 2026
3003b86
test(serf-reactor,serf-compio): prove key rotation reaches the wire
al8n Jul 10, 2026
7b40c4c
fix(serf-driver): a duplicate install succeeds without republishing t…
al8n Jul 10, 2026
3b202a6
fix(serf-proto): transition to Shutdown on a lost conflict vote
al8n Jul 10, 2026
8ea6ed6
fix(serf-proto): seal the Shutdown contract against replay and mid-ti…
al8n Jul 10, 2026
439659e
Modify codecov.yml ignore patterns
al8n Jul 10, 2026
13d4490
test(serf-proto): port the legacy Go-parity unit suite (#79)
al8n Jul 11, 2026
cf4df86
feat: event coalescing for the Sans-I/O serf (member + user), with bo…
al8n Jul 11, 2026
9bb960e
Per-member reconnect-timeout override (ReconnectDelegate) (#81)
al8n Jul 11, 2026
dec1290
feat: configurable user-event size ceiling, validated at every driver…
al8n Jul 11, 2026
2b64cc0
feat(reactor): plumb SWIM failure-detection knobs through the transpo…
al8n Jul 11, 2026
0365fe0
test(reactor): add a reusable multi-node fault-injection cluster fixture
al8n Jul 11, 2026
e9d63d1
test(reactor): port serf_events_failed and serf_reconnect over the fa…
al8n Jul 11, 2026
8d380c4
test(reactor): give the cluster fixture's fast timing a CI scheduling…
al8n Jul 11, 2026
358a4e0
refactor(serf-proto): drop the vestigial leave-broadcast wait machinery
al8n Jul 11, 2026
1a1ddce
test(serf-proto): pin the graceful-leave ordering and late-intent heal
al8n Jul 11, 2026
abc6f1b
test(serf-reactor): e2e graceful leave yields [Join, Leave], never Fa…
al8n Jul 11, 2026
570d383
feat(serf-proto): pass the leave intent as the coordinator's explicit…
al8n Jul 11, 2026
c7a292f
feat(serf-proto): admit the leave farewell before mutating any state
al8n Jul 11, 2026
b39b665
fix(serf-reactor): retain the leave farewell under UDP backpressure
al8n Jul 11, 2026
3ed76af
fix(serf-reactor): leave resolves only after the farewell reaches the…
al8n Jul 11, 2026
040e6a2
fix(serf-reactor): account farewell delivery failures and drain re-en…
al8n Jul 11, 2026
8b4b6da
fix(serf-reactor): egress the queued farewell at teardown and scope r…
al8n Jul 11, 2026
ab68be8
fix(serf-reactor): route the Datagram-mode leave fan-out over plain UDP
al8n Jul 11, 2026
acb8124
fix(serf-reactor): classify EADDRNOTAVAIL as local and honor the leav…
al8n Jul 11, 2026
45b3065
fix(serf-reactor): disambiguate ICMP-class farewell send errors by bo…
al8n Jul 12, 2026
d39da27
fix(serf-reactor): retry retained farewells exactly once per pump wake
al8n Jul 12, 2026
7cca4e5
fix(serf-reactor): epoch-gate the farewell retry so self-wakes cannot…
al8n Jul 12, 2026
0b179bb
feat(serf): surface Vivaldi coordinates on the handle and seed the ac…
al8n Jul 12, 2026
552e24f
feat(serf): per-key-op relay factor
al8n Jul 12, 2026
ab465df
feat(serf): operator stats aggregate and encryption visibility on the…
al8n Jul 12, 2026
c7d0296
feat(serf-reactor): FileKeyringDelegate — turnkey file persistence fo…
al8n Jul 12, 2026
455537f
feat(serf): wire the join-merge veto through to the machine predicate
al8n Jul 12, 2026
2b6905f
feat(serf-reactor): snapshot persistence and rejoin-after-restart
al8n Jul 12, 2026
25579ce
docs(serf-proto): the wire-evolution stance replacing version negotia…
al8n Jul 12, 2026
5500e78
fix(serf-reactor): harden the snapshot compaction and keyring persist…
al8n Jul 12, 2026
f18617b
fix(serf-reactor): exclusive keyring temps, persistence-gated key res…
al8n Jul 12, 2026
83a034e
fix(serf-reactor): keyring sweep must not delete a .tmp-named destina…
al8n Jul 12, 2026
ab412eb
fix(serf-reactor): case-insensitive tmp-alias guard; make FileKeyring…
al8n Jul 12, 2026
3ab9b9d
fix(serf-reactor): gate the keyring sweep on filesystem identity, not…
al8n Jul 12, 2026
3f6f6fc
fix(serf-reactor): name guards precede the sweep's identity gate
al8n Jul 12, 2026
68ce9a8
fix(serf-reactor): legacy sweep only for provably distinct destinatio…
al8n Jul 12, 2026
a7cbeaf
fix(serf): first-CI repairs — proto re-export gate, qemu lock pin, wa…
al8n Jul 12, 2026
8611703
test(serf): cover the folded driver paths CI found dark
al8n Jul 12, 2026
7113bc6
refactor(serf-driver): hoist the snapshotter and keyring-file engine …
al8n Jul 12, 2026
ce55b13
feat(serf-compio): persistence-acknowledged keyring delegates and the…
al8n Jul 12, 2026
c3a376e
feat(serf-compio): constructor merge predicate and snapshot persistence
al8n Jul 12, 2026
cd96b79
feat(serf-compio): operator accessors over the enriched snapshot
al8n Jul 12, 2026
77ea743
test(serf-compio): end-to-end coverage for the parity surface
al8n Jul 12, 2026
ef17326
fix(serf): forward serf-driver/tracing from both runtime tracing feat…
al8n Jul 12, 2026
cfc6a40
fix(serf): const-evaluate the tracing wiring pins
al8n Jul 12, 2026
c6d3be3
test(serf-reactor): legacy cluster-scenario ports — force-leave, remo…
al8n Jul 12, 2026
87887e6
test(serf-reactor): legacy scenario ports — tag propagation, restart-…
al8n Jul 12, 2026
e984c7f
test(serf-reactor): port the join/leave membership-lifecycle scenario…
al8n Jul 12, 2026
f02836c
fix(serf-proto): local-node reap fix + the remaining legacy driver-e2…
al8n Jul 13, 2026
c5ab225
chore: remove the preserved legacy/ serf-core folder (#93)
al8n Jul 13, 2026
e1aaceb
test(serf-proto): guard the serf#56 query-ring-wraparound dedup (#94)
al8n Jul 13, 2026
1459bb0
Merge main into the Sans-I/O branch for the cutover
al8n Jul 13, 2026
ec1e0f3
feat(serf): umbrella facade crate, per-crate READMEs, and crate logos…
al8n Jul 13, 2026
b57b960
test: raise coverage, and close three testing gaps (#96)
al8n Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 8 additions & 5 deletions .codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@ codecov:
require_ci_to_pass: false

ignore:
- serf-core/src/serf/base/tests
- serf-core/src/serf/base/tests.rs
- serf/test
- fuzz/
- examples/
- "**/benches/**"
- "**/tests/**"
- "**/examples/**"
- "**/tests.rs"

coverage:
status:
project: # Overall project status
default:
target: auto
# The driver suites exercise timing-dependent async paths, so repeated
# runs of an identical tree differ by a few hit lines; absorb that
# measurement noise instead of failing a zero-line diff on a 0.02% dip.
threshold: 0.5%
if_not_found: success
only_pulls: false
patch: # Status for the patch in pull requests
Expand Down
95 changes: 95 additions & 0 deletions .github/workflows/ci-compio.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: ci-compio

# The compio async driver: serf-compio's unit tests on compio's single runtime.
# Nodes bind ephemeral loopback ports, so no subnet setup is required.

on:
push:
branches:
- main
- refactor/sansio
paths-ignore:
- "README.md"
- "COPYRIGHT"
- "LICENSE*"
- "**.md"
- "**.txt"
- "art"
pull_request:
paths-ignore:
- "README.md"
- "COPYRIGHT"
- "LICENSE*"
- "**.md"
- "**.txt"
- "art"
workflow_dispatch:
schedule: [cron: "0 1 */30 * *"]

env:
# Every transport plus both AEAD backends, so every gated cell runs. Both AEAD
# backends are on so the encryption-validation usability probe sees a present
# backend for every SecretKey variant (it trial-encrypts AES and
# ChaCha20-Poly1305 keys). compio's own `tls` feature drives the record layer
# via compio/rustls; QUIC uses quic-rustls-ring.
FEATURES: "tcp,tls,quic-rustls-ring,aes-gcm,chacha20-poly1305,coordinates,tag-regex,tracing,serde,clap,dns,getifs"

jobs:
test:
name: ${{ matrix.os }} - compio
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
steps:
- uses: actions/checkout@v7

- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: clippy, rustfmt

# Cache BEFORE the build steps so the restore actually warms this run; a
# cache placed after the test step only saves, never restores.
- name: Cache Cargo registry
uses: actions/cache@v6
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-compio

- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Format
run: cargo fmt -p serf-compio --check

- name: Clippy
# --no-deps: lint only our own crate, not its external dependencies.
run: cargo clippy -p serf-compio --all-targets --features "$FEATURES" --no-deps -- -D warnings

- name: Test
# --no-fail-fast: run every test binary even if one fails, so a single
# OS-specific failure surfaces the rest in the same run.
#
# Windows runs single-threaded: each compio runtime is single-threaded, so
# libtest's default per-core parallelism oversubscribes the CPU and the
# SWIM convergence scenarios can miss their timers under the contention.
run: |
if [ "${{ matrix.os }}" = "windows-latest" ]; then
cargo test -p serf-compio --features "$FEATURES" --no-fail-fast -- --test-threads=1
else
cargo test -p serf-compio --features "$FEATURES" --no-fail-fast
fi
168 changes: 168 additions & 0 deletions .github/workflows/ci-core.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
name: ci-core

# The runtime-independent core: the serf-proto wire codec + Sans-I/O machine
# and its runtime-agnostic glue crate serf-driver. Both are pure-CPU and bind no
# sockets.

on:
push:
branches:
- main
- refactor/sansio
paths-ignore:
- "README.md"
- "COPYRIGHT"
- "LICENSE*"
- "**.md"
- "**.txt"
- "art"
pull_request:
paths-ignore:
- "README.md"
- "COPYRIGHT"
- "LICENSE*"
- "**.md"
- "**.txt"
- "art"
workflow_dispatch:
schedule: [cron: "0 1 */30 * *"]

jobs:
proto:
name: ${{ matrix.os }} - proto
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
env:
FEATURES: "tcp,tls,quic-rustls-ring,coordinates,aes-gcm,chacha20-poly1305,tag-regex"
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
steps:
- uses: actions/checkout@v7

- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: clippy, rustfmt

- name: Cache Cargo registry
uses: actions/cache@v6
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-proto

# serf-proto's build.rs runs protoc (via buffa-build) for the wire codegen,
# and its memberlist-proto dependency's build.rs also runs protoc.
- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Format
run: cargo fmt -p serf-proto -p serf-driver --check

- name: Clippy
run: cargo clippy -p serf-proto --all-targets --features "$FEATURES" --no-deps -- -D warnings

- name: Test
run: cargo test -p serf-proto --features "$FEATURES"

# serf-proto is pure-CPU, so exercise the interesting feature permutations on a
# single OS (default, the coordinate + AEAD combos, all-features, the minimal
# no_std alloc tier, coordinates+aes+tcp, and quic-rustls-ring alone). A bare
# `--no-default-features` build is impossible by design — the crate requires
# the `std` or `alloc` tier and fails with a deliberate compile_error — so the
# minimal combo pins `alloc`.
proto-features:
name: proto - ${{ matrix.name }}
runs-on: ubuntu-latest
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
- { name: "default", flags: "" }
- { name: "coords-aes-gcm", flags: "--features coordinates,aes-gcm" }
- { name: "coords-chacha", flags: "--features coordinates,chacha20-poly1305" }
- { name: "all-features", flags: "--all-features" }
- { name: "no-default", flags: "--no-default-features --features alloc" }
- { name: "coords-aes-gcm-tcp", flags: "--features coordinates,aes-gcm,tcp" }
- { name: "quic-rustls-ring", flags: "--no-default-features --features quic-rustls-ring" }
steps:
- uses: actions/checkout@v7

- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: clippy, rustfmt

- name: Cache Cargo registry
uses: actions/cache@v6
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-proto-features

- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Clippy
run: cargo clippy -p serf-proto --all-targets ${{ matrix.flags }} --no-deps -- -D warnings

- name: Test
run: cargo test -p serf-proto ${{ matrix.flags }}

driver:
name: driver
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v7

- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: clippy, rustfmt

- name: Cache Cargo registry
uses: actions/cache@v6
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-driver

- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Format
run: cargo fmt -p serf-driver --check

- name: Clippy
run: cargo clippy -p serf-driver --all-targets --all-features --no-deps -- -D warnings

- name: Test
run: cargo test -p serf-driver --all-features
90 changes: 90 additions & 0 deletions .github/workflows/ci-smol.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: ci-smol

# The reactor async driver under smol. serf-reactor's real-node integration suites
# (tcp / tls / quic) have runtime-generic scenario bodies with both a `#[tokio::test]`
# cell (run in ci-tokio) and a `_smol` cell driven by `SmolRuntime::block_on`. This
# workflow is the smol gate: it clippy-lints the crate with the `smol` runtime feature
# (proving the `agnostic/smol` code path compiles clean), runs the runtime-independent
# unit tests, and runs the `_smol` integration cells (`--test {tcp,tls,quic} -- smol`,
# where `-- smol` selects only the smol cells across the suite binaries). Nodes bind
# ephemeral loopback ports, so no subnet setup is required.

on:
push:
branches:
- main
- refactor/sansio
paths-ignore:
- "README.md"
- "COPYRIGHT"
- "LICENSE*"
- "**.md"
- "**.txt"
- "art"
pull_request:
paths-ignore:
- "README.md"
- "COPYRIGHT"
- "LICENSE*"
- "**.md"
- "**.txt"
- "art"
workflow_dispatch:
schedule: [cron: "0 1 */30 * *"]

env:
FEATURES: "smol,tcp,tls-rustls-ring,quic-rustls-ring,aes-gcm,chacha20-poly1305,coordinates,tag-regex,tracing,serde,clap,dns,getifs,test"

jobs:
test:
name: ${{ matrix.os }} - reactor - smol
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
steps:
- uses: actions/checkout@v7

- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
components: clippy, rustfmt

# Cache BEFORE the build steps so the restore actually warms this run; a
# cache placed after the test step only saves, never restores.
- name: Cache Cargo registry
uses: actions/cache@v6
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-reactor-smol

- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Clippy (smol runtime path)
# --no-deps: lint only our own crate, not its external dependencies.
run: cargo clippy -p serf-reactor --all-targets --features "$FEATURES" --no-deps -- -D warnings

- name: Test (runtime-independent unit tests)
run: cargo test -p serf-reactor --lib --features "$FEATURES"

- name: Test (smol integration cells)
# `-- smol` selects only the `_smol` cells in each suite binary; the tokio
# cells over the same runtime-generic scenarios run in ci-tokio.
run: |
cargo test -p serf-reactor --features "smol,tcp,tls-rustls-ring,quic-rustls-ring,aes-gcm,chacha20-poly1305,coordinates,tag-regex,dns,getifs,test" --test tcp -- smol
cargo test -p serf-reactor --features "smol,tcp,tls-rustls-ring,quic-rustls-ring,aes-gcm,chacha20-poly1305,coordinates,tag-regex,dns,getifs" --test tls -- smol
cargo test -p serf-reactor --features "smol,tcp,tls-rustls-ring,quic-rustls-ring,aes-gcm,chacha20-poly1305,coordinates,tag-regex,dns,getifs" --test quic -- smol
Loading
Loading