[INFO] cloning repository https://github.com/123654lkj/ll-vpn
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/123654lkj/ll-vpn" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2F123654lkj%2Fll-vpn", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2F123654lkj%2Fll-vpn'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 857f76728deb1786edcfdc7fa59c6ef9b0548964
[INFO] testing 123654lkj/ll-vpn against 1.98.0-beta.1 for beta-1.98-1
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2F123654lkj%2Fll-vpn" "/workspace/builds/worker-0-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-0-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/123654lkj/ll-vpn
[INFO] finished tweaking git repo https://github.com/123654lkj/ll-vpn
[INFO] tweaked toml for git repo https://github.com/123654lkj/ll-vpn written to /workspace/builds/worker-0-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/123654lkj/ll-vpn on toolchain 1.98.0-beta.1
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/123654lkj/ll-vpn already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.1" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:3d5ced03c013a94a2f102a4510f48a6e9184255caf5fd8244f58017bde7f5210" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536
[INFO] running `Command { std: "docker" "start" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling typenum v1.20.1
[INFO] [stderr]    Compiling subtle v2.6.1
[INFO] [stderr]    Compiling zeroize v1.8.2
[INFO] [stderr]    Compiling opaque-debug v0.3.1
[INFO] [stderr]    Compiling memchr v2.8.1
[INFO] [stderr]    Compiling zerocopy v0.8.50
[INFO] [stderr]    Compiling curve25519-dalek v4.1.3
[INFO] [stderr]    Compiling snow v0.9.6
[INFO] [stderr]    Compiling signature v2.2.0
[INFO] [stderr]    Compiling serde_json v1.0.150
[INFO] [stderr]    Compiling log v0.4.31
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling humantime v2.3.0
[INFO] [stderr]    Compiling termcolor v1.4.1
[INFO] [stderr]    Compiling aho-corasick v1.1.4
[INFO] [stderr]    Compiling getrandom v0.2.17
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling is-terminal v0.4.17
[INFO] [stderr]    Compiling socket2 v0.6.4
[INFO] [stderr]    Compiling mio v1.2.1
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling rand_core v0.6.4
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling generic-array v0.14.7
[INFO] [stderr]    Compiling crypto-common v0.1.7
[INFO] [stderr]    Compiling inout v0.1.4
[INFO] [stderr]    Compiling block-buffer v0.10.4
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling universal-hash v0.5.1
[INFO] [stderr]    Compiling digest v0.10.7
[INFO] [stderr]    Compiling aead v0.5.2
[INFO] [stderr]    Compiling polyval v0.6.2
[INFO] [stderr]    Compiling poly1305 v0.8.0
[INFO] [stderr]    Compiling cipher v0.4.4
[INFO] [stderr]    Compiling chacha20 v0.9.1
[INFO] [stderr]    Compiling aes v0.8.4
[INFO] [stderr]    Compiling ctr v0.9.2
[INFO] [stderr]    Compiling sha2 v0.10.9
[INFO] [stderr]    Compiling blake2 v0.10.6
[INFO] [stderr]    Compiling ghash v0.5.1
[INFO] [stderr]    Compiling chacha20poly1305 v0.10.1
[INFO] [stderr]    Compiling curve25519-dalek-derive v0.1.1
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling tokio-macros v2.7.0
[INFO] [stderr]    Compiling aes-gcm v0.10.3
[INFO] [stderr]    Compiling tokio v1.52.3
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling env_logger v0.10.2
[INFO] [stderr]    Compiling ppv-lite86 v0.2.21
[INFO] [stderr]    Compiling rand_chacha v0.3.1
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling rand v0.8.6
[INFO] [stderr]    Compiling ed25519 v2.2.3
[INFO] [stderr]    Compiling ed25519-dalek v2.2.0
[INFO] [stderr]    Compiling ll-vpn v0.2.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused import: `HashMap`
[INFO] [stdout]   --> src/storage/gc.rs:24:24
[INFO] [stdout]    |
[INFO] [stdout] 24 | use std::collections::{HashMap, HashSet};
[INFO] [stdout]    |                        ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SocketAddr` and `ToSocketAddrs`
[INFO] [stdout]   --> src/vpn/relay.rs:15:40
[INFO] [stdout]    |
[INFO] [stdout] 15 | use std::net::{TcpListener, TcpStream, SocketAddr, ToSocketAddrs};
[INFO] [stdout]    |                                        ^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SystemTime` and `UNIX_EPOCH`
[INFO] [stdout]   --> src/vpn/session.rs:15:36
[INFO] [stdout]    |
[INFO] [stdout] 15 | use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
[INFO] [stdout]    |                                    ^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `diff`
[INFO] [stdout]    --> src/storage/incremental.rs:348:17
[INFO] [stdout]     |
[INFO] [stdout] 348 |             let diff = self
[INFO] [stdout]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_diff`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_name_owned`
[INFO] [stdout]    --> src/storage/incremental.rs:543:13
[INFO] [stdout]     |
[INFO] [stdout] 543 |         let file_name_owned = file_name.to_string();
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_name_owned`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/bootstrap.rs:318:13
[INFO] [stdout]     |
[INFO] [stdout] 318 |         let mut nodes = Vec::new();
[INFO] [stdout]     |             ----^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `node`
[INFO] [stdout]    --> src/vpn/bootstrap.rs:306:9
[INFO] [stdout]     |
[INFO] [stdout] 306 |         node: &BootstrapNode,
[INFO] [stdout]     |         ^^^^ help: if this is intentional, prefix it with an underscore: `_node`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `parsed`
[INFO] [stdout]    --> src/vpn/command.rs:705:9
[INFO] [stdout]     |
[INFO] [stdout] 705 |     let parsed = ParsedAddress::parse(target)
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_parsed`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/relay.rs:245:49
[INFO] [stdout]     |
[INFO] [stdout] 245 |     pub fn return_connection(&self, addr: &str, mut stream: TcpStream) {
[INFO] [stdout]     |                                                 ----^^^^^^
[INFO] [stdout]     |                                                 |
[INFO] [stdout]     |                                                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `local_id`
[INFO] [stdout]    --> src/vpn/relay.rs:355:9
[INFO] [stdout]     |
[INFO] [stdout] 355 |         local_id: NodeID,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_local_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `remote_id`
[INFO] [stdout]    --> src/vpn/session.rs:349:27
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stdout]     |                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_remote_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `sessions`
[INFO] [stdout]    --> src/vpn/session.rs:350:13
[INFO] [stdout]     |
[INFO] [stdout] 350 |         let sessions = self.sessions.lock().unwrap();
[INFO] [stdout]     |             ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_sessions`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `election_timeout` is never read
[INFO] [stdout]    --> src/registry/election.rs:366:5
[INFO] [stdout]     |
[INFO] [stdout] 342 | pub struct ElectionManager {
[INFO] [stdout]     |            --------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 366 |     election_timeout: Duration,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `now_secs` is never used
[INFO] [stdout]     --> src/registry/election.rs:1271:4
[INFO] [stdout]      |
[INFO] [stdout] 1271 | fn now_secs() -> u64 {
[INFO] [stdout]      |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `NONCE_RANDOM_BYTES` is never used
[INFO] [stdout]   --> src/storage/encrypt.rs:71:7
[INFO] [stdout]    |
[INFO] [stdout] 71 | const NONCE_RANDOM_BYTES: usize = 8;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `VERSION_TIMESTAMP_LEN` is never used
[INFO] [stdout]   --> src/storage/version.rs:42:7
[INFO] [stdout]    |
[INFO] [stdout] 42 | const VERSION_TIMESTAMP_LEN: usize = 14; // "20260603120000" = YYYYMMDDHHMMSS
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `peer_id` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:169:5
[INFO] [stdout]     |
[INFO] [stdout] 167 | struct PooledConnection {
[INFO] [stdout]     |        ---------------- field in this struct
[INFO] [stdout] 168 |     stream: TcpStream,
[INFO] [stdout] 169 |     peer_id: Option<NodeID>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `handler` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:294:5
[INFO] [stdout]     |
[INFO] [stdout] 284 | pub struct TcpServer {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 294 |     handler: Option<Arc<dyn Fn(NodeID, Message) + Send + Sync>>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `local_id` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:433:5
[INFO] [stdout]     |
[INFO] [stdout] 431 | pub struct TcpClient {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] 432 |     /// 本地节点 ID
[INFO] [stdout] 433 |     local_id: NodeID,
[INFO] [stdout]     |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `target`, `public_addr`, `started`, `retries`, and `established` are never read
[INFO] [stdout]   --> src/vpn/hole_punch.rs:85:5
[INFO] [stdout]    |
[INFO] [stdout] 83 | struct HolePunchConn {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 84 |     /// 目标节点 ID
[INFO] [stdout] 85 |     target: NodeID,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 86 |     /// 目标公网地址
[INFO] [stdout] 87 |     public_addr: SocketAddr,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 88 |     /// 开始时间
[INFO] [stdout] 89 |     started: Instant,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 90 |     /// 重试次数
[INFO] [stdout] 91 |     retries: u32,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 92 |     /// 是否已建立连接
[INFO] [stdout] 93 |     established: bool,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `HolePunchConn` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `running` is never read
[INFO] [stdout]    --> src/vpn/hole_punch.rs:121:5
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub struct HolePunchManager {
[INFO] [stdout]     |            ---------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 121 |     running: Arc<AtomicBool>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/vpn/session.rs:349:20
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stdout]     |                    ^^^^^ the lifetime is elided here    ^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]     = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard<'_>> {
[INFO] [stdout]     |                                                                     ++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `name`
[INFO] [stdout]    --> src/bin/verify_election.rs:474:17
[INFO] [stdout]     |
[INFO] [stdout] 474 |         for (i, name) in node_names.iter().enumerate() {
[INFO] [stdout]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compute_candidate_hash` is never used
[INFO] [stdout]    --> src/bin/verify_election.rs:434:8
[INFO] [stdout]     |
[INFO] [stdout] 434 |     fn compute_candidate_hash(candidate_id: &NodeID, term: u64) -> u64 {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 32.26s
[INFO] running `Command { std: "docker" "inspect" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling futures-core v0.3.32
[INFO] [stderr]    Compiling tokio v1.52.3
[INFO] [stderr]    Compiling ll-vpn v0.2.0 (/opt/rustwide/workdir)
[INFO] [stderr]    Compiling tokio-stream v0.1.18
[INFO] [stdout] warning: unused import: `HashMap`
[INFO] [stdout]   --> src/storage/gc.rs:24:24
[INFO] [stdout]    |
[INFO] [stdout] 24 | use std::collections::{HashMap, HashSet};
[INFO] [stdout]    |                        ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SocketAddr` and `ToSocketAddrs`
[INFO] [stdout]   --> src/vpn/relay.rs:15:40
[INFO] [stdout]    |
[INFO] [stdout] 15 | use std::net::{TcpListener, TcpStream, SocketAddr, ToSocketAddrs};
[INFO] [stdout]    |                                        ^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SystemTime` and `UNIX_EPOCH`
[INFO] [stdout]   --> src/vpn/session.rs:15:36
[INFO] [stdout]    |
[INFO] [stdout] 15 | use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
[INFO] [stdout]    |                                    ^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling tokio-test v0.4.5
[INFO] [stdout] warning: unused import: `HashMap`
[INFO] [stdout]   --> src/storage/gc.rs:24:24
[INFO] [stdout]    |
[INFO] [stdout] 24 | use std::collections::{HashMap, HashSet};
[INFO] [stdout]    |                        ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unnecessary parentheses around assigned value
[INFO] [stdout]     --> src/vpn/dht.rs:1037:25
[INFO] [stdout]      |
[INFO] [stdout] 1037 |             bytes[31] = (0x10 + i as u8);
[INFO] [stdout]      |                         ^              ^
[INFO] [stdout]      |
[INFO] [stdout]      = note: `#[warn(unused_parens)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: remove these parentheses
[INFO] [stdout]      |
[INFO] [stdout] 1037 -             bytes[31] = (0x10 + i as u8);
[INFO] [stdout] 1037 +             bytes[31] = 0x10 + i as u8;
[INFO] [stdout]      |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unnecessary parentheses around assigned value
[INFO] [stdout]     --> src/vpn/dht.rs:1120:25
[INFO] [stdout]      |
[INFO] [stdout] 1120 |             bytes[31] = (0x10 + i as u8);
[INFO] [stdout]      |                         ^              ^
[INFO] [stdout]      |
[INFO] [stdout] help: remove these parentheses
[INFO] [stdout]      |
[INFO] [stdout] 1120 -             bytes[31] = (0x10 + i as u8);
[INFO] [stdout] 1120 +             bytes[31] = 0x10 + i as u8;
[INFO] [stdout]      |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unnecessary parentheses around assigned value
[INFO] [stdout]     --> src/vpn/dht.rs:1307:25
[INFO] [stdout]      |
[INFO] [stdout] 1307 |             bytes[31] = (0x10 + i as u8);
[INFO] [stdout]      |                         ^              ^
[INFO] [stdout]      |
[INFO] [stdout] help: remove these parentheses
[INFO] [stdout]      |
[INFO] [stdout] 1307 -             bytes[31] = (0x10 + i as u8);
[INFO] [stdout] 1307 +             bytes[31] = 0x10 + i as u8;
[INFO] [stdout]      |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SocketAddr` and `ToSocketAddrs`
[INFO] [stdout]   --> src/vpn/relay.rs:15:40
[INFO] [stdout]    |
[INFO] [stdout] 15 | use std::net::{TcpListener, TcpStream, SocketAddr, ToSocketAddrs};
[INFO] [stdout]    |                                        ^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `SystemTime` and `UNIX_EPOCH`
[INFO] [stdout]   --> src/vpn/session.rs:15:36
[INFO] [stdout]    |
[INFO] [stdout] 15 | use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
[INFO] [stdout]    |                                    ^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `diff`
[INFO] [stdout]    --> src/storage/incremental.rs:348:17
[INFO] [stdout]     |
[INFO] [stdout] 348 |             let diff = self
[INFO] [stdout]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_diff`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_name_owned`
[INFO] [stdout]    --> src/storage/incremental.rs:543:13
[INFO] [stdout]     |
[INFO] [stdout] 543 |         let file_name_owned = file_name.to_string();
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_name_owned`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/bootstrap.rs:318:13
[INFO] [stdout]     |
[INFO] [stdout] 318 |         let mut nodes = Vec::new();
[INFO] [stdout]     |             ----^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `node`
[INFO] [stdout]    --> src/vpn/bootstrap.rs:306:9
[INFO] [stdout]     |
[INFO] [stdout] 306 |         node: &BootstrapNode,
[INFO] [stdout]     |         ^^^^ help: if this is intentional, prefix it with an underscore: `_node`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `parsed`
[INFO] [stdout]    --> src/vpn/command.rs:705:9
[INFO] [stdout]     |
[INFO] [stdout] 705 |     let parsed = ParsedAddress::parse(target)
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_parsed`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/relay.rs:245:49
[INFO] [stdout]     |
[INFO] [stdout] 245 |     pub fn return_connection(&self, addr: &str, mut stream: TcpStream) {
[INFO] [stdout]     |                                                 ----^^^^^^
[INFO] [stdout]     |                                                 |
[INFO] [stdout]     |                                                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `local_id`
[INFO] [stdout]    --> src/vpn/relay.rs:355:9
[INFO] [stdout]     |
[INFO] [stdout] 355 |         local_id: NodeID,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_local_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `remote_id`
[INFO] [stdout]    --> src/vpn/session.rs:349:27
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stdout]     |                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_remote_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `sessions`
[INFO] [stdout]    --> src/vpn/session.rs:350:13
[INFO] [stdout]     |
[INFO] [stdout] 350 |         let sessions = self.sessions.lock().unwrap();
[INFO] [stdout]     |             ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_sessions`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `election_timeout` is never read
[INFO] [stdout]    --> src/registry/election.rs:366:5
[INFO] [stdout]     |
[INFO] [stdout] 342 | pub struct ElectionManager {
[INFO] [stdout]     |            --------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 366 |     election_timeout: Duration,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `now_secs` is never used
[INFO] [stdout]     --> src/registry/election.rs:1271:4
[INFO] [stdout]      |
[INFO] [stdout] 1271 | fn now_secs() -> u64 {
[INFO] [stdout]      |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `NONCE_RANDOM_BYTES` is never used
[INFO] [stdout]   --> src/storage/encrypt.rs:71:7
[INFO] [stdout]    |
[INFO] [stdout] 71 | const NONCE_RANDOM_BYTES: usize = 8;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `VERSION_TIMESTAMP_LEN` is never used
[INFO] [stdout]   --> src/storage/version.rs:42:7
[INFO] [stdout]    |
[INFO] [stdout] 42 | const VERSION_TIMESTAMP_LEN: usize = 14; // "20260603120000" = YYYYMMDDHHMMSS
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `peer_id` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:169:5
[INFO] [stdout]     |
[INFO] [stdout] 167 | struct PooledConnection {
[INFO] [stdout]     |        ---------------- field in this struct
[INFO] [stdout] 168 |     stream: TcpStream,
[INFO] [stdout] 169 |     peer_id: Option<NodeID>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `handler` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:294:5
[INFO] [stdout]     |
[INFO] [stdout] 284 | pub struct TcpServer {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 294 |     handler: Option<Arc<dyn Fn(NodeID, Message) + Send + Sync>>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `local_id` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:433:5
[INFO] [stdout]     |
[INFO] [stdout] 431 | pub struct TcpClient {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] 432 |     /// 本地节点 ID
[INFO] [stdout] 433 |     local_id: NodeID,
[INFO] [stdout]     |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `target`, `public_addr`, `started`, `retries`, and `established` are never read
[INFO] [stdout]   --> src/vpn/hole_punch.rs:85:5
[INFO] [stdout]    |
[INFO] [stdout] 83 | struct HolePunchConn {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 84 |     /// 目标节点 ID
[INFO] [stdout] 85 |     target: NodeID,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 86 |     /// 目标公网地址
[INFO] [stdout] 87 |     public_addr: SocketAddr,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 88 |     /// 开始时间
[INFO] [stdout] 89 |     started: Instant,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 90 |     /// 重试次数
[INFO] [stdout] 91 |     retries: u32,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 92 |     /// 是否已建立连接
[INFO] [stdout] 93 |     established: bool,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `HolePunchConn` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `running` is never read
[INFO] [stdout]    --> src/vpn/hole_punch.rs:121:5
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub struct HolePunchManager {
[INFO] [stdout]     |            ---------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 121 |     running: Arc<AtomicBool>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/vpn/session.rs:349:20
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stdout]     |                    ^^^^^ the lifetime is elided here    ^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]     = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard<'_>> {
[INFO] [stdout]     |                                                                     ++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `diff`
[INFO] [stdout]    --> src/storage/incremental.rs:348:17
[INFO] [stdout]     |
[INFO] [stdout] 348 |             let diff = self
[INFO] [stdout]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_diff`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_name_owned`
[INFO] [stdout]    --> src/storage/incremental.rs:543:13
[INFO] [stdout]     |
[INFO] [stdout] 543 |         let file_name_owned = file_name.to_string();
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_name_owned`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/bootstrap.rs:318:13
[INFO] [stdout]     |
[INFO] [stdout] 318 |         let mut nodes = Vec::new();
[INFO] [stdout]     |             ----^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `node`
[INFO] [stdout]    --> src/vpn/bootstrap.rs:306:9
[INFO] [stdout]     |
[INFO] [stdout] 306 |         node: &BootstrapNode,
[INFO] [stdout]     |         ^^^^ help: if this is intentional, prefix it with an underscore: `_node`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `parsed`
[INFO] [stdout]    --> src/vpn/command.rs:705:9
[INFO] [stdout]     |
[INFO] [stdout] 705 |     let parsed = ParsedAddress::parse(target)
[INFO] [stdout]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_parsed`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/dht.rs:966:13
[INFO] [stdout]     |
[INFO] [stdout] 966 |         let mut local_bytes = [0u8; 32];
[INFO] [stdout]     |             ----^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `evicted`
[INFO] [stdout]     --> src/vpn/dht.rs:1330:22
[INFO] [stdout]      |
[INFO] [stdout] 1330 |             Err(Some(evicted)) => {
[INFO] [stdout]      |                      ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_evicted`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `routes`
[INFO] [stdout]     --> src/vpn/multihop.rs:1002:17
[INFO] [stdout]      |
[INFO] [stdout] 1002 |             let routes = manager.routes.lock().unwrap();
[INFO] [stdout]      |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_routes`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/relay.rs:245:49
[INFO] [stdout]     |
[INFO] [stdout] 245 |     pub fn return_connection(&self, addr: &str, mut stream: TcpStream) {
[INFO] [stdout]     |                                                 ----^^^^^^
[INFO] [stdout]     |                                                 |
[INFO] [stdout]     |                                                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `local_id`
[INFO] [stdout]    --> src/vpn/relay.rs:355:9
[INFO] [stdout]     |
[INFO] [stdout] 355 |         local_id: NodeID,
[INFO] [stdout]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_local_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `remote_id`
[INFO] [stdout]    --> src/vpn/session.rs:349:27
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stdout]     |                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_remote_id`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `sessions`
[INFO] [stdout]    --> src/vpn/session.rs:350:13
[INFO] [stdout]     |
[INFO] [stdout] 350 |         let sessions = self.sessions.lock().unwrap();
[INFO] [stdout]     |             ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_sessions`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/vpn/session.rs:545:13
[INFO] [stdout]     |
[INFO] [stdout] 545 |         let mut session = Session::with_timeout(
[INFO] [stdout]     |             ----^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `now_secs` is never used
[INFO] [stdout]     --> src/registry/election.rs:1271:4
[INFO] [stdout]      |
[INFO] [stdout] 1271 | fn now_secs() -> u64 {
[INFO] [stdout]      |    ^^^^^^^^
[INFO] [stdout]      |
[INFO] [stdout]      = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `make_id` is never used
[INFO] [stdout]     --> src/registry/election.rs:1346:8
[INFO] [stdout]      |
[INFO] [stdout] 1346 |     fn make_id(byte: u8) -> NodeID {
[INFO] [stdout]      |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `NONCE_RANDOM_BYTES` is never used
[INFO] [stdout]   --> src/storage/encrypt.rs:71:7
[INFO] [stdout]    |
[INFO] [stdout] 71 | const NONCE_RANDOM_BYTES: usize = 8;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `make_id_from` is never used
[INFO] [stdout]    --> src/vpn/multihop.rs:642:8
[INFO] [stdout]     |
[INFO] [stdout] 642 |     fn make_id_from(prefix: &[u8]) -> NodeID {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `peer_id` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:169:5
[INFO] [stdout]     |
[INFO] [stdout] 167 | struct PooledConnection {
[INFO] [stdout]     |        ---------------- field in this struct
[INFO] [stdout] 168 |     stream: TcpStream,
[INFO] [stdout] 169 |     peer_id: Option<NodeID>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `handler` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:294:5
[INFO] [stdout]     |
[INFO] [stdout] 284 | pub struct TcpServer {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 294 |     handler: Option<Arc<dyn Fn(NodeID, Message) + Send + Sync>>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `local_id` is never read
[INFO] [stdout]    --> src/vpn/relay.rs:433:5
[INFO] [stdout]     |
[INFO] [stdout] 431 | pub struct TcpClient {
[INFO] [stdout]     |            --------- field in this struct
[INFO] [stdout] 432 |     /// 本地节点 ID
[INFO] [stdout] 433 |     local_id: NodeID,
[INFO] [stdout]     |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `target`, `public_addr`, `started`, `retries`, and `established` are never read
[INFO] [stdout]   --> src/vpn/hole_punch.rs:85:5
[INFO] [stdout]    |
[INFO] [stdout] 83 | struct HolePunchConn {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 84 |     /// 目标节点 ID
[INFO] [stdout] 85 |     target: NodeID,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 86 |     /// 目标公网地址
[INFO] [stdout] 87 |     public_addr: SocketAddr,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 88 |     /// 开始时间
[INFO] [stdout] 89 |     started: Instant,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 90 |     /// 重试次数
[INFO] [stdout] 91 |     retries: u32,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 92 |     /// 是否已建立连接
[INFO] [stdout] 93 |     established: bool,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `HolePunchConn` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `running` is never read
[INFO] [stdout]    --> src/vpn/hole_punch.rs:121:5
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub struct HolePunchManager {
[INFO] [stdout]     |            ---------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 121 |     running: Arc<AtomicBool>,
[INFO] [stdout]     |     ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/vpn/session.rs:349:20
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stdout]     |                    ^^^^^ the lifetime is elided here    ^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]     = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard<'_>> {
[INFO] [stdout]     |                                                                     ++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: comparison is useless due to type limits
[INFO] [stdout]    --> src/vpn/stats.rs:629:17
[INFO] [stdout]     |
[INFO] [stdout] 629 |         assert!(consumed >= 0);
[INFO] [stdout]     |                 ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_comparisons)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `name`
[INFO] [stdout]    --> src/bin/verify_election.rs:474:17
[INFO] [stdout]     |
[INFO] [stdout] 474 |         for (i, name) in node_names.iter().enumerate() {
[INFO] [stdout]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compute_candidate_hash` is never used
[INFO] [stdout]    --> src/bin/verify_election.rs:434:8
[INFO] [stdout]     |
[INFO] [stdout] 434 |     fn compute_candidate_hash(candidate_id: &NodeID, term: u64) -> u64 {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `name`
[INFO] [stdout]    --> src/bin/verify_election.rs:474:17
[INFO] [stdout]     |
[INFO] [stdout] 474 |         for (i, name) in node_names.iter().enumerate() {
[INFO] [stdout]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compute_candidate_hash` is never used
[INFO] [stdout]    --> src/bin/verify_election.rs:434:8
[INFO] [stdout]     |
[INFO] [stdout] 434 |     fn compute_candidate_hash(candidate_id: &NodeID, term: u64) -> u64 {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 23.66s
[INFO] running `Command { std: "docker" "inspect" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.1" "test" "--frozen", kill_on_drop: false }`
[INFO] [stderr] warning: unused import: `HashMap`
[INFO] [stderr]   --> src/storage/gc.rs:24:24
[INFO] [stderr]    |
[INFO] [stderr] 24 | use std::collections::{HashMap, HashSet};
[INFO] [stderr]    |                        ^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `SocketAddr` and `ToSocketAddrs`
[INFO] [stderr]   --> src/vpn/relay.rs:15:40
[INFO] [stderr]    |
[INFO] [stderr] 15 | use std::net::{TcpListener, TcpStream, SocketAddr, ToSocketAddrs};
[INFO] [stderr]    |                                        ^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `SystemTime` and `UNIX_EPOCH`
[INFO] [stderr]   --> src/vpn/session.rs:15:36
[INFO] [stderr]    |
[INFO] [stderr] 15 | use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
[INFO] [stderr]    |                                    ^^^^^^^^^^  ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `diff`
[INFO] [stderr]    --> src/storage/incremental.rs:348:17
[INFO] [stderr]     |
[INFO] [stderr] 348 |             let diff = self
[INFO] [stderr]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_diff`
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `file_name_owned`
[INFO] [stderr]    --> src/storage/incremental.rs:543:13
[INFO] [stderr]     |
[INFO] [stderr] 543 |         let file_name_owned = file_name.to_string();
[INFO] [stderr]     |             ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_name_owned`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> src/vpn/bootstrap.rs:318:13
[INFO] [stderr]     |
[INFO] [stderr] 318 |         let mut nodes = Vec::new();
[INFO] [stderr]     |             ----^^^^^
[INFO] [stderr]     |             |
[INFO] [stderr]     |             help: remove this `mut`
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `node`
[INFO] [stderr]    --> src/vpn/bootstrap.rs:306:9
[INFO] [stderr]     |
[INFO] [stderr] 306 |         node: &BootstrapNode,
[INFO] [stderr]     |         ^^^^ help: if this is intentional, prefix it with an underscore: `_node`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `parsed`
[INFO] [stderr]    --> src/vpn/command.rs:705:9
[INFO] [stderr]     |
[INFO] [stderr] 705 |     let parsed = ParsedAddress::parse(target)
[INFO] [stderr]     |         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_parsed`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> src/vpn/relay.rs:245:49
[INFO] [stderr]     |
[INFO] [stderr] 245 |     pub fn return_connection(&self, addr: &str, mut stream: TcpStream) {
[INFO] [stderr]     |                                                 ----^^^^^^
[INFO] [stderr]     |                                                 |
[INFO] [stderr]     |                                                 help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `local_id`
[INFO] [stderr]    --> src/vpn/relay.rs:355:9
[INFO] [stderr]     |
[INFO] [stderr] 355 |         local_id: NodeID,
[INFO] [stderr]     |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_local_id`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `remote_id`
[INFO] [stderr]    --> src/vpn/session.rs:349:27
[INFO] [stderr]     |
[INFO] [stderr] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stderr]     |                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_remote_id`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `sessions`
[INFO] [stderr]    --> src/vpn/session.rs:350:13
[INFO] [stderr]     |
[INFO] [stderr] 350 |         let sessions = self.sessions.lock().unwrap();
[INFO] [stderr]     |             ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_sessions`
[INFO] [stderr] 
[INFO] [stderr] warning: field `election_timeout` is never read
[INFO] [stderr]    --> src/registry/election.rs:366:5
[INFO] [stderr]     |
[INFO] [stderr] 342 | pub struct ElectionManager {
[INFO] [stderr]     |            --------------- field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 366 |     election_timeout: Duration,
[INFO] [stderr]     |     ^^^^^^^^^^^^^^^^
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: function `now_secs` is never used
[INFO] [stderr]     --> src/registry/election.rs:1271:4
[INFO] [stderr]      |
[INFO] [stderr] 1271 | fn now_secs() -> u64 {
[INFO] [stderr]      |    ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `NONCE_RANDOM_BYTES` is never used
[INFO] [stderr]   --> src/storage/encrypt.rs:71:7
[INFO] [stderr]    |
[INFO] [stderr] 71 | const NONCE_RANDOM_BYTES: usize = 8;
[INFO] [stderr]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `VERSION_TIMESTAMP_LEN` is never used
[INFO] [stderr]   --> src/storage/version.rs:42:7
[INFO] [stderr]    |
[INFO] [stderr] 42 | const VERSION_TIMESTAMP_LEN: usize = 14; // "20260603120000" = YYYYMMDDHHMMSS
[INFO] [stderr]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `peer_id` is never read
[INFO] [stderr]    --> src/vpn/relay.rs:169:5
[INFO] [stderr]     |
[INFO] [stderr] 167 | struct PooledConnection {
[INFO] [stderr]     |        ---------------- field in this struct
[INFO] [stderr] 168 |     stream: TcpStream,
[INFO] [stderr] 169 |     peer_id: Option<NodeID>,
[INFO] [stderr]     |     ^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `handler` is never read
[INFO] [stderr]    --> src/vpn/relay.rs:294:5
[INFO] [stderr]     |
[INFO] [stderr] 284 | pub struct TcpServer {
[INFO] [stderr]     |            --------- field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 294 |     handler: Option<Arc<dyn Fn(NodeID, Message) + Send + Sync>>,
[INFO] [stderr]     |     ^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `local_id` is never read
[INFO] [stderr]    --> src/vpn/relay.rs:433:5
[INFO] [stderr]     |
[INFO] [stderr] 431 | pub struct TcpClient {
[INFO] [stderr]     |            --------- field in this struct
[INFO] [stderr] 432 |     /// 本地节点 ID
[INFO] [stderr] 433 |     local_id: NodeID,
[INFO] [stderr]     |     ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: fields `target`, `public_addr`, `started`, `retries`, and `established` are never read
[INFO] [stderr]   --> src/vpn/hole_punch.rs:85:5
[INFO] [stderr]    |
[INFO] [stderr] 83 | struct HolePunchConn {
[INFO] [stderr]    |        ------------- fields in this struct
[INFO] [stderr] 84 |     /// 目标节点 ID
[INFO] [stderr] 85 |     target: NodeID,
[INFO] [stderr]    |     ^^^^^^
[INFO] [stderr] 86 |     /// 目标公网地址
[INFO] [stderr] 87 |     public_addr: SocketAddr,
[INFO] [stderr]    |     ^^^^^^^^^^^
[INFO] [stderr] 88 |     /// 开始时间
[INFO] [stderr] 89 |     started: Instant,
[INFO] [stderr]    |     ^^^^^^^
[INFO] [stderr] 90 |     /// 重试次数
[INFO] [stderr] 91 |     retries: u32,
[INFO] [stderr]    |     ^^^^^^^
[INFO] [stderr] 92 |     /// 是否已建立连接
[INFO] [stderr] 93 |     established: bool,
[INFO] [stderr]    |     ^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `HolePunchConn` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: field `running` is never read
[INFO] [stderr]    --> src/vpn/hole_punch.rs:121:5
[INFO] [stderr]     |
[INFO] [stderr] 111 | pub struct HolePunchManager {
[INFO] [stderr]     |            ---------------- field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 121 |     running: Arc<AtomicBool>,
[INFO] [stderr]     |     ^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stderr]    --> src/vpn/session.rs:349:20
[INFO] [stderr]     |
[INFO] [stderr] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard> {
[INFO] [stderr]     |                    ^^^^^ the lifetime is elided here    ^^^^^^^^^^^^ the same lifetime is hidden here
[INFO] [stderr]     |
[INFO] [stderr]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stderr]     = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stderr] help: use `'_` for type paths
[INFO] [stderr]     |
[INFO] [stderr] 349 |     pub fn get_mut(&self, remote_id: &NodeID) -> Option<SessionGuard<'_>> {
[INFO] [stderr]     |                                                                     ++++
[INFO] [stderr] 
[INFO] [stderr] warning: unnecessary parentheses around assigned value
[INFO] [stderr]     --> src/vpn/dht.rs:1037:25
[INFO] [stderr]      |
[INFO] [stderr] 1037 |             bytes[31] = (0x10 + i as u8);
[INFO] [stderr]      |                         ^              ^
[INFO] [stderr]      |
[INFO] [stderr]      = note: `#[warn(unused_parens)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] help: remove these parentheses
[INFO] [stderr]      |
[INFO] [stderr] 1037 -             bytes[31] = (0x10 + i as u8);
[INFO] [stderr] 1037 +             bytes[31] = 0x10 + i as u8;
[INFO] [stderr]      |
[INFO] [stderr] 
[INFO] [stderr] warning: unnecessary parentheses around assigned value
[INFO] [stderr]     --> src/vpn/dht.rs:1120:25
[INFO] [stderr]      |
[INFO] [stderr] 1120 |             bytes[31] = (0x10 + i as u8);
[INFO] [stderr]      |                         ^              ^
[INFO] [stderr]      |
[INFO] [stderr] help: remove these parentheses
[INFO] [stderr]      |
[INFO] [stderr] 1120 -             bytes[31] = (0x10 + i as u8);
[INFO] [stderr] 1120 +             bytes[31] = 0x10 + i as u8;
[INFO] [stderr]      |
[INFO] [stderr] 
[INFO] [stderr] warning: unnecessary parentheses around assigned value
[INFO] [stderr]     --> src/vpn/dht.rs:1307:25
[INFO] [stderr]      |
[INFO] [stderr] 1307 |             bytes[31] = (0x10 + i as u8);
[INFO] [stderr]      |                         ^              ^
[INFO] [stderr]      |
[INFO] [stderr] help: remove these parentheses
[INFO] [stderr]      |
[INFO] [stderr] 1307 -             bytes[31] = (0x10 + i as u8);
[INFO] [stderr] 1307 +             bytes[31] = 0x10 + i as u8;
[INFO] [stderr]      |
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> src/vpn/dht.rs:966:13
[INFO] [stderr]     |
[INFO] [stderr] 966 |         let mut local_bytes = [0u8; 32];
[INFO] [stderr]     |             ----^^^^^^^^^^^
[INFO] [stderr]     |             |
[INFO] [stderr]     |             help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `evicted`
[INFO] [stderr]     --> src/vpn/dht.rs:1330:22
[INFO] [stderr]      |
[INFO] [stderr] 1330 |             Err(Some(evicted)) => {
[INFO] [stderr]      |                      ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_evicted`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `routes`
[INFO] [stderr]     --> src/vpn/multihop.rs:1002:17
[INFO] [stderr]      |
[INFO] [stderr] 1002 |             let routes = manager.routes.lock().unwrap();
[INFO] [stderr]      |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_routes`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> src/vpn/session.rs:545:13
[INFO] [stderr]     |
[INFO] [stderr] 545 |         let mut session = Session::with_timeout(
[INFO] [stderr]     |             ----^^^^^^^
[INFO] [stderr]     |             |
[INFO] [stderr]     |             help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: function `now_secs` is never used
[INFO] [stderr]     --> src/registry/election.rs:1271:4
[INFO] [stderr]      |
[INFO] [stderr] 1271 | fn now_secs() -> u64 {
[INFO] [stderr]      |    ^^^^^^^^
[INFO] [stderr]      |
[INFO] [stderr]      = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: function `make_id` is never used
[INFO] [stderr]     --> src/registry/election.rs:1346:8
[INFO] [stderr]      |
[INFO] [stderr] 1346 |     fn make_id(byte: u8) -> NodeID {
[INFO] [stderr]      |        ^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `make_id_from` is never used
[INFO] [stderr]    --> src/vpn/multihop.rs:642:8
[INFO] [stderr]     |
[INFO] [stderr] 642 |     fn make_id_from(prefix: &[u8]) -> NodeID {
[INFO] [stderr]     |        ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: comparison is useless due to type limits
[INFO] [stderr]    --> src/vpn/stats.rs:629:17
[INFO] [stderr]     |
[INFO] [stderr] 629 |         assert!(consumed >= 0);
[INFO] [stderr]     |                 ^^^^^^^^^^^^^
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(unused_comparisons)]` on by default
[INFO] [stderr] 
[INFO] [stderr] warning: `ll-vpn` (lib) generated 22 warnings (run `cargo fix --lib -p ll-vpn` to apply 13 suggestions)
[INFO] [stderr] warning: `ll-vpn` (lib test) generated 30 warnings (19 duplicates) (run `cargo fix --lib -p ll-vpn --tests` to apply 7 suggestions)
[INFO] [stderr] warning: unused variable: `name`
[INFO] [stderr]    --> src/bin/verify_election.rs:474:17
[INFO] [stderr]     |
[INFO] [stderr] 474 |         for (i, name) in node_names.iter().enumerate() {
[INFO] [stderr]     |                 ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: function `compute_candidate_hash` is never used
[INFO] [stderr]    --> src/bin/verify_election.rs:434:8
[INFO] [stderr]     |
[INFO] [stderr] 434 |     fn compute_candidate_hash(candidate_id: &NodeID, term: u64) -> u64 {
[INFO] [stderr]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: `ll-vpn` (bin "verify_election") generated 2 warnings (run `cargo fix --bin "verify_election" -p ll-vpn` to apply 1 suggestion)
[INFO] [stderr] warning: `ll-vpn` (bin "verify_election" test) generated 2 warnings (2 duplicates)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.19s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/ll_vpn-32db9b167e648779)
[INFO] [stdout] 
[INFO] [stdout] running 605 tests
[INFO] [stdout] test address::tests::test_address_error_display ... ok
[INFO] [stdout] test address::tests::test_mem_resolver_cache ... ok
[INFO] [stdout] test address::tests::test_mem_resolver_clear_cache ... ok
[INFO] [stdout] test address::tests::test_mem_resolver_static_mapping ... ok
[INFO] [stdout] test address::tests::test_parse_invalid_empty_name ... ok
[INFO] [stdout] test address::tests::test_mem_resolver_unknown_node ... ok
[INFO] [stdout] test address::tests::test_is_node_address ... ok
[INFO] [stdout] test address::tests::test_mem_resolver_known_nodes ... ok
[INFO] [stdout] test address::tests::test_parse_invalid_port_overflow ... ok
[INFO] [stdout] test address::tests::test_parse_invalid_no_prefix ... ok
[INFO] [stdout] test address::tests::test_parse_invalid_port ... ok
[INFO] [stdout] test address::tests::test_parse_invalid_port_zero ... ok
[INFO] [stdout] test address::tests::test_parse_node_with_large_port ... ok
[INFO] [stdout] test address::tests::test_parse_node_with_port ... ok
[INFO] [stdout] test address::tests::test_resolve_address_invalid_format ... ok
[INFO] [stdout] test address::tests::test_resolve_address ... ok
[INFO] [stdout] test lan_router::tests::test_build_and_parse_discover ... ok
[INFO] [stdout] test lan_router::tests::test_build_and_parse_discover_reply ... ok
[INFO] [stdout] test lan_router::tests::test_build_and_parse_data ... ok
[INFO] [stdout] test lan_router::tests::test_lan_node_is_offline ... ok
[INFO] [stdout] test lan_router::tests::test_lan_router_status ... ok
[INFO] [stdout] test lan_router::tests::test_parse_frame_invalid_name_length ... ok
[INFO] [stdout] test address::tests::test_resolve_address_unknown ... ok
[INFO] [stdout] test lan_router::tests::test_lan_node_is_online ... ok
[INFO] [stdout] test registry::center::tests::test_cache_cleanup ... ok
[INFO] [stdout] test lan_router::tests::test_lan_router_custom_port ... ok
[INFO] [stdout] test registry::center::tests::test_cache_get_unknown ... ok
[INFO] [stdout] test lan_router::tests::test_lan_router_creation ... ok
[INFO] [stdout] test registry::center::tests::test_cache_cleanup_keeps_fresh ... ok
[INFO] [stdout] test registry::center::tests::test_cache_new_is_empty ... ok
[INFO] [stdout] test registry::center::tests::test_cache_insert_and_get ... ok
[INFO] [stdout] test registry::center::tests::test_dirty_flag_cleared_without_io ... ok
[INFO] [stdout] test registry::center::tests::test_lookup_payload_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_list_nodes_response_payload_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_cache_get_expired ... ok
[INFO] [stdout] test registry::center::tests::test_lookup_response_payload_found ... ok
[INFO] [stdout] test registry::center::tests::test_lookup_response_payload_not_found ... ok
[INFO] [stdout] test registry::center::tests::test_node_id_from_hex_invalid ... ok
[INFO] [stdout] test registry::center::tests::test_parse_list_nodes_response_success ... ok
[INFO] [stdout] test registry::center::tests::test_parse_lookup_response_not_found ... ok
[INFO] [stdout] test registry::center::tests::test_parse_list_nodes_response_wrong_type ... ok
[INFO] [stdout] test registry::center::tests::test_parse_lookup_response_wrong_type ... ok
[INFO] [stdout] test registry::center::tests::test_parse_register_ack_empty ... ok
[INFO] [stdout] test address::tests::test_caching_resolver ... ok
[INFO] [stdout] test address::tests::test_mem_resolver_cache_expiry ... ok
[INFO] [stdout] test address::tests::test_parse_node_simple ... ok
[INFO] [stdout] test address::tests::test_resolve_address_with_port ... ok
[INFO] [stdout] test registry::center::tests::test_parse_reverse_lookup_response_found ... ok
[INFO] [stdout] test registry::center::tests::test_parse_reverse_lookup_response_wrong_type ... ok
[INFO] [stdout] test lan_router::tests::test_parse_frame_invalid_type ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_empty ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_lookup ... ok
[INFO] [stdout] test lan_router::tests::test_parse_frame_too_short ... ok
[INFO] [stdout] test lan_router::tests::test_router_name ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_register ... ok
[INFO] [stdout] test registry::center::tests::test_parse_register_ack_success ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_lookup_not_found ... ok
[INFO] [stdout] test registry::center::tests::test_cache_remove ... ok
[INFO] [stdout] test registry::center::tests::test_cache_clear ... ok
[INFO] [stdout] test registry::center::tests::test_parse_register_ack_wrong_type ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_response_types_return_none ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_register_duplicate ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_reverse_lookup ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_list_nodes ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_invalid_subtype ... ok
[INFO] [stdout] test registry::center::tests::test_register_ack_payload_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_register_payload_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_registry_entry_new ... ok
[INFO] [stdout] test lan_router::tests::test_udp_message_type_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_process_message_reverse_lookup_not_found ... ok
[INFO] [stdout] test registry::center::tests::test_parse_lookup_response_success ... ok
[INFO] [stdout] test registry::center::tests::test_registry_data_serialization ... ok
[INFO] [stdout] test registry::center::tests::test_registry_error_display_already_registered ... ok
[INFO] [stdout] test registry::center::tests::test_registry_error_display_io ... ok
[INFO] [stdout] test registry::center::tests::test_registry_error_display_lock_poisoned ... ok
[INFO] [stdout] test registry::center::tests::test_registry_error_display_not_found ... ok
[INFO] [stdout] test registry::center::tests::test_registry_error_display_serialize ... ok
[INFO] [stdout] test registry::center::tests::test_registry_msg_type_from_u8_invalid ... ok
[INFO] [stdout] test registry::center::tests::test_registry_msg_type_from_u8_all_variants ... ok
[INFO] [stdout] test registry::center::tests::test_registry_msg_type_to_u8_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_reverse_lookup_response_not_found ... ok
[INFO] [stdout] test registry::center::tests::test_reverse_lookup_payload_roundtrip ... ok
[INFO] [stdout] test registry::center::tests::test_reverse_lookup_response_found ... ok
[INFO] [stdout] test registry::center::tests::test_server_new_is_empty ... ok
[INFO] [stdout] test registry::center::tests::test_server_reverse_lookup ... ok
[INFO] [stdout] test registry::center::tests::test_server_reverse_lookup_unknown ... ok
[INFO] [stdout] test registry::center::tests::test_server_update_heartbeat ... ok
[INFO] [stdout] test registry::center::tests::test_server_upsert_creates_new ... ok
[INFO] [stdout] test registry::center::tests::test_server_upsert_updates_existing ... ok
[INFO] [stdout] test registry::election::tests::test_election_config_default ... ok
[INFO] [stdout] test registry::center::tests::test_server_update_heartbeat_unknown ... ok
[INFO] [stdout] test registry::election::tests::test_election_error_display ... ok
[INFO] [stdout] test registry::center::tests::test_server_upsert_updates_reverse_map ... ok
[INFO] [stdout] test registry::center::tests::test_server_lookup_unknown ... ok
[INFO] [stdout] test registry::center::tests::test_registry_entry_touch ... ok
[INFO] [stdout] test registry::election::tests::test_compute_candidate_hash ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_add_known_nodes ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_sync_request_as_follower ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_become_follower_higher_term ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_sync_response ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_election_result ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_heartbeat_monitoring ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_election_request ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_remove_known_node ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_set_registry ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_start_election_no_nodes ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_registry_control_callback ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_payload_roundtrip ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_should_start_election ... ok
[INFO] [stdout] test registry::center::tests::test_server_list_nodes ... ok
[INFO] [stdout] test registry::center::tests::test_server_register_and_lookup ... ok
[INFO] [stdout] test registry::center::tests::test_server_register_duplicate ... ok
[INFO] [stdout] test registry::election::tests::test_election_message_type_conversion ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_vote_counting ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_old_term_rejected ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_new ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_with_custom_config ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_registry_change ... ok
[INFO] [stdout] test router::tests::test_mock_router_send_failure ... ok
[INFO] [stdout] test router::tests::test_route_table_best_route ... ok
[INFO] [stdout] test router::tests::test_mock_router_send_success ... ok
[INFO] [stdout] test registry::election::tests::test_registry_status_display ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_sync_request_as_leader ... ok
[INFO] [stdout] test registry::center::tests::test_node_id_hex_roundtrip ... ok
[INFO] [stdout] test registry::election::tests::test_registry_status_helpers ... ok
[INFO] [stdout] test registry::election::tests::test_should_vote_for_deterministic ... ok
[INFO] [stdout] test router::tests::test_route_table_clear ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_handle_sync_request_leader_demotion ... ok
[INFO] [stdout] test router::tests::test_route_table_upsert_and_lookup ... ok
[INFO] [stdout] test router::tests::test_router_manager ... ok
[INFO] [stdout] test router::tests::test_route_table_is_empty ... ok
[INFO] [stdout] test storage::chunk::tests::empty_file ... ok
[INFO] [stdout] test storage::chunk::tests::custom_chunk_size ... ok
[INFO] [stdout] test router::tests::test_route_table_remove ... ok
[INFO] [stdout] test router::tests::test_router_error_display ... ok
[INFO] [stdout] test router::tests::test_router_status_display ... ok
[INFO] [stdout] test registry::election::tests::test_election_manager_start_stop ... ok
[INFO] [stdout] test storage::chunk::tests::single_byte_file ... ok
[INFO] [stdout] test lan_router::tests::test_broadcast_discover ... FAILED
[INFO] [stdout] test lan_router::tests::test_udp_socket_binding ... FAILED
[INFO] [stdout] test lan_router::tests::test_send_to_unknown_node ... FAILED
[INFO] [stdout] test storage::chunk::tests::small_file_yields_one_chunk ... ok
[INFO] [stdout] test storage::chunk::tests::manifest_serde_round_trip ... ok
[INFO] [stdout] test storage::chunk::tests::zero_chunk_size_falls_back_to_default ... ok
[INFO] [stdout] test storage::diff::tests::appended_data_detected_as_added ... ok
[INFO] [stdout] test storage::chunk::tests::one_byte_over_chunk_size ... ok
[INFO] [stdout] test storage::diff::tests::chunk_size_mismatch_returns_error ... ok
[INFO] [stdout] test storage::diff::tests::diff_file_nonexistent_path ... ok
[INFO] [stdout] test storage::diff::tests::empty_files_match ... ok
[INFO] [stdout] test storage::diff::tests::empty_manifest_non_empty_data ... ok
[INFO] [stdout] test storage::diff::tests::format_modified_report ... ok
[INFO] [stdout] test storage::diff::tests::diff_file_roundtrip ... ok
[INFO] [stdout] test storage::diff::tests::format_report_contains_key_info ... ok
[INFO] [stdout] test storage::diff::tests::large_chunk_size_preserved ... ok
[INFO] [stdout] test storage::diff::tests::min_chunk_size_clamped ... ok
[INFO] [stdout] test storage::diff::tests::mixed_add_modify_delete ... ok
[INFO] [stdout] test storage::diff::tests::multiple_modified_blocks ... ok
[INFO] [stdout] test storage::diff::tests::identical_files_no_diff ... ok
[INFO] [stdout] test storage::diff::tests::report_identical_files ... ok
[INFO] [stdout] test storage::diff::tests::report_modified_file_estimates_transfer ... ok
[INFO] [stdout] test storage::diff::tests::single_chunk_file_modified ... ok
[INFO] [stdout] test storage::diff::tests::single_byte_modification_detected ... ok
[INFO] [stdout] test storage::download::tests::test_create_task_multiple_times ... ok
[INFO] [stdout] test storage::diff::tests::truncated_data_detected_as_deleted ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_active_downloads_after_cancel ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_active_downloads ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_cancel_nonexistent ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_complete_block ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_cancel ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_create_task ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_fail_block ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_get_status_nonexistent ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_fail_then_recover ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_select_source_empty ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_select_source_load_balancing ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_select_source_single ... ok
[INFO] [stdout] test storage::download::tests::test_download_manager_select_source_all_equal_load ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_eta_zero_elapsed ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_fraction ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_new ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_tracking_accuracy ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_update ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_eta ... ok
[INFO] [stdout] test storage::download::tests::test_download_progress_zero_blocks ... ok
[INFO] [stdout] test storage::download::tests::test_full_download_flow ... ok
[INFO] [stdout] test storage::download::tests::test_multiple_concurrent_downloads ... ok
[INFO] [stdout] test storage::download::tests::test_node_load_tracking ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_drain_ordered_all ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_can_assemble_edge ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_new_empty ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_drain_ordered_partial ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_push_in_order ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_push_invalid_index ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_push_duplicate_rejected ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_remaining ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_with_download_manager ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_push_out_of_order ... ok
[INFO] [stdout] test storage::download::tests::test_reorder_buffer_zero_expected ... ok
[INFO] [stdout] test storage::encrypt::tests::decrypt_wrong_index_fails ... ok
[INFO] [stdout] test storage::encrypt::tests::different_chunks_have_different_nonces ... ok
[INFO] [stdout] test storage::encrypt::tests::different_chunks_have_embedded_index ... ok
[INFO] [stdout] test storage::encrypt::tests::encrypt_decrypt_empty_data ... ok
[INFO] [stdout] test storage::encrypt::tests::different_key_cannot_decrypt ... ok
[INFO] [stdout] test storage::encrypt::tests::encrypt_decrypt_multiple_chunks ... ok
[INFO] [stdout] test storage::encrypt::tests::encrypt_decrypt_round_trip ... ok
[INFO] [stdout] test storage::encrypt::tests::encrypted_chunk_size_is_plaintext_plus_tag ... ok
[INFO] [stdout] test storage::encrypt::tests::generate_key_produces_non_zero ... ok
[INFO] [stdout] test storage::encrypt::tests::generate_key_produces_unique_keys ... ok
[INFO] [stdout] test storage::encrypt::tests::nonce_length_is_twelve_bytes ... ok
[INFO] [stdout] test storage::encrypt::tests::same_key_consistent ... ok
[INFO] [stdout] test storage::encrypt::tests::tampered_ciphertext_fails_auth ... ok
[INFO] [stdout] test storage::encrypt::tests::tampered_nonce_fails_auth ... ok
[INFO] [stdout] test storage::gc::tests::test_collect_all_referenced ... ok
[INFO] [stdout] test storage::gc::tests::test_collect_result_display_clean ... ok
[INFO] [stdout] test storage::gc::tests::test_collect_result_display_has_work ... ok
[INFO] [stdout] test storage::gc::tests::test_collect_with_versions ... ok
[INFO] [stdout] test storage::gc::tests::test_gc_new ... ok
[INFO] [stdout] test storage::chunk::tests::reassembly_wrong_chunk_count ... ok
[INFO] [stdout] test storage::gc::tests::test_prune_old_versions_under_limit ... ok
[INFO] [stdout] test storage::gc::tests::test_storage_stats_display ... ok
[INFO] [stdout] test storage::gc::tests::test_storage_stats_empty ... ok
[INFO] [stdout] test storage::chunk::tests::exactly_chunk_size ... ok
[INFO] [stdout] test storage::gc::tests::test_storage_stats_with_versions ... ok
[INFO] [stdout] test storage::incremental::tests::test_compute_hash_consistency ... ok
[INFO] [stdout] test storage::gc::tests::test_storage_stats_with_data ... ok
[INFO] [stdout] test storage::incremental::tests::test_incremental_sync_new ... ok
[INFO] [stdout] test storage::incremental::tests::test_incremental_sync_with_chunk_size ... ok
[INFO] [stdout] test storage::incremental::tests::test_identical_data_diff_empty ... ok
[INFO] [stdout] test storage::incremental::tests::test_needs_sync_new_file ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_result_display_in_sync ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_result_display_transferred ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_get_nonexistent ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_list_files ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_new_is_empty ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_remove ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_serde ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_upsert_and_get ... ok
[INFO] [stdout] test storage::incremental::tests::test_sync_state_store_upsert_overwrites ... ok
[INFO] [stdout] test storage::metadata::tests::test_add_block_node ... ok
[INFO] [stdout] test storage::metadata::tests::test_add_block_node_creates_new_block ... ok
[INFO] [stdout] test storage::incremental::tests::test_local_diff_against_manifest ... ok
[INFO] [stdout] test storage::metadata::tests::test_add_block_node_dedup ... ok
[INFO] [stdout] test storage::metadata::tests::test_add_block_nodes_batch ... ok
[INFO] [stdout] test storage::metadata::tests::test_dirty_cleared ... ok
[INFO] [stdout] test storage::metadata::tests::test_contains ... ok
[INFO] [stdout] test storage::metadata::tests::test_error_display ... ok
[INFO] [stdout] test storage::metadata::tests::test_get_block_distribution ... ok
[INFO] [stdout] test storage::metadata::tests::test_list_files ... ok
[INFO] [stdout] test storage::metadata::tests::test_get_block_nodes ... ok
[INFO] [stdout] test storage::metadata::tests::test_load_nonexistent_file ... ok
[INFO] [stdout] test storage::metadata::tests::test_mark_encrypted ... ok
[INFO] [stdout] test storage::metadata::tests::test_mark_encrypted_nonexistent ... ok
[INFO] [stdout] test storage::metadata::tests::test_new_is_empty ... ok
[INFO] [stdout] test storage::metadata::tests::test_query_nonexistent ... ok
[INFO] [stdout] test storage::metadata::tests::test_persistence_roundtrip ... ok
[INFO] [stdout] test storage::metadata::tests::test_register_and_query ... ok
[INFO] [stdout] test storage::chunk::tests::verify_chunk_ok ... ok
[INFO] [stdout] test storage::metadata::tests::test_remove_file ... ok
[INFO] [stdout] test storage::metadata::tests::test_register_duplicate ... ok
[INFO] [stdout] test storage::metadata::tests::test_remove_nonexistent ... ok
[INFO] [stdout] test storage::metadata::tests::test_sync_from_empty_accepts_all ... ok
[INFO] [stdout] test storage::metadata::tests::test_sync_keeps_local_if_newer ... ok
[INFO] [stdout] test storage::metadata::tests::test_sync_tiebreaker ... ok
[INFO] [stdout] test storage::metadata::tests::test_upsert_creates_new ... ok
[INFO] [stdout] test storage::metadata::tests::test_upsert_updates_existing ... ok
[INFO] [stdout] test storage::version::tests::test_civil_date_epoch ... ok
[INFO] [stdout] test storage::version::tests::test_civil_date_known ... ok
[INFO] [stdout] test storage::version::tests::test_create_snapshot ... ok
[INFO] [stdout] test storage::version::tests::test_file_versions_get ... ok
[INFO] [stdout] test storage::version::tests::test_file_versions_new_is_empty ... ok
[INFO] [stdout] test storage::version::tests::test_file_versions_prune_over_limit ... ok
[INFO] [stdout] test storage::version::tests::test_file_versions_prune_under_limit ... ok
[INFO] [stdout] test storage::version::tests::test_format_timestamp_epoch ... ok
[INFO] [stdout] test storage::version::tests::test_format_timestamp_known_value ... ok
[INFO] [stdout] test storage::version::tests::test_get_version ... ok
[INFO] [stdout] test storage::version::tests::test_has_versions ... ok
[INFO] [stdout] test storage::version::tests::test_latest_version ... ok
[INFO] [stdout] test storage::version::tests::test_list_files ... ok
[INFO] [stdout] test storage::version::tests::test_list_versions_empty ... ok
[INFO] [stdout] test storage::version::tests::test_load_nonexistent_file ... ok
[INFO] [stdout] test storage::version::tests::test_multiple_snapshots ... ok
[INFO] [stdout] test storage::version::tests::test_file_versions_push_and_latest ... ok
[INFO] [stdout] test storage::chunk::tests::reassembly_chunk_size_mismatch ... ok
[INFO] [stdout] test storage::chunk::tests::verify_chunk_fail_on_tampered_data ... ok
[INFO] [stdout] test storage::version::tests::test_remove_file ... ok
[INFO] [stdout] test storage::version::tests::test_prune_versions_nonexistent ... ok
[INFO] [stdout] test storage::version::tests::test_remove_file_nonexistent ... ok
[INFO] [stdout] test storage::version::tests::test_restore_version_not_found ... ok
[INFO] [stdout] test storage::version::tests::test_save_and_load ... ok
[INFO] [stdout] test storage::version::tests::test_total_versions ... ok
[INFO] [stdout] test storage::version::tests::test_restore_version ... ok
[INFO] [stdout] test storage::version::tests::test_version_store_get_or_create_mut ... ok
[INFO] [stdout] test storage::version::tests::test_version_store_new ... ok
[INFO] [stdout] test storage::version::tests::test_version_entry_creation ... ok
[INFO] [stdout] test storage::version::tests::test_version_store_total_versions ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_config_from_json ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_config_from_json_invalid ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_config_add_node ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_config_from_yaml_simple ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_config_new ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_error_display ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_manager_add_known_node ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_manager_new ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_manager_empty_config ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_manager_remove_known_node ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_node_new ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_node_with_priority ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_request_too_short ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_request_roundtrip ... ok
[INFO] [stdout] test vpn::bootstrap::tests::test_bootstrap_request_type_conversion ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_cmd_full_flow ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_cmd_invalid_target ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_cmd_unknown_node ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_nodes_empty ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_cmd_invalid_address ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_ping_full_flow ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_ping_invalid_target ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_status ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_backup ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_backup_invalid_target ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_backup_missing_target ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_backup_short ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_cmd ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_cmd_invalid_target ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_cmd_missing_args ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_cmd_with_spaces ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_empty ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_nodes ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_ping ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_ping_invalid_target ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_restore ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_restore_missing_target ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_restore_short ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_restore_with_local_path ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_short_format ... ok
[INFO] [stdout] test vpn::command::tests::test_execute_nodes_full_flow ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_status ... ok
[INFO] [stdout] test vpn::dht::tests::test_bootstrap_from_nodes ... ok
[INFO] [stdout] test vpn::dht::tests::test_bucket_full_eviction_lru ... ok
[INFO] [stdout] test vpn::dht::tests::test_bucket_index_eighth_bit ... ok
[INFO] [stdout] test vpn::command::tests::test_parse_unknown_subcommand ... ok
[INFO] [stdout] test vpn::dht::tests::test_bucket_index_first_bit ... ok
[INFO] [stdout] test vpn::dht::tests::test_bucket_index_second_byte ... ok
[INFO] [stdout] test vpn::dht::tests::test_bucket_index_self ... ok
[INFO] [stdout] test vpn::dht::tests::test_bucket_index_second_bit ... ok
[INFO] [stdout] test vpn::dht::tests::test_dht_debug_format ... ok
[INFO] [stdout] test vpn::dht::tests::test_dht_message_type_conversion ... ok
[INFO] [stdout] test vpn::dht::tests::test_empty_dht_manager ... ok
[INFO] [stdout] test vpn::dht::tests::test_encode_decode_empty_list ... ok
[INFO] [stdout] test vpn::dht::tests::test_encode_decode_node_list ... ok
[INFO] [stdout] test vpn::dht::tests::test_cleanup_values ... ok
[INFO] [stdout] test vpn::dht::tests::test_find_node_limited_to_k ... ok
[INFO] [stdout] test vpn::dht::tests::test_find_node_empty ... ok
[INFO] [stdout] test vpn::dht::tests::test_find_node_ordered_by_distance ... ok
[INFO] [stdout] test vpn::dht::tests::test_find_node_returns_closest ... ok
[INFO] [stdout] test vpn::dht::tests::test_get_nonexistent_value ... ok
[INFO] [stdout] test vpn::dht::tests::test_find_node_specific_target ... ok
[INFO] [stdout] test vpn::dht::tests::test_insert_duplicate_node ... ok
[INFO] [stdout] test vpn::dht::tests::test_insert_multiple_nodes ... ok
[INFO] [stdout] test vpn::dht::tests::test_insert_node_basic ... ok
[INFO] [stdout] test vpn::dht::tests::test_insert_find_remove_cycle ... ok
[INFO] [stdout] test vpn::dht::tests::test_insert_node_no_self ... ok
[INFO] [stdout] test vpn::dht::tests::test_insert_nodes_same_bucket ... ok
[INFO] [stdout] test vpn::dht::tests::test_process_find_node ... ok
[INFO] [stdout] test vpn::dht::tests::test_process_ping ... ok
[INFO] [stdout] test vpn::dht::tests::test_put_and_get_value ... ok
[INFO] [stdout] test vpn::dht::tests::test_put_multiple_values ... ok
[INFO] [stdout] test vpn::dht::tests::test_process_put_and_get ... ok
[INFO] [stdout] test vpn::dht::tests::test_put_overwrite_value ... ok
[INFO] [stdout] test vpn::dht::tests::test_refresh_culls_stale_nodes ... ok
[INFO] [stdout] test vpn::dht::tests::test_remove_node ... ok
[INFO] [stdout] test vpn::dht::tests::test_remove_nonexistent_node ... ok
[INFO] [stdout] test vpn::dht::tests::test_remove_self ... ok
[INFO] [stdout] test vpn::dht::tests::test_remove_and_reinsert ... ok
[INFO] [stdout] test vpn::dht::tests::test_xor_distance_all_bits ... ok
[INFO] [stdout] test vpn::dht::tests::test_xor_distance_known_value ... ok
[INFO] [stdout] test vpn::dht::tests::test_xor_distance_self ... ok
[INFO] [stdout] test vpn::dht::tests::test_xor_distance_symmetric ... ok
[INFO] [stdout] test vpn::handshake::tests::test_complete_handshake ... ok
[INFO] [stdout] test vpn::handshake::tests::test_handshake_initiator_new ... ok
[INFO] [stdout] test vpn::handshake::tests::test_handshake_msg_type_conversion ... ok
[INFO] [stdout] test vpn::handshake::tests::test_handshake_responder_new ... ok
[INFO] [stdout] test vpn::handshake::tests::test_handshake_step_by_step ... ok
[INFO] [stdout] test vpn::handshake::tests::test_invalid_state_errors ... ok
[INFO] [stdout] test vpn::handshake::tests::test_replay_detection ... ok
[INFO] [stdout] test vpn::handshake::tests::test_timestamped_payload_expired ... ok
[INFO] [stdout] test vpn::dht::tests::test_value_expiry ... ok
[INFO] [stdout] test vpn::handshake::tests::test_timestamped_payload_from_bytes_short ... ok
[INFO] [stdout] test vpn::handshake::tests::test_timestamped_payload_validate ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_error_display ... ok
[INFO] [stdout] test vpn::handshake::tests::test_timestamped_payload_roundtrip ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_manager_add_remove_node ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_manager_new ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_manager_handle_request ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_manager_set_callback ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_manager_set_offline_threshold ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_message_roundtrip ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_message_too_short ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_msg_type_conversion ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_heartbeat_manager_online_offline_nodes ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_node_heartbeat_state_new ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_build_punch_packet ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_clear ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_empty_punched_peers ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_get_punched_addr_nonexistent ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_is_valid_punch_response ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_keepalive_no_socket ... ok
[INFO] [stdout] test vpn::heartbeat::tests::test_node_heartbeat_state_should_be_offline ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_nat_type_as_str ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_nat_type_default ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_nat_type_detect ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_nat_type_set ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_nat_type_punchable ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_punch_hole_already_punched ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_punch_symmetric_nat_degrade ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_punched_peers_list ... ok
[INFO] [stdout] test vpn::hole_punch::tests::test_remove_peer ... ok
[INFO] [stdout] test vpn::identity::tests::test_node_id_deterministic_from_key ... ok
[INFO] [stdout] test vpn::identity::tests::test_node_id_distance_symmetric ... ok
[INFO] [stdout] test vpn::identity::tests::test_node_id_distance_self_zero ... ok
[INFO] [stdout] test vpn::identity::tests::test_node_id_generate_and_save_load ... ok
[INFO] [stdout] test vpn::identity::tests::test_node_id_hex_roundtrip ... ok
[INFO] [stdout] test vpn::multihop::tests::test_add_direct_route ... ok
[INFO] [stdout] test vpn::identity::tests::test_node_id_from_public_key ... ok
[INFO] [stdout] test vpn::multihop::tests::test_add_direct_route_self ... ok
[INFO] [stdout] test vpn::multihop::tests::test_add_multiple_direct_routes ... ok
[INFO] [stdout] test vpn::multihop::tests::test_cleanup_expired ... ok
[INFO] [stdout] test vpn::multihop::tests::test_cleanup_expired_skip_recent ... ok
[INFO] [stdout] test vpn::multihop::tests::test_discover_route_no_dht ... ok
[INFO] [stdout] test vpn::multihop::tests::test_discover_failover_integration ... ok
[INFO] [stdout] test vpn::multihop::tests::test_discover_route_self ... ok
[INFO] [stdout] test storage::chunk::tests::offsets_are_contiguous ... ok
[INFO] [stdout] test vpn::multihop::tests::test_empty_manager ... ok
[INFO] [stdout] test vpn::multihop::tests::test_find_alternative_no_candidates ... ok
[INFO] [stdout] test vpn::multihop::tests::test_discover_route_with_dht_direct ... ok
[INFO] [stdout] test vpn::multihop::tests::test_find_alternative_with_candidates ... ok
[INFO] [stdout] test vpn::multihop::tests::test_find_route_expired ... ok
[INFO] [stdout] test vpn::multihop::tests::test_find_route_nonexistent ... ok
[INFO] [stdout] test vpn::multihop::tests::test_mark_invalid ... ok
[INFO] [stdout] test vpn::multihop::tests::test_multi_hop_entry_expiry ... ok
[INFO] [stdout] test vpn::multihop::tests::test_multi_hop_entry_new_direct ... ok
[INFO] [stdout] test vpn::multihop::tests::test_multi_hop_entry_new_relay ... ok
[INFO] [stdout] test vpn::multihop::tests::test_discover_route_with_dht_multihop ... ok
[INFO] [stdout] test vpn::multihop::tests::test_multi_hop_entry_calculate_metric ... ok
[INFO] [stdout] test vpn::multihop::tests::test_multihop_manager_new ... ok
[INFO] [stdout] test vpn::multihop::tests::test_next_hop ... ok
[INFO] [stdout] test vpn::multihop::tests::test_next_hop_nonexistent ... ok
[INFO] [stdout] test vpn::multihop::tests::test_multihop_manager_debug ... ok
[INFO] [stdout] test vpn::multihop::tests::test_remove_nonexistent_route ... ok
[INFO] [stdout] test vpn::multihop::tests::test_route_count_after_operations ... ok
[INFO] [stdout] test vpn::multihop::tests::test_remove_route ... ok
[INFO] [stdout] test vpn::multihop::tests::test_route_message_type_conversion ... ok
[INFO] [stdout] test vpn::multihop::tests::test_route_metric_ordering ... ok
[INFO] [stdout] test vpn::multihop::tests::test_route_table_capacity_limit ... ok
[INFO] [stdout] test vpn::multihop::tests::test_xor_distance_u128 ... ok
[INFO] [stdout] test vpn::multihop::tests::test_set_dht_and_relay ... ok
[INFO] [stdout] test vpn::multipath::tests::test_empty_manager ... ok
[INFO] [stdout] test vpn::multipath::tests::test_fragment_data_large ... ok
[INFO] [stdout] test vpn::multihop::tests::test_refresh_stale_routes ... ok
[INFO] [stdout] test vpn::multipath::tests::test_multiple_paths ... ok
[INFO] [stdout] test vpn::multipath::tests::test_path_info_update_latency ... ok
[INFO] [stdout] test vpn::multipath::tests::test_path_info_weight_bounds ... ok
[INFO] [stdout] test vpn::multipath::tests::test_path_loss_degradation ... ok
[INFO] [stdout] test vpn::multipath::tests::test_path_score_calculation ... ok
[INFO] [stdout] test vpn::multipath::tests::test_path_score_order ... ok
[INFO] [stdout] test vpn::multipath::tests::test_record_ack_restores_active ... ok
[INFO] [stdout] test vpn::multipath::tests::test_remove_nonexistent_path ... ok
[INFO] [stdout] test vpn::multipath::tests::test_remove_path ... ok
[INFO] [stdout] test vpn::multipath::tests::test_reorder_buffer_clear ... ok
[INFO] [stdout] test vpn::multipath::tests::test_reorder_buffer_continuous_output ... ok
[INFO] [stdout] test vpn::multipath::tests::test_reorder_buffer_ignore_old ... ok
[INFO] [stdout] test vpn::multipath::tests::test_reorder_buffer_in_order ... ok
[INFO] [stdout] test vpn::multipath::tests::test_reorder_buffer_out_of_order ... ok
[INFO] [stdout] test vpn::multipath::tests::test_reorder_buffer_skip_lost ... ok
[INFO] [stdout] test vpn::multipath::tests::test_send_via_paths_no_paths ... ok
[INFO] [stdout] test vpn::multipath::tests::test_send_via_paths_with_paths ... ok
[INFO] [stdout] test vpn::multipath::tests::test_update_path_latency ... ok
[INFO] [stdout] test vpn::relay::tests::test_connection_pool_new ... ok
[INFO] [stdout] test vpn::relay::tests::test_message_invalid_type ... ok
[INFO] [stdout] test vpn::relay::tests::test_message_payload_too_short ... ok
[INFO] [stdout] test vpn::relay::tests::test_message_roundtrip ... ok
[INFO] [stdout] test vpn::relay::tests::test_message_too_short ... ok
[INFO] [stdout] test vpn::relay::tests::test_message_type_conversion ... ok
[INFO] [stdout] test vpn::relay::tests::test_relay_error_display ... ok
[INFO] [stdout] test vpn::relay::tests::test_relay_manager_new ... ok
[INFO] [stdout] test vpn::relay::tests::test_relay_manager_register_node ... ok
[INFO] [stdout] test vpn::multipath::tests::test_add_path ... ok
[INFO] [stdout] test vpn::relay::tests::test_relay_manager_send_unreachable ... ok
[INFO] [stdout] test vpn::multipath::tests::test_fragment_data_small ... ok
[INFO] [stdout] test vpn::relay::tests::test_tcp_client_new ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_empty_manager ... ok
[INFO] [stdout] test vpn::relay::tests::test_tcp_server_new ... ok
[INFO] [stdout] test vpn::relay::tests::test_relay_manager_set_relay ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_event_callback_offline ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_event_callback_recovered ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_handle_heal_pong ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_heal_event_display ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_handle_path_failure_no_multihop ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_heal_loop_double_start ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_heartbeat_callback_offline ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_heartbeat_callback_online_unknown_node ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_load_state_file_not_found ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_multiple_nodes_offline ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_node_offline_cleans_routes ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_node_recovery_rebuilds_routes ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_heal_msg_type_conversion ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_offline_recovery_integration ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_on_node_offline_no_multihop ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_partition_detection_event ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_on_node_recovered_no_multihop ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_partition_merged_event ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_path_failure_alternative_switch ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_path_failure_with_dht_rediscovery ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_process_heal_ping_returns_pong ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_persisted_state_json_format ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_process_heal_pong_buffered ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_process_partition_sync ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_manager_add_duplicate_node ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_manager_add_remove_node ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_manager_debug ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_manager_new ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_manager_online_offline_nodes ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_message_invalid_subtype ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_save_and_load_state ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_message_roundtrip ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_message_too_short ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_message_new ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_message_with_payload ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_node_state_exceeded_max_attempts ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_message_with_payload_roundtrip ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_node_state_mark_offline ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_node_state_mark_online ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_node_state_new ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_self_heal_node_state_record_failed_attempt ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_set_heal_interval ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_set_max_failed_attempts ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_set_multihop_and_dht ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_set_persist_path ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_try_restore_state_no_path ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_state_restored_event ... ok
[INFO] [stdout] test vpn::session::tests::test_session_counter ... ok
[INFO] [stdout] test vpn::session::tests::test_session_error_display ... ok
[INFO] [stdout] test vpn::session::tests::test_session_creation ... ok
[INFO] [stdout] test vpn::session::tests::test_session_invalid_transitions ... ok
[INFO] [stdout] test vpn::session::tests::test_session_keys ... ok
[INFO] [stdout] test vpn::session::tests::test_session_keys_needs_rotation ... ok
[INFO] [stdout] test vpn::selfheal::tests::test_heal_loop_start_stop ... ok
[INFO] [stdout] test vpn::session::tests::test_session_manager_create ... ok
[INFO] [stdout] test vpn::session::tests::test_session_manager_has_active ... ok
[INFO] [stdout] test vpn::session::tests::test_session_manager_remove ... ok
[INFO] [stdout] test vpn::session::tests::test_session_manager_reuse ... ok
[INFO] [stdout] test vpn::session::tests::test_session_secure_close ... ok
[INFO] [stdout] test vpn::session::tests::test_session_state_conversion ... ok
[INFO] [stdout] test vpn::session::tests::test_session_manager_cleanup_expired ... ok
[INFO] [stdout] test vpn::session::tests::test_session_state_transitions ... ok
[INFO] [stdout] test vpn::stats::tests::test_format_bytes ... ok
[INFO] [stdout] test vpn::stats::tests::test_format_rate ... ok
[INFO] [stdout] test vpn::stats::tests::test_peer_traffic_tracker_new ... ok
[INFO] [stdout] test vpn::stats::tests::test_peer_traffic_tracker_record_rx ... ok
[INFO] [stdout] test vpn::stats::tests::test_peer_traffic_tracker_record_tx ... ok
[INFO] [stdout] test vpn::session::tests::test_session_expiry ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_consume ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_default ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_check_allow ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_check_deny ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_new ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_set_rate ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_wait_for_zero ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_zero_rate ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_connection_count ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_new ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_peak_rx ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_peak_tx ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_record_rx ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_record_tx ... ok
[INFO] [stdout] test vpn::stats::tests::test_rate_limiter_reset ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_summary ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_reset ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_total_bytes ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_debug_format ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_creation ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_known_nodes ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_ping_unknown ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_register_listener ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_send_invalid_address ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_send_unknown_node ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_name ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_send_with_resolved_node ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_with_lan_router ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_with_port ... ok
[INFO] [stdout] test vpn::vpn_router::tests::test_vpn_router_status ... ok
[INFO] [stdout] test storage::chunk::tests::verify_file_fail_on_tampered_data ... ok
[INFO] [stdout] test vpn::stats::tests::test_traffic_stats_high_volume ... ok
[INFO] [stdout] test storage::chunk::tests::reassembly_file_hash_mismatch ... ok
[INFO] [stdout] test storage::chunk::tests::reassembly_matches_original ... ok
[INFO] [stdout] test storage::chunk::tests::indices_start_at_zero_and_increment ... ok
[INFO] [stdout] test storage::chunk::tests::chunk_hashes_are_unique ... ok
[INFO] [stdout] test storage::encrypt::tests::encrypt_decrypt_large_data ... ok
[INFO] [stdout] test storage::chunk::tests::reassembly_out_of_order_chunks ... ok
[INFO] [stdout] test storage::chunk::tests::large_file_four_chunks ... ok
[INFO] [stdout] test storage::chunk::tests::verify_file_ok ... ok
[INFO] [stdout] test storage::metadata::tests::test_sync_keeps_newer ... ok
[INFO] [stdout] test storage::gc::tests::test_prune_old_versions has been running for over 60 seconds
[INFO] [stdout] test storage::version::tests::test_prune_all_versions has been running for over 60 seconds
[INFO] [stdout] test storage::version::tests::test_prune_versions has been running for over 60 seconds
[ERROR] error running command: no output for 300 seconds
[INFO] running `Command { std: "docker" "inspect" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536", kill_on_drop: false }`
[INFO] [stdout] 5587628d563bfe5b33283a2981ee3250693f17657f214dc345386f860e24e536
