Skip to content

Testing and Validation

Local performance report

UDP report and buffer diagnosis · Buffer configuration

Functional tests establish correctness; sustained stress checks repeated work, restarts and cleanup. Performance measurements run locally after those checks pass and use a Release build without sanitizers. CI checks regressions and smoke execution; its shared-runner timing is not the published baseline.

Download the validation logs and source mapping with the SHA256 checksum. The archive includes bilingual instructions and an independent verifier.

Build and Run

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
  -DARKNET_ENABLE_SSL=ON -DARKNET_BUILD_TESTS=ON \
  -DARKNET_BUILD_BENCHMARKS=ON -DARKNET_USE_BOOST_ASIO=ON
cmake --build build --parallel 3
cmake --build build --target arknet_check
build/tests/arknet_stress_test --protocol all --seconds 60 \
  --clients 16 --rounds 2 --window 4 --certs tests/certs

For Standalone Asio, use a separate build directory with -DARKNET_USE_BOOST_ASIO=OFF -DARKNET_ASIO_INCLUDE_DIR=/path/to/asio/include. HTTP and WebSocket checks require Boost.Asio and Boost.Beast; the two configurations therefore contain different checks. Windows executables have the .exe suffix. The repository’s TLS certificates are for testing, not production identities.

Tests use doctest 2.5.3, stored under tests/vendor/doctest; the framework is not installed or linked by library consumers. arknet_check runs the test executables, install-consumer check and enabled benchmark smoke cases directly, with timeouts and logs in build/tests/logs/. It does not use CTest.

build/tests/arknet_tcp_test --list-test-cases
build/tests/arknet_tcp_test --test-case="*framing*"
build/tests/arknet_tls_test --reporters=junit --out=build/tls.xml

The functional suites and benchmarks are independent C++ programs with their own main; compile and run them directly. Python, Ruby, jq, GNU timeout and shasum are not prerequisites for these C++ tests or single benchmarks.

Correctness Coverage

Suite Coverage
TCP / UDP / WebSocket Framing and binary/empty data, custom sessions, endpoint routing, reconnect and owned sends
HTTP / router Raw-peer chunked/HEAD/Expect semantics, ordered pipelines, limits, method/path dispatch, middleware, errors and HTTP/HTTPS binding
HTTP requests Independent raw peers, HEAD/interim/chunked/EOF responses, cancellation, deadlines, limits and exactly-once completion
ARQ / RUDP Canonical protocol interop, loss/reordering, bounded memory, handshake retries, IPv4/IPv6, stale SYN handling and shutdown
FEC / RUDP FEC Independent Reed–Solomon interop, negotiation, CRC rejection, duplicate/replay handling, recovery, partial groups, memory budgets, fixed/adaptive policies and concurrent statistics
Lifecycle / detail / IO pool Timer/post cancellation, real completion before destruction, mutable listeners, executor serialization, queued work and restart
Process exit / thread storage Last-owner callback release, nested pools, direct/indirect globals, both multi-TU link orders, late-construction rejection and explicit Asio configuration preservation
Concurrency / keepalive Send limits, callback completion accounting, concurrent shutdown, TCP keepalive options
TLS Trust/identity rejection, mTLS, deadlines, WSS and fresh stream on reconnect
IPv6 TCP, UDP/session/cast, WS/WSS, HTTP/HTTPS, TLS IP identity and handshake Host
MySQL Packet/authentication/command codecs, verified TLS, queries, prepared statements, transactions, result limits, cancellation, bounded admission and exclusive pool reset/database isolation
Redis RESP2/RESP3, authentication, TCP/TLS/mTLS, ordered pipelines, cancellation reply draining, bounded admission, unsupported replication commands and exclusive pool reset/authentication/database isolation
Installed consumer Provider/TLS configuration propagation and installed public headers

Sustained stress validates content/sequence, completion counts, connection and server restarts, pending writes and queue cleanup. Each protocol splits --seconds across the built-in scheduler, one context/one thread, one context/four threads and four contexts/one thread each, then across the requested restart rounds. Seven protocols with --seconds 60 therefore request seven minutes of traffic in total, plus setup and teardown. Slow receivers test backpressure rather than throughput.

Local Verification

The complete-suite source snapshot is 6c8418e; its networking changes are included in measured revision 2aa5bc0. The separate test-only snapshot 25bb9f8 covers allocation-failure portability and native-connect ordering below. Pool-shutdown coverage identifies its separate source snapshot 550fb58. PR #16 records the candidate review and cross-platform CI; local results do not substitute for its checks.

Validation dates: 2026-10-15–16. The machine is a Mac mini Mac16,11, Apple M4 Pro, 14 physical/logical cores (10 performance and 4 efficiency cores), 48 GiB RAM, macOS 27.0.1 (26A434). Dependencies are Standalone Asio 1.38.2, Boost 1.90.0 and OpenSSL 3.6.4. Ordinary builds use Apple Clang 21.0.0; sanitizer builds use LLVM 22.1.7.

Complete Checks

All four builds use Debug, TLS and tests ON, examples and benchmarks OFF. Compilation finishes before checks run serially with real database services.

Dependency / instrumentation Checks doctest cases Assertions Result
Boost.Asio 52/52 470 978,433 Passed
Standalone Asio 51/51 410 576,824 Passed
Boost.Asio / ASan+UBSan 52/52 470 615,937 Passed
Standalone Asio / TSan 51/51 410 333,108 Passed

Checks count programs invoked by arknet_check; cases count doctest executions. Assertion totals are observed counts, including duration-based stress cases. The enabled default suites have zero failures or environment skips. Archived Zephyr interoperability is not enabled in these runs; its independent evidence is recorded below. Reference ARQ/FEC interoperability is included.

Each configuration includes external-context stop (15 cases / 375 assertions), queued-connect cancellation (4 / 44), protocol and runtime-exit suites, stress, and installed-package consumption. The installed-consumer child build does not inherit sanitizer flags; its binaries are not sanitizer-instrumented.

Database and Shutdown Coverage

All four configurations execute the optional real-service cases against isolated MySQL Community 8.4.11 and Redis 7.4.2, without database-case skips. MySQL verifies TLS; Redis covers TCP, TLS and mTLS. Coverage includes connection/client and pool operations, permanent close_and_wait(), late connects, callback/capture retirement, publication failures and recovery, cancellation, and reset isolation. Without the documented service environment variables, real-service cases skip rather than substitute simulated services. Performance uses Valkey 8.0.11 for the Redis protocol; it is separate from this Redis 7.4.2 interoperability evidence.

TCP-based endpoint checks cover native completion and capture retirement. Complete concurrent owner-stop serialization is verified for TCP servers and HTTP/WebSocket/TLS-derived servers. It is not a new guarantee for every protocol. External-context owners keep their runners alive through drain and stop external producers first; worker callbacks must not block waiting for themselves. See lifecycle and the formal shutdown and fault tests. These results do not establish dynamic-library unloading safety.

Additional Focused Checks

Scope Checks Cases Assertions Result
Boost.Asio, TLS OFF: eight selected targets 8/8 66 1,515 Passed
Boost.Asio ASan+UBSan: queued-connect, HTTP external-context and external-stop repetitions 72/72 280 4,664 Passed

The NoTLS selection covers TCP, external-stop, manual-runtime, queued-connect cancellation and four Redis shutdown/publication-failure targets; it is not a complete NoTLS matrix or a MySQL-without-OpenSSL result. The 72 ASan executions comprise 32 queued-connect runs, 32 selected HTTP cases and eight external-stop runs. Cases excluded by the explicit HTTP filter are not environment skips. The complete unfiltered HTTP suite passes in the complete checks above.

The test-only allocation and connect-ordering snapshot has separate coverage:

Dependency / instrumentation Focused cases Assertions Selected native-error executions
Boost.Asio / ASan+UBSan 30 927 32/32 passed
Standalone Asio / ASan+UBSan 30 927 32/32 passed
Boost.Asio / TSan 30 926 32/32 passed
Standalone Asio / TSan 30 926 32/32 passed

All focused cases pass without sanitizer diagnostics. The 128 selected native-error executions each check nine assertions; other cases excluded by the filter are not environment skips. These runs are additional to the complete snapshot, not a complete-suite run of the test-only changes. The MSVC-specific CRT allocation path is covered by the Windows CI jobs; this macOS validation does not execute it.

Pool Shutdown Checks

Snapshot 550fb58 retires queued acquire requests in place in both pools, avoiding allocation-dependent unordered-map move construction. Its formal regressions cover two queued waiters, reentrant close/cancel/acquire, once-only completion and capture retirement. Owner-side guards keep test state alive through permanent closure on fatal assertion paths.

Dependency / instrumentation MySQL shutdown cases / assertions Redis shutdown cases / assertions
Boost.Asio / ASan+UBSan 14 / 1,067 19 / 596
Standalone Asio / ASan+UBSan 14 / 1,067 19 / 596
Boost.Asio / TSan 14 / 1,067 19 / 595
Standalone Asio / TSan 14 / 1,066 19 / 595

All eight target runs pass with zero failures, skips or sanitizer reports. The four configurations also pass unchanged MySQL return-failure tests (5 cases / 222 assertions) and Redis return-failure tests (4 / 107). Those return-failure runs preceded the guard-only test edit; their tested source files and both pool headers match this snapshot. These are focused checks, not a complete-suite run of this snapshot.

Redis diagnostic tests retain inspected exception snapshots until their concurrent observer joins. The original Linux TSan and Windows fault-injection failures, source mapping and focused logs remain in the validation archive. The pool correction removes one allocation boundary; it does not guarantee that every child-close path can recover from heap exhaustion. Performance measurements remain tied to 2aa5bc0, before this shutdown-only correction.

ASan leak checking is disabled on this macOS host. The complete-suite ASan runs also disable online symbolization to avoid a diagnosed symbolizer hang; memory instrumentation remains enabled. No sanitizer suppressions or forced-include workarounds were added. Only the existing reference-KCP test translation unit excludes null,object-size instrumentation.

RUDP Interoperability Evidence

The following targeted runs were recorded on 2026-10-13. Their source revisions and scope remain in the linked record; their earlier complete-check counts do not describe the current project.

Instrumentation Scope Cases Result
ASan/UBSan Standalone Asio: ARQ, reference ARQ/FEC interop, RUDP/FEC, lifecycle, detail and concurrency 109 Passed
TSan Standalone Asio: FEC, reference FEC interop, RUDP/FEC, lifecycle, detail and concurrency 86 Passed

The RUDP FEC endpoint suite passed 11 cases and 2,564 assertions in both Release dependency configurations and the separate ASan/UBSan and TSan builds. Real zephyr/arknet process pairs passed all 12 scenarios per dependency configuration, including reconnect, ARK-style binary headers, 4096-byte bodies, ARQ packet loss and reordering. The relay preserves SYN/ACK/FIN; this does not establish reliable shutdown when FIN is lost.

Logs and reproduction commands record the source revision and exact scope. The test-only canonical KCP source disables null,object-size instrumentation; arknet’s own code remains fully instrumented. RUDP performance has a separate report.

Sanitizers run separately from performance measurements. LeakSanitizer support differs by platform; a passing Apple ASan run is not a Linux leak-check result.

Sanitizer Checks

Sanitizers instrument a development build and report errors observed while tests run.

Tool Checks
ASan (AddressSanitizer) Memory errors such as out-of-bounds access, use-after-free and double-free
TSan (ThreadSanitizer) Unsynchronized concurrent memory accesses where at least one access is a write
UBSan (UndefinedBehaviorSanitizer) Selected undefined behavior, such as signed integer overflow, invalid shifts and misaligned access

ASan/UBSan and TSan use separate builds. They add execution overhead and are disabled for published performance measurements. A passing run covers the paths and thread schedules exercised; it does not prove that all errors are absent.

CI and Remaining Coverage

CI checks Linux/macOS/Windows with both dependency configurations; Linux also runs ASan/UBSan and TSan. Job names include OS, dependency, TLS and check mode. The full 14 checks run for pull requests, merge-queue candidates and manual dispatches. A successful PR head does not validate the queue candidate containing the latest main and preceding queued changes. CI does not repeat the same matrix after the candidate is merged into main. The README badge shows merge-queue runs.

Runs keep the existing per-PR or ref concurrency group. A new run does not cancel the active run in that group; it waits for the group. GitHub may replace an older pending run in the same group, so this setting is not a FIFO history of every push (GitHub concurrency rules). Required checks on the candidate still need to succeed. Documentation publishing keeps its separate main-push workflow. CI uploads test logs and runs benchmark smoke checks; performance report matrices come from local measurements.

Local RUDP measurements cover random/burst loss, delay, duplication and reordering, with six 120-second sustained runs. They cannot predict cross-host capacity or WAN latency. Descriptor exhaustion, production-duration endurance and ARK business acceptance remain to be validated.

All 14 independent client/server usage programs were also built with both dependency configurations. The seven protocol pairs per dependency configuration verified echo contents and all 28 processes exited normally. Build/run logs and reproduction scripts retain this check separately from timed performance measurements.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close