diff --git a/.dockerignore b/.dockerignore index 84986e7d8..6e6b4f072 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ /.coverage/ +/.tmp/ /.git /.git-blame-ignore /.github diff --git a/AGENTS.md b/AGENTS.md index 7a01934be..09f880db1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,6 +50,8 @@ native IPv4/IPv6 support, private/whitelisted mode, and a management REST API. - `docs/issues/` — Issue specs / implementation plans - `share/default/` — Default configuration files and fixtures - `storage/` — Runtime data (git-ignored); databases, logs, config +- `.tmp/` — Workspace-local temp dir (git-ignored); AI agent hook logs (`TORRUST_GIT_HOOKS_LOG_DIR=.tmp`) + and benchmark script cargo isolation dirs (`contrib/dev-tools/workflow-benchmarks/`) - `.github/workflows/` — CI/CD workflows (testing, coverage, container, deployment) - `.github/skills/` — Agent Skills for specialized workflows and task-specific guidance - `.github/agents/` — Custom Copilot agents and their repository-specific definitions @@ -61,29 +63,29 @@ All packages live under `packages/`. The workspace version is `3.0.0-develop`. | Package | Crate Name | Prefix / Layer | Description | | --------------------------------- | ------------------------------------------------- | -------------- | ---------------------------------------------- | | `axum-health-check-api-server` | `torrust-tracker-axum-health-check-api-server` | `axum-*` | Health monitoring endpoint | -| `axum-http-server` | `torrust-tracker-axum-http-server` | `axum-*` | BitTorrent HTTP tracker server (BEP 3/23) | -| `axum-rest-api-server` | `torrust-tracker-axum-rest-api-server` | `axum-*` | Management REST API server | +| `axum-http-server` | `torrust-tracker-axum-http-server` | `axum-*` | BitTorrent HTTP tracker server (BEP 3/23) | +| `axum-rest-api-server` | `torrust-tracker-axum-rest-api-server` | `axum-*` | Management REST API server | | `axum-server` | `torrust-tracker-axum-server` | `axum-*` | Base Axum HTTP server infrastructure | | `clock` | `torrust-clock` | utilities | Mockable time source for deterministic testing | | `configuration` | `torrust-tracker-configuration` | domain | Config file parsing, environment variables | | `events` | `torrust-tracker-events` | domain | Domain event definitions | -| `http-protocol` | `torrust-tracker-http-tracker-protocol` | `*-protocol` | HTTP tracker protocol (BEP 3/23) parsing | -| `http-tracker-core` | `torrust-tracker-http-tracker-core` | `*-core` | HTTP-specific tracker domain logic | +| `http-protocol` | `torrust-tracker-http-tracker-protocol` | `*-protocol` | HTTP tracker protocol (BEP 3/23) parsing | +| `http-tracker-core` | `torrust-tracker-http-tracker-core` | `*-core` | HTTP-specific tracker domain logic | | `located-error` | `torrust-located-error` | utilities | Diagnostic errors with source locations | | `metrics` | `torrust-metrics` | domain | Prometheus metrics integration | | `peer-id` | `bittorrent-peer-id` | domain | Peer ID parsing and formatting utilities | | `primitives` | `torrust-tracker-primitives` | domain | Core domain types (InfoHash, PeerId, ...) | -| `rest-api-client` | `torrust-tracker-rest-api-client` | client tools | REST API client library | -| `rest-api-core` | `torrust-tracker-rest-api-core` | client tools | REST API core logic | +| `rest-api-client` | `torrust-tracker-rest-api-client` | client tools | REST API client library | +| `rest-api-core` | `torrust-tracker-rest-api-core` | client tools | REST API core logic | | `server-lib` | `torrust-server-lib` | shared | Shared server library utilities | | `swarm-coordination-registry` | `torrust-tracker-swarm-coordination-registry` | domain | Torrent/peer coordination registry | | `test-helpers` | `torrust-tracker-test-helpers` | utilities | Mock servers, test data generation | | `torrent-repository-benchmarking` | `torrust-tracker-torrent-repository-benchmarking` | benchmarking | Torrent storage benchmarks | -| `tracker-client` | `torrust-tracker-client` | client tools | CLI tracker interaction/testing client | -| `tracker-core` | `torrust-tracker-core` | `*-core` | Central tracker peer-management logic | -| `udp-protocol` | `torrust-tracker-udp-tracker-protocol` | `*-protocol` | UDP tracker protocol (BEP 15) framing/parsing | -| `udp-tracker-core` | `torrust-tracker-udp-tracker-core` | `*-core` | UDP-specific tracker domain logic | -| `udp-server` | `torrust-tracker-udp-server` | server | UDP tracker server implementation | +| `tracker-client` | `torrust-tracker-client` | client tools | CLI tracker interaction/testing client | +| `tracker-core` | `torrust-tracker-core` | `*-core` | Central tracker peer-management logic | +| `udp-protocol` | `torrust-tracker-udp-tracker-protocol` | `*-protocol` | UDP tracker protocol (BEP 15) framing/parsing | +| `udp-tracker-core` | `torrust-tracker-udp-tracker-core` | `*-core` | UDP-specific tracker domain logic | +| `udp-server` | `torrust-tracker-udp-server` | server | UDP tracker server implementation | **Console tools** (under `console/`): diff --git a/Containerfile b/Containerfile index 834a95cf9..512910763 100644 --- a/Containerfile +++ b/Containerfile @@ -12,7 +12,9 @@ RUN cargo binstall --no-confirm cargo-chef cargo-nextest FROM docker.io/library/rust:slim-trixie AS tester WORKDIR /tmp -RUN apt-get update; apt-get install -y curl sqlite3; apt-get autoclean +RUN apt-get update \ + && apt-get install -y curl sqlite3 time \ + && apt-get autoclean RUN curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash RUN cargo binstall --no-confirm cargo-nextest # Database initialization: Tests at runtime require a pre-initialized SQLite3 database @@ -20,13 +22,14 @@ RUN cargo binstall --no-confirm cargo-nextest # database file layout. This image layer is inherited by test_debug and test stages. COPY ./share/ /app/share/torrust -RUN mkdir -p /app/share/torrust/default/database/; \ - sqlite3 /app/share/torrust/default/database/tracker.sqlite3.db "VACUUM;" +RUN time mkdir -p /app/share/torrust/default/database/ \ + && time sqlite3 /app/share/torrust/default/database/tracker.sqlite3.db "VACUUM;" ## Su Exe Compile FROM docker.io/library/gcc:trixie AS gcc COPY ./contrib/dev-tools/su-exec/ /usr/local/src/su-exec/ -RUN cc -Wall -Werror -g /usr/local/src/su-exec/su-exec.c -o /usr/local/bin/su-exec; chmod +x /usr/local/bin/su-exec +RUN cc -Wall -Werror -g /usr/local/src/su-exec/su-exec.c -o /usr/local/bin/su-exec \ + && chmod +x /usr/local/bin/su-exec ## Chef Prepare (look at project and see wat we need) @@ -80,9 +83,13 @@ COPY --from=build_debug \ RUN cargo nextest run --workspace-remap /test/src/ --extract-to /test/src/ --no-run --archive-file /test/torrust-tracker-debug.tar.zst RUN cargo nextest run --workspace-remap /test/src/ --target-dir-remap /test/src/target/ --cargo-metadata /test/src/target/nextest/cargo-metadata.json --binaries-metadata /test/src/target/nextest/binaries-metadata.json -RUN mkdir -p /app/bin/; cp -l /test/src/target/debug/torrust-tracker /app/bin/torrust-tracker -RUN mkdir /app/lib/; cp -l $(realpath $(ldd /app/bin/torrust-tracker | grep "libz\.so\.1" | awk '{print $3}')) /app/lib/libz.so.1 -RUN chown -R root:root /app; chmod -R u=rw,go=r,a+X /app; chmod -R a+x /app/bin +RUN time mkdir -p /app/bin/ \ + && time cp -l /test/src/target/debug/torrust-tracker /app/bin/torrust-tracker +RUN time mkdir /app/lib/ \ + && time cp -l $(realpath $(ldd /app/bin/torrust-tracker | grep "libz\.so\.1" | awk '{print $3}')) /app/lib/libz.so.1 +RUN time chown -R root:root /app \ + && time chmod -R u=rw,go=r,a+X /app \ + && time chmod -R a+x /app/bin # Extract and Test (release) FROM tester AS test @@ -94,9 +101,14 @@ COPY --from=build \ RUN cargo nextest run --workspace-remap /test/src/ --extract-to /test/src/ --no-run --archive-file /test/torrust-tracker.tar.zst RUN cargo nextest run --workspace-remap /test/src/ --target-dir-remap /test/src/target/ --cargo-metadata /test/src/target/nextest/cargo-metadata.json --binaries-metadata /test/src/target/nextest/binaries-metadata.json -RUN mkdir -p /app/bin/; cp -l /test/src/target/release/torrust-tracker /app/bin/torrust-tracker; cp -l /test/src/target/release/http_health_check /app/bin/http_health_check -RUN mkdir -p /app/lib/; cp -l $(realpath $(ldd /app/bin/torrust-tracker | grep "libz\.so\.1" | awk '{print $3}')) /app/lib/libz.so.1 -RUN chown -R root:root /app; chmod -R u=rw,go=r,a+X /app; chmod -R a+x /app/bin +RUN time mkdir -p /app/bin/ \ + && time cp -l /test/src/target/release/torrust-tracker /app/bin/torrust-tracker \ + && time cp -l /test/src/target/release/http_health_check /app/bin/http_health_check +RUN time mkdir -p /app/lib/ \ + && time cp -l $(realpath $(ldd /app/bin/torrust-tracker | grep "libz\.so\.1" | awk '{print $3}')) /app/lib/libz.so.1 +RUN time chown -R root:root /app \ + && time chmod -R u=rw,go=r,a+X /app \ + && time chmod -R a+x /app/bin ## Runtime diff --git a/contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh b/contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh new file mode 100755 index 000000000..5daabe0e2 --- /dev/null +++ b/contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +# run-container-baseline.sh +# +# semantic-links: +# related-artifacts: +# - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md +# - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md +# - .github/workflows/container.yaml +# +# Reproducible baseline timing capture for container-workflow-equivalent steps. +# Mirrors .github/workflows/container.yaml (job: test, matrix: debug + release). +# +# The CI workflow runs debug and release in parallel (matrix strategy). +# This script runs them sequentially. Total CI wall time ≈ max(debug, release). +# +# Usage: +# ./contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh [--cold] +# +# Options: +# --cold Clear Docker builder cache and remove the tracked local image +# before measuring, approximating a shared-runner first run. +# Omit to measure the warm (cached) case. +# +# Output: +# Structured timing lines on stdout and a dated log under: +# docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/ +# +# Re-use after later optimisations: +# Run this script once --cold and once without --cold after each change and +# compare the evidence logs to quantify the improvement. + +set -euo pipefail + +COLD=false +for arg in "$@"; do + case "$arg" in + --cold) COLD=true ;; + *) echo "Unknown argument: $arg" >&2; exit 1 ;; + esac +done + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +EVIDENCE_DIR="$REPO_ROOT/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence" +mkdir -p "$EVIDENCE_DIR" + +RUN_TYPE="warm" +$COLD && RUN_TYPE="cold" + +LOG="$EVIDENCE_DIR/container-baseline-$(date -u +%Y%m%dT%H%M%SZ)-${RUN_TYPE}.log" + +time_phase() { + local scope="$1" name="$2" + shift 2 + echo "[$scope] ${name}_start" + local t0 t1 rc + t0=$(date +%s) + set +e + "$@" + rc=$? + set -e + t1=$(date +%s) + echo "[$scope] ${name}_seconds=$((t1 - t0))" + echo "[$scope] ${name}_exit_code=$rc" + return $rc +} + +{ + echo "[meta] start_utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" + echo "[meta] workflow=container" + echo "[meta] run_type=${RUN_TYPE}" + echo "[meta] repo_root=${REPO_ROOT}" + + if $COLD; then + echo "[cold] cache_reset_start" + docker builder prune -af >/dev/null + docker image rm -f torrust-tracker:local >/dev/null 2>&1 || true + echo "[cold] cache_reset_done" + fi + + # --- debug target (first matrix entry) --- + # --progress plain writes per-layer step output to stdout so it is captured + # in the evidence log alongside the phase timing lines. Without this flag + # Docker (BuildKit) emits the interactive progress to stderr only. + time_phase "${RUN_TYPE}" build_debug \ + docker build \ + --progress plain \ + --file "${REPO_ROOT}/Containerfile" \ + --target debug \ + --tag torrust-tracker:local \ + "${REPO_ROOT}" + + time_phase "${RUN_TYPE}" inspect_debug \ + docker image inspect torrust-tracker:local + + # --- release target (second matrix entry) --- + time_phase "${RUN_TYPE}" build_release \ + docker build \ + --progress plain \ + --file "${REPO_ROOT}/Containerfile" \ + --target release \ + --tag torrust-tracker:local \ + "${REPO_ROOT}" + + time_phase "${RUN_TYPE}" inspect_release \ + docker image inspect torrust-tracker:local + + echo "[meta] end_utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" +} | tee "$LOG" + +echo "" +echo "Evidence log: $LOG" diff --git a/contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh b/contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh new file mode 100755 index 000000000..e7a58cf6e --- /dev/null +++ b/contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +# run-testing-baseline.sh +# +# semantic-links: +# related-artifacts: +# - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md +# - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md +# - .github/workflows/testing.yaml +# +# Reproducible baseline timing capture for testing-workflow-equivalent steps. +# Mirrors .github/workflows/testing.yaml (jobs: unit + docker-e2e). +# +# The CI workflow runs unit(nightly) + unit(stable) + docker-e2e in parallel. +# This script runs phases sequentially; CI wall time ≈ max(unit_stable, docker-e2e). +# +# Usage: +# ./contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh [--cold] +# +# Options: +# --cold Use isolated CARGO_HOME and target dir, and clear the Docker builder +# cache before measuring, approximating a shared-runner first run. +# Omit to use the default ~/.cargo and target/ (warm / incremental). +# +# Output: +# Structured timing lines on stdout and a dated log under: +# docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/ +# +# Re-use after later optimisations: +# Run this script once --cold and once without --cold after each change and +# compare the evidence logs to quantify the improvement. + +set -euo pipefail + +COLD=false +for arg in "$@"; do + case "$arg" in + --cold) COLD=true ;; + *) echo "Unknown argument: $arg" >&2; exit 1 ;; + esac +done + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +EVIDENCE_DIR="$REPO_ROOT/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence" +mkdir -p "$EVIDENCE_DIR" + +RUN_TYPE="warm" +$COLD && RUN_TYPE="cold" + +LOG="$EVIDENCE_DIR/testing-baseline-$(date -u +%Y%m%dT%H%M%SZ)-${RUN_TYPE}.log" + +time_phase() { + local scope="$1" name="$2" + shift 2 + echo "[$scope] ${name}_start" + local t0 t1 rc + t0=$(date +%s) + set +e + "$@" + rc=$? + set -e + t1=$(date +%s) + echo "[$scope] ${name}_seconds=$((t1 - t0))" + echo "[$scope] ${name}_exit_code=$rc" + return $rc +} + +{ + echo "[meta] start_utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" + echo "[meta] workflow=testing" + echo "[meta] run_type=${RUN_TYPE}" + echo "[meta] repo_root=${REPO_ROOT}" + + if $COLD; then + TMP_HOME="${REPO_ROOT}/.tmp/workflow-benchmarks/cargo-home" + TMP_TARGET="${REPO_ROOT}/.tmp/workflow-benchmarks/target" + echo "[cold] cache_reset_start" + rm -rf "${TMP_HOME}" "${TMP_TARGET}" + mkdir -p "${TMP_HOME}" "${TMP_TARGET}" + docker builder prune -af >/dev/null + docker image rm -f torrust-tracker:e2e-local >/dev/null 2>&1 || true + export CARGO_HOME="${TMP_HOME}" + export CARGO_TARGET_DIR="${TMP_TARGET}" + echo "[cold] cache_reset_done" + echo "[meta] cargo_home=${TMP_HOME}" + echo "[meta] cargo_target_dir=${TMP_TARGET}" + fi + + cd "${REPO_ROOT}" + + # --- unit job (shared phases) --- + time_phase "${RUN_TYPE}" fetch \ + cargo fetch --verbose + + time_phase "${RUN_TYPE}" install_linter \ + cargo install --locked \ + --git https://github.com/torrust/torrust-linting \ + --rev 70f84a29925b16a903110e494c9b8de519633a7f \ + --bin linter + + # nightly-only in CI; run unconditionally to measure time + time_phase "${RUN_TYPE}" format \ + cargo fmt --check + + time_phase "${RUN_TYPE}" lint \ + linter all + + time_phase "${RUN_TYPE}" test_docs \ + cargo test --doc --workspace + + time_phase "${RUN_TYPE}" test_unit \ + cargo test --tests --benches --examples --workspace --all-targets --all-features + + # --- docker-e2e job --- + time_phase "${RUN_TYPE}" docker_build_e2e \ + docker build \ + --file "${REPO_ROOT}/Containerfile" \ + --target release \ + --tag torrust-tracker:e2e-local \ + "${REPO_ROOT}" + + time_phase "${RUN_TYPE}" e2e_tracker \ + cargo run --bin e2e_tests_runner -- \ + --config-toml-path "./share/default/config/tracker.e2e.container.sqlite3.toml" \ + --tracker-image "torrust-tracker:e2e-local" \ + --skip-build + + time_phase "${RUN_TYPE}" e2e_qbittorrent_sqlite \ + cargo run --bin qbittorrent_e2e_runner -- \ + --tracker-image "torrust-tracker:e2e-local" \ + --skip-build \ + --db-driver sqlite3 \ + --timeout-seconds 600 + + time_phase "${RUN_TYPE}" e2e_qbittorrent_mysql \ + cargo run --bin qbittorrent_e2e_runner -- \ + --tracker-image "torrust-tracker:e2e-local" \ + --skip-build \ + --db-driver mysql \ + --timeout-seconds 600 + + time_phase "${RUN_TYPE}" e2e_qbittorrent_postgresql \ + cargo run --bin qbittorrent_e2e_runner -- \ + --tracker-image "torrust-tracker:e2e-local" \ + --skip-build \ + --db-driver postgresql \ + --timeout-seconds 600 + + echo "[meta] end_utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" +} | tee "$LOG" + +echo "" +echo "Evidence log: $LOG" diff --git a/cspell.json b/cspell.json index abbfb9b9b..6dd60c573 100644 --- a/cspell.json +++ b/cspell.json @@ -27,6 +27,7 @@ "repomix-output.xml", "TEMP-*.md", "mutants.out", - "mutants.out.old" + "mutants.out.old", + "docs/issues/**/evidence/*.html" ] } \ No newline at end of file diff --git a/docs/issues/drafts/1840-workflow-performance-container-test-gating/ISSUE.md b/docs/issues/drafts/1840-workflow-performance-container-test-gating/ISSUE.md index 5e8bf7d6a..395fbe97f 100644 --- a/docs/issues/drafts/1840-workflow-performance-container-test-gating/ISSUE.md +++ b/docs/issues/drafts/1840-workflow-performance-container-test-gating/ISSUE.md @@ -16,7 +16,7 @@ semantic-links: - .github/workflows/container.yaml - .github/workflows/testing.yaml - docs/issues/open/1840-improve-pr-workflow-performance-epic/EPIC.md - - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md + - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md --- diff --git a/docs/issues/drafts/1840-workflow-performance-container-workflow-build-deduplication/ISSUE.md b/docs/issues/drafts/1840-workflow-performance-container-workflow-build-deduplication/ISSUE.md index 44639b325..d388323b2 100644 --- a/docs/issues/drafts/1840-workflow-performance-container-workflow-build-deduplication/ISSUE.md +++ b/docs/issues/drafts/1840-workflow-performance-container-workflow-build-deduplication/ISSUE.md @@ -16,7 +16,7 @@ semantic-links: - .github/workflows/testing.yaml - Containerfile - docs/issues/open/1840-improve-pr-workflow-performance-epic/EPIC.md - - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md + - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md --- diff --git a/docs/issues/drafts/1840-workflow-performance-containerfile-target-scope/ISSUE.md b/docs/issues/drafts/1840-workflow-performance-containerfile-target-scope/ISSUE.md index 5714d1367..a83e7e8c6 100644 --- a/docs/issues/drafts/1840-workflow-performance-containerfile-target-scope/ISSUE.md +++ b/docs/issues/drafts/1840-workflow-performance-containerfile-target-scope/ISSUE.md @@ -16,7 +16,7 @@ semantic-links: - .github/workflows/container.yaml - .github/workflows/testing.yaml - docs/issues/open/1840-improve-pr-workflow-performance-epic/EPIC.md - - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md + - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md - docs/issues/open/1726-reduce-build-times-sccache/ISSUE.md --- diff --git a/docs/issues/drafts/1840-workflow-performance-dependency-layer-cache-reuse/ISSUE.md b/docs/issues/drafts/1840-workflow-performance-dependency-layer-cache-reuse/ISSUE.md index e04e35ae6..32a88fc85 100644 --- a/docs/issues/drafts/1840-workflow-performance-dependency-layer-cache-reuse/ISSUE.md +++ b/docs/issues/drafts/1840-workflow-performance-dependency-layer-cache-reuse/ISSUE.md @@ -16,7 +16,7 @@ semantic-links: - .github/workflows/container.yaml - .github/workflows/testing.yaml - docs/issues/open/1840-improve-pr-workflow-performance-epic/EPIC.md - - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md + - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md --- diff --git a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md index dceaa449a..1412770ed 100644 --- a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md +++ b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md @@ -7,7 +7,7 @@ github-issue: 1841 spec-path: docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md branch: "1841-1840-workflow-performance-baseline-analysis" related-pr: null -last-updated-utc: 2026-05-27 00:00 +last-updated-utc: 2026-05-28 00:00 semantic-links: skill-links: - create-issue @@ -15,7 +15,9 @@ semantic-links: - .github/workflows/container.yaml - .github/workflows/testing.yaml - docs/issues/open/1840-improve-pr-workflow-performance-epic/EPIC.md - - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md + - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md + - contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh + - contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh - .github/skills/dev/planning/create-issue/SKILL.md --- @@ -57,25 +59,25 @@ The baseline should emulate shared-runner constraints as closely as practical on Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. -| ID | Status | Task | Notes / Expected Output | -| --- | ------ | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| T1 | TODO | Define the benchmark procedure | A reproducible command sequence for cold and warm runs, including cache reset steps. | -| T2 | TODO | Capture baseline timings | A measured comparison for both workflows with and without local caches. | -| T3 | TODO | Profile linker-heavy non-runtime targets | List the highest-cost targets in the container build path and flag which are not required by the tracker runtime image. | -| T4 | TODO | Write the benchmark report | A durable report in this folder with workflow totals, sub-step timings, linker hotspot findings, and comparison notes. | +| ID | Status | Task | Notes / Expected Output | +| --- | ------ | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| T1 | DONE | Define the benchmark procedure | Scripts under `contrib/dev-tools/workflow-benchmarks/` with `--cold`/warm modes and explicit Docker + Cargo cache reset steps. | +| T2 | DONE | Capture baseline timings | Measured cold and warm runs for both workflows; evidence logs in `evidence/`. | +| T3 | DONE | Profile linker-heavy non-runtime targets | Top 30 compile units ranked; 27 of 30 are not required by the runtime image. See `benchmark-results-baseline.md`. | +| T4 | DONE | Write the benchmark report | `benchmark-results-baseline.md` filled with workflow totals, per-phase timings, linker hotspot table, and comparison notes. | ## Progress Tracking ### Workflow Checkpoints -- [ ] Spec drafted in `docs/issues/drafts/` -- [ ] Spec reviewed and approved by user/maintainer -- [ ] GitHub issue created and issue number added to this spec +- [x] Spec drafted in `docs/issues/drafts/` +- [x] Spec reviewed and approved by user/maintainer +- [x] GitHub issue created and issue number added to this spec - [ ] (Optional, recommended for complex issues) Spec-only PR merged into `develop` before implementation -- [ ] Implementation completed -- [ ] Automatic verification completed (`linter all`, relevant tests, and any pre-push checks) -- [ ] Manual verification scenarios executed and recorded (status + evidence) -- [ ] Acceptance criteria reviewed after implementation and updated with evidence +- [x] Implementation completed +- [x] Automatic verification completed (`linter all`, relevant tests, and any pre-push checks) +- [x] Manual verification scenarios executed and recorded (status + evidence) +- [x] Acceptance criteria reviewed after implementation and updated with evidence - [ ] Reviewer validated acceptance criteria and updated checkboxes - [ ] Committer verified spec progress is up to date before commit - [ ] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` @@ -87,15 +89,22 @@ Append one line per meaningful update. - 2026-05-27 00:00 UTC - GitHub Copilot - Drafted the baseline workflow profiling subissue for the performance EPIC - draft file created - 2026-05-27 00:00 UTC - GitHub Copilot - Expanded baseline scope to include linker-heavy target analysis and runtime relevance classification - draft updated - 2026-05-27 00:00 UTC - GitHub Copilot - Created GitHub issue #1841 and linked it as a child issue of EPIC #1840 - draft updated +- 2026-05-28 00:00 UTC - GitHub Copilot - Created branch `1841-1840-workflow-performance-baseline-analysis` and started implementation +- 2026-05-28 00:00 UTC - GitHub Copilot - Created reusable benchmark scripts under `contrib/dev-tools/workflow-benchmarks/` with `--cold`/warm modes and semantic links +- 2026-05-28 00:00 UTC - GitHub Copilot - Captured cold and warm container baseline: cold CI-equivalent ~260 s, warm ~2 s; evidence log saved +- 2026-05-28 00:00 UTC - GitHub Copilot - Captured cold and warm testing baseline: cold CI-equivalent ~510 s, warm ~331 s; evidence log saved +- 2026-05-28 00:00 UTC - GitHub Copilot - Ran `cargo build --timings --all-targets --release`; 27 of top 30 compile units not required by runtime image; HTML report saved +- 2026-05-28 00:00 UTC - GitHub Copilot - Filled `benchmark-results-baseline.md` with all measured data, phase breakdown, and linker-heavy target table +- 2026-05-28 00:00 UTC - GitHub Copilot - Fixed `linter all`: excluded evidence HTML from cspell, added British-English words to dictionary, cleaned `.tmp/`; opened torrust/torrust-linting#1 for directory-exclusion support ## Acceptance Criteria -- [ ] AC1: The baseline report records a no-cache and warm-cache run for both target workflows. -- [ ] AC2: The baseline report identifies the dominant bottleneck inside each workflow. -- [ ] AC3: The baseline report identifies linker-heavy targets and explicitly marks which are not required by the tracker runtime image. -- [ ] AC4: The report is stored in this subissue folder and can be reused for later comparisons. -- [ ] AC5: The benchmark procedure is explicit enough to rerun on the same machine later. -- [ ] `linter all` exits with code `0` +- [x] AC1: The baseline report records a no-cache and warm-cache run for both target workflows. +- [x] AC2: The baseline report identifies the dominant bottleneck inside each workflow. +- [x] AC3: The baseline report identifies linker-heavy targets and explicitly marks which are not required by the tracker runtime image. +- [x] AC4: The report is stored in this subissue folder and can be reused for later comparisons. +- [x] AC5: The benchmark procedure is explicit enough to rerun on the same machine later. +- [x] `linter all` exits with code `0` - [ ] Relevant measurement commands are run and documented - [ ] Manual verification scenarios are executed and documented (status + evidence) - [ ] Acceptance criteria are re-reviewed after implementation and reflect actual behavior @@ -115,12 +124,12 @@ Define verification before implementation starts and execute it before closing t Status values: `TODO`, `IN_PROGRESS`, `DONE`, `FAILED`, `BLOCKED`. -| ID | Scenario | Command/Steps | Expected Result | Status | Evidence | -| --- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------ | ---------------------------- | -| M1 | Cold baseline capture | Clear local Rust caches and any relevant Docker layer cache, then run the workflow-equivalent commands once for container and testing. | The report records no-cache wall times and the measured bottleneck for each workflow. | TODO | {log/output/screenshot/path} | -| M2 | Warm baseline capture | Re-run the same benchmark commands immediately after M1 without clearing caches. | The report records warm-cache wall times for both workflows and shows the expected speed-up. | TODO | {log/output/screenshot/path} | -| M3 | Linker hotspot capture | Capture per-target compilation and linking timings for the container build path and classify targets as runtime-required or not-required for the tracker image. | The report includes a ranked linker-heavy target list with runtime relevance classification. | TODO | {log/output/screenshot/path} | -| M4 | Persistent report check | Update the benchmark artifact in this folder and verify it still reflects the latest measured baseline. | The report stays versioned alongside the issue and is ready for future comparison runs. | TODO | {log/output/screenshot/path} | +| ID | Scenario | Command/Steps | Expected Result | Status | Evidence | +| --- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------ | +| M1 | Cold baseline capture | Clear local Rust caches and any relevant Docker layer cache, then run the workflow-equivalent commands once for container and testing. | The report records no-cache wall times and the measured bottleneck for each workflow. | DONE | `evidence/container-baseline-20260527T210123Z.log`, `evidence/testing-baseline-20260527T211129Z.log` | +| M2 | Warm baseline capture | Re-run the same benchmark commands immediately after M1 without clearing caches. | The report records warm-cache wall times for both workflows and shows the expected speed-up. | DONE | Same logs as M1 (warm sections `[warm] *`) | +| M3 | Linker hotspot capture | Capture per-target compilation and linking timings for the container build path and classify targets as runtime-required or not-required for the tracker image. | The report includes a ranked linker-heavy target list with runtime relevance classification. | DONE | `evidence/cargo-timing-release-20260528T074109Z.html`; top-30 table in `benchmark-results-baseline.md` | +| M4 | Persistent report check | Update the benchmark artifact in this folder and verify it still reflects the latest measured baseline. | The report stays versioned alongside the issue and is ready for future comparison runs. | DONE | `benchmark-results-baseline.md` updated with all measurements and follow-up instructions | Notes: @@ -129,13 +138,13 @@ Notes: ### Acceptance Verification -| AC ID | Status (`TODO`/`DONE`) | Evidence | -| ----- | ---------------------- | ------------------ | -| AC1 | TODO | {test/log/PR link} | -| AC2 | TODO | {test/log/PR link} | -| AC3 | TODO | {test/log/PR link} | -| AC4 | TODO | {test/log/PR link} | -| AC5 | TODO | {test/log/PR link} | +| AC ID | Status (`TODO`/`DONE`) | Evidence | +| ----- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| AC1 | DONE | Cold and warm runs for both workflows measured; see `benchmark-results-baseline.md` §Measurement Table | +| AC2 | DONE | Docker build (container) and `docker_build_e2e` (testing) identified as dominant bottlenecks | +| AC3 | DONE | 27 of top 30 compile units not required by runtime image; see §Linker-Heavy Target Analysis | +| AC4 | DONE | Report stored in this subissue folder with follow-up instructions for future comparisons | +| AC5 | DONE | `run-container-baseline.sh` and `run-testing-baseline.sh` scripts with `--cold`/warm modes and documented cache-reset steps | ## Risks and Trade-offs diff --git a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md new file mode 100644 index 000000000..26644f7c8 --- /dev/null +++ b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results-baseline.md @@ -0,0 +1,433 @@ +--- +semantic-links: + related-artifacts: + - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md + - .github/workflows/container.yaml + - .github/workflows/testing.yaml + - contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh + - contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh +--- + +# Baseline Workflow Benchmark Results + +Recorded on: 2026-05-28 + +This file is the living benchmark artifact for the workflow-performance EPIC. +Update it whenever a later optimization changes the performance profile so future +runs can be compared against the same baseline. + +## Measurement Environment + +| Property | Value | +| ----------- | -------------------------------------------------------------------- | +| **Date** | 2026-05-28 | +| **Host OS** | Ubuntu 26.04 LTS "Resolute Raccoon" — kernel 7.0.0-15-generic | +| **CPU** | AMD Ryzen 9 7950X — 16 cores / 32 threads @ up to 5883 MHz | +| **RAM** | 64 GiB total (62 GiB available at measurement time) | +| **Disk** | 1.8 TiB root volume (`/dev/mapper/ubuntu--vg-ubuntu--lv`), 76 % used | +| **Docker** | 28.3.3 | +| **Rust** | rustc 1.98.0-nightly (57d06900f 2026-05-27) / cargo 1.98.0-nightly | +| **Linker** | system default (`cc` / BFD linker; no `mold` or `lld`) | + +> These are **local developer-machine numbers**, not CI times. GitHub-hosted +> runners use a different CPU/RAM profile, so absolute durations will differ. +> Use the ratios and bottleneck rankings — not the raw seconds — when +> reasoning about what to optimize first. + +## How to Reproduce + +```bash +# Cold run (clears Docker builder cache and isolated Cargo dirs) +./contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh --cold +./contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh --cold + +# Warm run (immediately after, no cache reset) +./contrib/dev-tools/workflow-benchmarks/run-container-baseline.sh +./contrib/dev-tools/workflow-benchmarks/run-testing-baseline.sh + +# Linker-heavy target profiling (release, all targets) +cargo build --timings --all-targets --release --workspace --all-features +# HTML report written to: target/cargo-timings/cargo-timing.html +``` + +Evidence logs are stored under +`docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/`. + +## Cache Reset Procedure (Cold Run) + +The following was performed before the cold run to approximate shared-runner +first-run conditions: + +```bash +docker builder prune -af # clear all Docker BuildKit cache +docker image rm -f torrust-tracker:local torrust-tracker:e2e-local # drop local images +# testing script additionally isolates CARGO_HOME and CARGO_TARGET_DIR +# under .tmp/workflow-benchmarks/ and removes them before the cold run +``` + +The local Cargo registry (`~/.cargo/registry`) was **not** cleared because +GitHub-hosted runners also receive a pre-warmed package registry via +`Swatinem/rust-cache`. Clearing it would produce times that are +artificially slower than the real CI cold run. + +## Measurement Table + +CI runs `container` debug and release targets in parallel (matrix strategy) and +`testing` unit(nightly) + unit(stable) + docker-e2e in parallel. +CI wall time therefore approximates **max(parallel jobs)**, whereas the scripts +run jobs sequentially. Sequential totals are noted and CI-equivalent wall time is +estimated in the Notes column. + +| Workflow | Run Type | Sequential Total | CI-equivalent Wall Time | Main Bottleneck | Notes | +| --------- | --------------- | ---------------- | ----------------------- | ------------------------ | ------------------------------------------------------------------ | +| container | cold / no-cache | ~499 s (~8.3 m) | ~260 s (~4.3 m) | release compile+link | debug=239 s, release=260 s run in parallel on CI | +| container | warm / cached | ~2 s | ~2 s | none (all layers cached) | Both targets hit Docker layer cache fully | +| testing | cold / no-cache | ~767 s (~12.8 m) | ~510 s (~8.5 m) | docker-e2e Docker build | unit≈257 s, docker-e2e≈510 s; lint exited 1 (see §Notes) | +| testing | warm / cached | ~393 s (~6.6 m) | ~331 s (~5.5 m) | docker-e2e Docker build | unit≈62 s, docker-e2e≈331 s; docker build not fully cached locally | + +## Internal Phase Breakdown + +### Container Workflow + +Phases mirror `.github/workflows/container.yaml` → job `test` (matrix: debug, release). + +| Phase | Cold Run | Warm Run | Notes | +| ----------------- | -------- | -------- | ---------------------------------------------------------------------------------------------- | +| build (debug) | 239 s | 2 s | Bottleneck on cold: `dependencies_debug` cook (~47 s) + `build_debug` nextest archive (~131 s) | +| inspect (debug) | 0 s | 0 s | Negligible | +| build (release) | 260 s | 0 s | Bottleneck on cold: `dependencies` cook (~64 s) + `build` nextest archive (~157 s) | +| inspect (release) | 0 s | 0 s | Negligible | + +### Testing Workflow + +Phases mirror `.github/workflows/testing.yaml` → jobs `unit` + `docker-e2e`. + +#### Unit job + +| Phase | Cold Run | Warm Run | Notes | +| ----------------- | --------- | -------- | ------------------------------------------------- | +| fetch | 7 s | 0 s | Warm: all crates already in registry | +| install_linter | 5 s | 0 s | Warm: binary already in `~/.cargo/bin` | +| format | 0 s | 1 s | Negligible | +| lint | 48 s | 16 s | Exits 1 on both runs; see Notes below | +| test_docs | 58 s | 29 s | Warm benefits from incremental compilation | +| test_unit | 139 s | 16 s | Warm: incremental; cold dominated by compile+link | +| **unit subtotal** | **257 s** | **62 s** | | + +#### Docker E2E job + +| Phase | Cold Run | Warm Run | Notes | +| -------------------------- | --------- | --------- | ---------------------------------------------------------------------------------------------- | +| docker_build_e2e | 312 s | 234 s | Dominant phase; warm still slow — local Docker cache does not cover `dependencies` cook layers | +| e2e_tracker | 79 s | 16 s | Warm: image already built | +| e2e_qbittorrent_sqlite | 61 s | 24 s | Container startup + torrent seeding | +| e2e_qbittorrent_mysql | 29 s | 29 s | Consistent; DB startup dominates | +| e2e_qbittorrent_postgresql | 29 s | 28 s | Consistent; DB startup dominates | +| **e2e subtotal** | **510 s** | **331 s** | | + +Notes: + +- `lint` exited with code 1 on both cold and warm runs. This indicates existing + lint issues in the working tree at the time of measurement and does not affect + the timing validity; the step still ran to completion and consumed the measured time. +- Local Docker layer cache only partially covers `docker_build_e2e` on the warm + run because the `COPY . /build/src` and `COPY . /test/src` layers are + invalidated by any file change. The 234 s warm time reflects cache hits for + base images and dependency layers but a fresh `build` stage. + +## Linker-Heavy Target Analysis (Container Build Path) + +Source: `cargo build --timings --all-targets --release --workspace --all-features` +run on 2026-05-28. Full HTML report: +`docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/cargo-timing-release-20260528T074109Z.html` + +Total `cargo build` wall time reported by `--timings`: **188 s** (warm incremental, +local machine). + +Top 30 compile units by duration: + +| Rank | Duration | Crate / Package | Target | Runtime image? | Notes | +| ---- | -------- | ----------------------------------------------- | ------------------------------------------------ | -------------- | --------------------------------------------------- | +| 1 | 117 s | torrust-tracker | integration (test) | **no** | Integration test binary; not shipped in image | +| 2 | 117 s | torrust-tracker | torrust-tracker (bin) | **yes** | Main tracker binary — required | +| 3 | 116 s | torrust-tracker | profiling (bin) | **no** | Profiling helper binary; not in runtime image | +| 4 | 109 s | torrust-tracker | torrust_tracker_lib (lib, test) | **no** | Test variant of the lib; not shipped | +| 5 | 109 s | torrust-tracker-axum-health-check-api-server | integration (test) | **no** | Integration test binary; not shipped | +| 6 | 104 s | torrust-tracker-core | persistence_benchmark_runner (bin) | **no** | Benchmark binary; not shipped | +| 7 | 103 s | torrust-tracker-core | torrust_tracker_core (lib, test) | **no** | Test variant of the lib; not shipped | +| 8 | 94 s | torrust-tracker-axum-http-server | integration (test) | **no** | Integration test binary; not shipped | +| 9 | 93 s | torrust-tracker-axum-rest-api-server | integration (test) | **no** | Integration test binary; not shipped | +| 10 | 92 s | torrust-tracker-axum-rest-api-server | torrust_tracker_axum_rest_api_server (lib, test) | **no** | Test variant of the lib; not shipped | +| 11 | 89 s | torrust-tracker-axum-http-server | torrust_tracker_axum_http_server (lib, test) | **no** | Test variant of the lib; not shipped | +| 12 | 78 s | torrust-tracker-udp-server | torrust_tracker_udp_server (lib, test) | **no** | Test variant of the lib; not shipped | +| 13 | 71 s | torrust-tracker-udp-server | integration (test) | **no** | Integration test binary; not shipped | +| 14 | 60 s | torrust-tracker | qbittorrent_e2e_runner (bin) | **no** | E2E test runner binary; not shipped | +| 15 | 56 s | torrust-tracker-rest-api-core | torrust_tracker_rest_api_core (lib, test) | **no** | Test variant of the lib; not shipped | +| 16 | 52 s | torrust-tracker-http-tracker-core | torrust_tracker_http_tracker_core (lib, test) | **no** | Test variant of the lib; not shipped | +| 17 | 51 s | torrust-tracker-client | tracker_client (bin) | **no** | CLI client binary; not in runtime image | +| 18 | 50 s | torrust-tracker-core | integration (test) | **no** | Integration test binary; not shipped | +| 19 | 48 s | torrust-tracker-http-tracker-core | http_tracker_core_benchmark (bench, test) | **no** | Benchmark; not shipped | +| 20 | 47 s | torrust-tracker-client | tracker_checker (bin) | **no** | CLI checker binary; not in runtime image | +| 21 | 46 s | torrust-tracker-udp-tracker-core | udp_tracker_core_benchmark (bench, test) | **no** | Benchmark; not shipped | +| 22 | 46 s | libsqlite3-sys | build-script (run) | **yes** | SQLite3 C library compilation — required by runtime | +| 23 | 45 s | torrust-tracker-core | persistence_benchmark_runner (bin, test) | **no** | Benchmark test variant; not shipped | +| 24 | 44 s | torrust-tracker | e2e_tests_runner (bin) | **no** | E2E test runner binary; not shipped | +| 25 | 41 s | torrust-tracker-client | http_tracker_client (bin) | **no** | CLI client binary; not in runtime image | +| 26 | 39 s | torrust-tracker-torrent-repository-benchmarking | repository_benchmark (bench, test) | **no** | Benchmark; not shipped | +| 27 | 35 s | torrust-tracker | qbittorrent_e2e_runner (bin, test) | **no** | E2E runner test variant; not shipped | +| 28 | 35 s | torrust-tracker | profiling (bin, test) | **no** | Profiling test variant; not shipped | +| 29 | 35 s | torrust-tracker | e2e_tests_runner (bin, test) | **no** | E2E runner test variant; not shipped | +| 30 | 35 s | torrust-tracker | http_health_check (bin) | **yes** | Health-check binary — required by runtime image | + +**Of the top 30 compile units, only 3 are required by the tracker runtime image** +(`torrust-tracker` bin, `libsqlite3-sys` build script, `http_health_check` bin). +The remaining 27 units are test binaries, benchmarks, or utility binaries that +are compiled by the `--tests --benches --examples --all-targets` flags in the +Containerfile `cargo nextest archive` commands but are never included in the +final runtime image. + +## Docker Layer Breakdown (Cold Run) + +> **Note — per-layer capture requires `--progress plain`.** The initial cold run +> (`container-baseline-20260527T210123Z.log`) was captured before `--progress plain` +> was added to the script; Docker's BuildKit wrote per-step output to **stderr** only, +> so it was not saved in the evidence log. The `run-container-baseline.sh` script was +> updated on 2026-05-28 to pass `--progress plain`, which routes step output through +> stdout so it is captured alongside the phase-timing lines. Re-run the script with +> `--cold` to populate a new evidence log with per-layer durations. +> +> **Sub-command timing inside RUN steps**: BuildKit reports one wall-clock time per +> `RUN` instruction. When a `RUN` instruction chains multiple commands with `&&` or +> `;`, the individual command times are invisible at the step level. `time` wrappers +> were added on 2026-05-28 to every multi-command `RUN` block in the `Containerfile` +> (e.g. `apt-get update`, `cc` compile, `cp`/`chown`/`chmod` post-processing steps). +> With `--progress plain` these `time` outputs appear inline in the step's stdout/stderr +> stream and are captured in the evidence log. + +The layer structure and approximate timings listed below were observed in the +terminal output during the initial cold run and are provided as a structural +reference until a new evidence log is available. + +### Debug target (`--target debug`) + +| Layer (Dockerfile stage → step) | Approx. Cold Duration | Description | +| ------------------------------------------------------- | --------------------- | --------------------------------------------- | +| `chef` — install cargo-chef | ~7 s | Download and compile cargo-chef | +| `recipe` — `cargo chef prepare` | ~0.1 s | Generate `recipe.json` dependency manifest | +| `dependencies_debug` — `cargo chef cook` (cook) | ~47 s | Pre-compile dependency crates (debug profile) | +| `dependencies_debug` — `cargo nextest archive` (warmup) | ~8 s | Warm nextest archive with dep-only crates | +| `build_debug` — `cargo nextest archive` (full) | ~131 s | Compile + link all targets (debug profile) | +| `test_debug` — `cargo nextest run` (×2) | ~23 s total | Execute tests inside container | + +**Total observed (debug)**: ~216 s (cf. `build_debug_seconds=239` in the log; +the discrepancy reflects Docker overhead and steps with sub-second durations +not listed above). + +### Release target (`--target release`) + +| Layer (Dockerfile stage → step) | Approx. Cold Duration | Description | +| ------------------------------------------------- | --------------------- | ----------------------------------------------- | +| `recipe` — `cargo chef prepare` | (cached from debug) | Shared with debug target; no additional cost | +| `dependencies` — `cargo chef cook` (cook) | ~64 s | Pre-compile dependency crates (release profile) | +| `dependencies` — `cargo nextest archive` (warmup) | ~14 s | Warm nextest archive with dep-only crates | +| `build` — `cargo nextest archive` (full) | ~157 s | Compile + link all targets (release profile) | +| `test` — `cargo nextest run` (×2) | ~23 s total | Execute tests inside container | + +**Total observed (release)**: ~258 s (cf. `build_release_seconds=260` in the +log). + +### Key observations + +- The `build_*` stages dominate: 131 s (debug) and 157 s (release), reflecting + the cost of linking all non-runtime binaries and test targets. +- `dependencies_*` stages (~47–64 s) benefit from Docker layer caching on warm + runs; re-running after a `Cargo.lock` change invalidates these layers. +- The `recipe` stage is effectively free (<1 s) and is shared between debug and + release via Docker layer cache. + +### Finding: `.tmp/` missing from `.dockerignore` inflated COPY steps by ~30 s + +During the initial cold run, the `COPY . /build/src` step in the `recipe` and +`build_*` stages took approximately **30 s** — a cost that should be +near-instant. Investigation revealed that the `.tmp/` directory (used by the +`run-testing-baseline.sh` cold-run benchmark to isolate `CARGO_HOME` and +`CARGO_TARGET_DIR`) was not listed in `.dockerignore`. + +`.tmp/` is the workspace-local temp directory used by AI agent tools (e.g. +`TORRUST_GIT_HOOKS_LOG_DIR=.tmp` routes pre-commit/pre-push logs there). The +benchmark script `run-testing-baseline.sh` also writes its isolated +`CARGO_HOME` and `CARGO_TARGET_DIR` under `.tmp/workflow-benchmarks/`. After +a cold run, that sub-directory can reach several gigabytes of cargo registry +and build artifacts, causing Docker to include it in the build context and copy +it into intermediate stages. + +**Fix applied (2026-05-28)**: `/.tmp/` was added to `.dockerignore`. Re-running +the cold benchmark after this fix should reduce all `COPY . /…` steps to under +1 s. + +**Lesson**: Any directory that is git-ignored but resides in the project root +must also be explicitly excluded from the Docker build context via `.dockerignore`. +These two ignore mechanisms are independent — git does not feed into Docker. +The per-step timing captured by `--progress plain` makes this category of +problem immediately visible; without it, the slow `COPY` would have been hidden +inside the aggregate stage time. + +## Cargo Build Phase Analysis (Frontend vs Codegen vs Linker) + +Source: `cargo build --timings --all-targets --release --workspace --all-features` +(same run as the Linker-Heavy Target Analysis above; total wall time 188 s, warm +incremental). + +### How `cargo --timings` tracks phases + +`cargo --timings` records two **sections** per compilation unit: + +| Section name | Covers | +| ------------ | ---------------------------------------------------------------------- | +| `frontend` | Parsing, macro expansion, type-checking, borrow-checking, MIR lowering | +| `codegen` | LLVM IR generation and object-file emission (`rustc` internal) | + +The **linker** is an external process invoked by `rustc` after codegen. It is +not tracked as a named section; its wall time appears as the gap between the end +of `codegen` and the end of the compilation unit's overall `duration`, or — for +units where `rustc` hands off immediately to the linker — as a `null` sections +field in the timing data. + +### Units with section tracking (compilation-dominated, top 15) + +These are external dependency crates compiled incrementally. Each unit is at +most ~8 s because individual crate compilation is parallelised. + +| Rank | Total (s) | Frontend (s) | Codegen (s) | Crate | +| ---- | --------- | ------------ | ----------- | ------------------------------------------ | +| 1 | 8.3 | 3.1 | 5.1 | torrust-tracker (lib) | +| 2 | 7.7 | 1.9 | 5.8 | torrust-tracker-axum-rest-api-server (lib) | +| 3 | 7.6 | 4.4 | 3.1 | tokio | +| 4 | 7.5 | 7.2 | 0.2 | bollard-stubs | +| 5 | 7.4 | 3.8 | 3.6 | sqlx-postgres | +| 6 | 7.1 | 2.4 | 4.7 | criterion | +| 7 | 6.5 | 2.5 | 4.0 | criterion (test variant) | +| 8 | 6.0 | 4.2 | 1.9 | h2 | +| 9 | 5.9 | 2.3 | 3.7 | regex-automata | +| 10 | 5.7 | 1.0 | 4.7 | torrust-tracker-configuration | +| 11 | 5.6 | 2.0 | 3.6 | clap_builder | +| 12 | 5.4 | 3.7 | 1.8 | sqlx-postgres (test variant) | +| 13 | 5.2 | 2.1 | 3.1 | sqlx-mysql | +| 14 | 5.1 | 1.6 | 3.5 | toml_edit | +| 15 | 4.6 | 2.3 | 2.2 | sqlx-core | + +**No single crate compilation takes more than ~8 s.** Frontend and codegen time +per crate are roughly balanced for most units. + +### Units without section tracking (linker/C-build dominated, top 20) + +These units report `sections: null` in the timing data, meaning `cargo` did not +capture frontend/codegen section boundaries. For final binary and test targets +this is the signature of a **linker invocation** — `rustc` hands all `.rlib` +object files to the external linker and waits; no `rustc`-internal phase tracking +occurs. For C build scripts (`build-script (run)`) the time is C compiler +invocation. + +| Rank | Total (s) | Crate | Target | +| ---- | --------- | -------------------------------------------- | ---------------------------------------- | +| 1 | 117 | torrust-tracker | integration (test) | +| 2 | 117 | torrust-tracker | torrust-tracker (bin) | +| 3 | 116 | torrust-tracker | profiling (bin) | +| 4 | 109 | torrust-tracker | torrust_tracker_lib (lib,test) | +| 5 | 109 | torrust-tracker-axum-health-check-api-server | integration (test) | +| 6 | 104 | torrust-tracker-core | persistence_benchmark_runner (bin) | +| 7 | 103 | torrust-tracker-core | torrust_tracker_core (lib,test) | +| 8 | 94 | torrust-tracker-axum-http-server | integration (test) | +| 9 | 93 | torrust-tracker-axum-rest-api-server | integration (test) | +| 10 | 92 | torrust-tracker-axum-rest-api-server | lib (test) | +| 11 | 89 | torrust-tracker-axum-http-server | lib (test) | +| 12 | 78 | torrust-tracker-udp-server | lib (test) | +| 13 | 71 | torrust-tracker-udp-server | integration (test) | +| 14 | 60 | torrust-tracker | qbittorrent_e2e_runner (bin) | +| 15 | 56 | torrust-tracker-rest-api-core | lib (test) | +| 16 | 52 | torrust-tracker-http-tracker-core | lib (test) | +| 17 | 51 | torrust-tracker-client | tracker_client (bin) | +| 18 | 50 | torrust-tracker-core | integration (test) | +| 19 | 48 | torrust-tracker-http-tracker-core | http_tracker_core_benchmark (bench,test) | +| 20 | 47 | torrust-tracker-client | tracker_checker (bin) | + +**Build scripts (C compiler)**: + +| Duration (s) | Crate | Notes | +| ------------ | -------------- | ------------------------------------- | +| 46 | libsqlite3-sys | SQLite3 C source compilation | +| 33 | aws-lc-sys | AWS-LC (BoringSSL fork) C compilation | +| 26 | zstd-sys | zstd C source compilation | + +### Conclusion: the build is linker-dominated + +- **Individual crate compilation** (frontend + codegen): ≤ 8 s per crate. +- **Binary/test target linking**: 35–117 s per binary — an order of magnitude more than any single crate compilation. +- **Root cause**: the workspace compiles ~20+ binary and test targets (`--all-targets`), each of which requires a full linker invocation over the entire transitive closure of `.rlib` objects. + +Switching to a faster linker (e.g. `mold` or `lld`) or removing non-runtime binary targets from the build (subissue #2) are the two highest-leverage optimisations. + +## Comparison Notes + +### What dominated the cold run? + +- **Container workflow**: The `build` and `dependencies` Dockerfile stages, which + run `cargo nextest archive --tests --benches --examples --all-targets` for both + debug (131 s archive + 47 s cook) and release (157 s archive + 64 s cook) profiles. + The linking step for all non-runtime targets is the dominant cost. + +- **Testing workflow**: The Docker E2E job (`docker_build_e2e` = 312 s) dominates + because it re-executes the same full `cargo nextest archive` build inside the + container. On CI, the `unit` job (139 s compile) and `docker-e2e` job run in + parallel, so CI wall time is approximately 510 s. + +### Which phases benefited from the warm cache? + +- `test_unit`: 139 s → 16 s (incremental Rust compilation). +- `test_docs`: 58 s → 29 s (incremental). +- `fetch` and `install_linter`: 12 s → 0 s (registry and binary caches). +- `e2e_tracker`: 79 s → 16 s (image already in daemon cache). +- Container `build (debug)` and `build (release)`: essentially 0 s (all Docker + layers cached). + +### Which phases are not helped much by caching? + +- `docker_build_e2e` warm: still 234 s because the `COPY . /build/src` layer + invalidates on any file change, forcing the `build` stage to rerun. +- qBittorrent E2E phases: 29 s each regardless; dominated by container startup + and DB initialisation, not by build time. + +### Which linker-heavy targets appear unrelated to the final runtime image? + +All test binaries, benches, and utility binaries in the top 30 list (27 out of +30 units). The most significant by time: + +1. `torrust-tracker` integration tests — 117 s +2. `torrust-tracker` profiling bin — 116 s +3. All package-level integration test and lib-test variants — typically 50–110 s each + +These are compiled because the Containerfile uses `--tests --benches --examples +--all-targets`. Narrowing the Containerfile build flags to only the targets +required for the runtime image is the most impactful next optimization (see +subissue #2 in the EPIC). + +### Which measurements should be repeated after the next optimization? + +After subissue #2 (narrow Containerfile targets): + +- Re-run `run-container-baseline.sh --cold` and warm. +- Re-run `run-testing-baseline.sh --cold` and warm (the `docker_build_e2e` phase). +- Re-run `cargo build --timings --all-targets --release` to compare the new top-30. + +## Follow-up + +Append a new dated note after each later optimization. + +- **2026-05-28** — Initial baseline captured. Container cold≈499 s sequential + (CI≈260 s parallel). Testing cold≈767 s sequential (CI≈510 s parallel, dominated + by docker-e2e). 27 of the top 30 compile units are not required by the runtime + image; narrowing Containerfile build flags is the recommended first optimization. +- **2026-05-28** — `/.tmp/` added to `.dockerignore`; `time` wrappers added to all + multi-command `RUN` blocks in the `Containerfile`; `--progress plain` added to + `run-container-baseline.sh`. Re-run `--cold` to capture a new baseline log with + accurate per-step and per-command durations. diff --git a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md deleted file mode 100644 index 781f7d521..000000000 --- a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/benchmark-results.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -semantic-links: - related-artifacts: - - docs/issues/open/1841-1840-workflow-performance-baseline-analysis/ISSUE.md - - .github/workflows/container.yaml - - .github/workflows/testing.yaml ---- - -# Baseline Workflow Benchmark Results - -Recorded on: 2026-05-27 - -This file is the living benchmark artifact for the workflow-performance EPIC. Update it whenever a later optimization changes the performance profile so future runs can be compared against the same baseline. - -## Benchmark Policy - -- Capture one cold run after clearing relevant local caches. -- Capture one warm run immediately after the cold run without clearing caches. -- Record both total workflow time and the main internal phases for each workflow. -- Note the cache-reset procedure used to approximate a shared-runner first run. - -## Cache Reset Notes - -Document the exact commands used before the cold run, including any of the following where applicable: - -- `cargo clean` -- Removal of `target/` and other local Rust build artifacts -- Clearing the local cargo registry and git checkout caches if they would affect the run -- Docker builder cache cleanup if the workflow step uses Docker layers locally - -## Measurement Table - -| Workflow | Run Type | Total Time | Main Bottleneck | Notes | -| --------- | --------------- | ---------- | --------------- | -------------------------------------- | -| container | cold / no-cache | TBD | TBD | Fill after the first baseline capture. | -| container | warm / cached | TBD | TBD | Fill after the second capture. | -| testing | cold / no-cache | TBD | TBD | Fill after the first baseline capture. | -| testing | warm / cached | TBD | TBD | Fill after the second capture. | - -## Internal Phase Breakdown - -Record the major steps inside each job, ordered from longest to shortest if possible. - -### Container Workflow - -| Phase | Cold Run | Warm Run | Notes | -| ----- | -------- | -------- | ----- | -| TBD | TBD | TBD | TBD | - -### Testing Workflow - -| Phase | Cold Run | Warm Run | Notes | -| ----- | -------- | -------- | ----- | -| TBD | TBD | TBD | TBD | - -## Linker-Heavy Target Analysis (Container Build Path) - -Record the most expensive compile and link targets observed while reproducing the container build path. - -| Rank | Target / Package | Estimated Compile+Link Time | Required for Tracker Runtime Image (`yes`/`no`) | Notes | -| ---- | ---------------- | --------------------------- | ----------------------------------------------- | ----- | -| 1 | TBD | TBD | TBD | TBD | -| 2 | TBD | TBD | TBD | TBD | -| 3 | TBD | TBD | TBD | TBD | - -Guidance: - -- Mark `yes` only when the target is needed to produce or validate the tracker runtime image. -- Mark `no` when the target is outside runtime image needs (for example benches, unrelated binaries, or examples not required by image tests). -- Keep rationale short and concrete in the Notes column. - -## Comparison Notes - -- What dominated the cold run? -- Which phases benefited from the warm cache? -- Which phases are not helped much by caching? -- Which linker-heavy targets appear unrelated to the final tracker runtime image? -- Which measurements should be repeated after the next optimization? - -## Follow-up - -After each later workflow optimization, append a new dated note here with the same measurement format so the EPIC retains a simple before/after history. diff --git a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/cargo-timing-release-20260528T074109Z.html b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/cargo-timing-release-20260528T074109Z.html new file mode 100644 index 000000000..0cd1d1f37 --- /dev/null +++ b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/cargo-timing-release-20260528T074109Z.html @@ -0,0 +1,40964 @@ + + + + Cargo Build Timings — bittorrent-peer-id 3.0.0-develop, bittorrent-peer-id 3.0.0-develop, torrust-clock 3.0.0-develop, torrust-clock 3.0.0-develop, torrust-clock 3.0.0-develop, torrust-located-error 3.0.0-develop, torrust-located-error 3.0.0-develop, torrust-metrics 3.0.0-develop, torrust-metrics 3.0.0-develop, torrust-net-primitives 3.0.0-develop, torrust-net-primitives 3.0.0-develop, torrust-server-lib 3.0.0-develop, torrust-server-lib 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker 3.0.0-develop, torrust-tracker-axum-health-check-api-server 3.0.0-develop, torrust-tracker-axum-health-check-api-server 3.0.0-develop, torrust-tracker-axum-health-check-api-server 3.0.0-develop, torrust-tracker-axum-http-server 3.0.0-develop, torrust-tracker-axum-http-server 3.0.0-develop, torrust-tracker-axum-http-server 3.0.0-develop, torrust-tracker-axum-rest-api-server 3.0.0-develop, torrust-tracker-axum-rest-api-server 3.0.0-develop, torrust-tracker-axum-rest-api-server 3.0.0-develop, torrust-tracker-axum-server 3.0.0-develop, torrust-tracker-axum-server 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client 3.0.0-develop, torrust-tracker-client-lib 3.0.0-develop, torrust-tracker-client-lib 3.0.0-develop, torrust-tracker-configuration 3.0.0-develop, torrust-tracker-configuration 3.0.0-develop, torrust-tracker-contrib-bencode 3.0.0-develop, torrust-tracker-contrib-bencode 3.0.0-develop, torrust-tracker-contrib-bencode 3.0.0-develop, torrust-tracker-contrib-bencode 3.0.0-develop, torrust-tracker-core 3.0.0-develop, torrust-tracker-core 3.0.0-develop, torrust-tracker-core 3.0.0-develop, torrust-tracker-core 3.0.0-develop, torrust-tracker-core 3.0.0-develop, torrust-tracker-events 3.0.0-develop, torrust-tracker-events 3.0.0-develop, torrust-tracker-http-tracker-core 3.0.0-develop, torrust-tracker-http-tracker-core 3.0.0-develop, torrust-tracker-http-tracker-core 3.0.0-develop, torrust-tracker-http-tracker-protocol 3.0.0-develop, torrust-tracker-http-tracker-protocol 3.0.0-develop, torrust-tracker-primitives 3.0.0-develop, torrust-tracker-primitives 3.0.0-develop, torrust-tracker-rest-api-client 3.0.0-develop, torrust-tracker-rest-api-client 3.0.0-develop, torrust-tracker-rest-api-core 3.0.0-develop, torrust-tracker-rest-api-core 3.0.0-develop, torrust-tracker-swarm-coordination-registry 3.0.0-develop, torrust-tracker-swarm-coordination-registry 3.0.0-develop, torrust-tracker-test-helpers 3.0.0-develop, torrust-tracker-test-helpers 3.0.0-develop, torrust-tracker-torrent-repository-benchmarking 3.0.0-develop, torrust-tracker-torrent-repository-benchmarking 3.0.0-develop, torrust-tracker-torrent-repository-benchmarking 3.0.0-develop, torrust-tracker-torrent-repository-benchmarking 3.0.0-develop, torrust-tracker-udp-server 3.0.0-develop, torrust-tracker-udp-server 3.0.0-develop, torrust-tracker-udp-server 3.0.0-develop, torrust-tracker-udp-tracker-core 3.0.0-develop, torrust-tracker-udp-tracker-core 3.0.0-develop, torrust-tracker-udp-tracker-core 3.0.0-develop, torrust-tracker-udp-tracker-protocol 3.0.0-develop, torrust-tracker-udp-tracker-protocol 3.0.0-develop, workspace-coupling 3.0.0-develop, workspace-coupling 3.0.0-develop + + + + + +

Cargo Build Timings

+See Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Targets:bittorrent-peer-id 3.0.0-develop (lib)
bittorrent-peer-id 3.0.0-develop (lib)
torrust-clock 3.0.0-develop (lib)
torrust-clock 3.0.0-develop (lib)
torrust-clock 3.0.0-develop ( integration "test")
torrust-located-error 3.0.0-develop (lib)
torrust-located-error 3.0.0-develop (lib)
torrust-metrics 3.0.0-develop (lib)
torrust-metrics 3.0.0-develop (lib)
torrust-net-primitives 3.0.0-develop (lib)
torrust-net-primitives 3.0.0-develop (lib)
torrust-server-lib 3.0.0-develop (lib)
torrust-server-lib 3.0.0-develop (lib)
torrust-tracker 3.0.0-develop (lib)
torrust-tracker 3.0.0-develop (lib)
torrust-tracker 3.0.0-develop ( e2e_tests_runner "bin")
torrust-tracker 3.0.0-develop ( e2e_tests_runner "bin")
torrust-tracker 3.0.0-develop ( http_health_check "bin")
torrust-tracker 3.0.0-develop ( http_health_check "bin")
torrust-tracker 3.0.0-develop ( profiling "bin")
torrust-tracker 3.0.0-develop ( profiling "bin")
torrust-tracker 3.0.0-develop ( qbittorrent_e2e_runner "bin")
torrust-tracker 3.0.0-develop ( qbittorrent_e2e_runner "bin")
torrust-tracker 3.0.0-develop ( torrust-tracker "bin")
torrust-tracker 3.0.0-develop ( torrust-tracker "bin")
torrust-tracker 3.0.0-develop ( integration "test")
torrust-tracker-axum-health-check-api-server 3.0.0-develop (lib)
torrust-tracker-axum-health-check-api-server 3.0.0-develop (lib)
torrust-tracker-axum-health-check-api-server 3.0.0-develop ( integration "test")
torrust-tracker-axum-http-server 3.0.0-develop (lib)
torrust-tracker-axum-http-server 3.0.0-develop (lib)
torrust-tracker-axum-http-server 3.0.0-develop ( integration "test")
torrust-tracker-axum-rest-api-server 3.0.0-develop (lib)
torrust-tracker-axum-rest-api-server 3.0.0-develop (lib)
torrust-tracker-axum-rest-api-server 3.0.0-develop ( integration "test")
torrust-tracker-axum-server 3.0.0-develop (lib)
torrust-tracker-axum-server 3.0.0-develop (lib)
torrust-tracker-client 3.0.0-develop (lib)
torrust-tracker-client 3.0.0-develop (lib)
torrust-tracker-client 3.0.0-develop ( http_tracker_client "bin")
torrust-tracker-client 3.0.0-develop ( http_tracker_client "bin")
torrust-tracker-client 3.0.0-develop ( tracker_checker "bin")
torrust-tracker-client 3.0.0-develop ( tracker_checker "bin")
torrust-tracker-client 3.0.0-develop ( tracker_client "bin")
torrust-tracker-client 3.0.0-develop ( tracker_client "bin")
torrust-tracker-client 3.0.0-develop ( udp_tracker_client "bin")
torrust-tracker-client 3.0.0-develop ( udp_tracker_client "bin")
torrust-tracker-client 3.0.0-develop ( tracker_checker "test")
torrust-tracker-client 3.0.0-develop ( tracker_client "test")
torrust-tracker-client-lib 3.0.0-develop (lib)
torrust-tracker-client-lib 3.0.0-develop (lib)
torrust-tracker-configuration 3.0.0-develop (lib)
torrust-tracker-configuration 3.0.0-develop (lib)
torrust-tracker-contrib-bencode 3.0.0-develop (lib)
torrust-tracker-contrib-bencode 3.0.0-develop (lib)
torrust-tracker-contrib-bencode 3.0.0-develop ( mod "test")
torrust-tracker-contrib-bencode 3.0.0-develop ( bencode_benchmark "bench")
torrust-tracker-core 3.0.0-develop (lib)
torrust-tracker-core 3.0.0-develop (lib)
torrust-tracker-core 3.0.0-develop ( persistence_benchmark_runner "bin")
torrust-tracker-core 3.0.0-develop ( persistence_benchmark_runner "bin")
torrust-tracker-core 3.0.0-develop ( integration "test")
torrust-tracker-events 3.0.0-develop (lib)
torrust-tracker-events 3.0.0-develop (lib)
torrust-tracker-http-tracker-core 3.0.0-develop (lib)
torrust-tracker-http-tracker-core 3.0.0-develop (lib)
torrust-tracker-http-tracker-core 3.0.0-develop ( http_tracker_core_benchmark "bench")
torrust-tracker-http-tracker-protocol 3.0.0-develop (lib)
torrust-tracker-http-tracker-protocol 3.0.0-develop (lib)
torrust-tracker-primitives 3.0.0-develop (lib)
torrust-tracker-primitives 3.0.0-develop (lib)
torrust-tracker-rest-api-client 3.0.0-develop (lib)
torrust-tracker-rest-api-client 3.0.0-develop (lib)
torrust-tracker-rest-api-core 3.0.0-develop (lib)
torrust-tracker-rest-api-core 3.0.0-develop (lib)
torrust-tracker-swarm-coordination-registry 3.0.0-develop (lib)
torrust-tracker-swarm-coordination-registry 3.0.0-develop (lib)
torrust-tracker-test-helpers 3.0.0-develop (lib)
torrust-tracker-test-helpers 3.0.0-develop (lib)
torrust-tracker-torrent-repository-benchmarking 3.0.0-develop (lib)
torrust-tracker-torrent-repository-benchmarking 3.0.0-develop (lib)
torrust-tracker-torrent-repository-benchmarking 3.0.0-develop ( integration "test")
torrust-tracker-torrent-repository-benchmarking 3.0.0-develop ( repository_benchmark "bench")
torrust-tracker-udp-server 3.0.0-develop (lib)
torrust-tracker-udp-server 3.0.0-develop (lib)
torrust-tracker-udp-server 3.0.0-develop ( integration "test")
torrust-tracker-udp-tracker-core 3.0.0-develop (lib)
torrust-tracker-udp-tracker-core 3.0.0-develop (lib)
torrust-tracker-udp-tracker-core 3.0.0-develop ( udp_tracker_core_benchmark "bench")
torrust-tracker-udp-tracker-protocol 3.0.0-develop (lib)
torrust-tracker-udp-tracker-protocol 3.0.0-develop (lib)
workspace-coupling 3.0.0-develop ( workspace-coupling "bin")
workspace-coupling 3.0.0-develop ( workspace-coupling "bin")
Profile:release
Fresh units:0
Dirty units:850
Total units:850
Max concurrency:34 (jobs=32 ncpu=32)
Build start:2026-05-28T07:37:52.897305827Z
Total time:187.8s (3m 7.8s)
rustc:rustc 1.97.0-nightly (b954122bb 2026-05-20)
Host: x86_64-unknown-linux-gnu
Target: x86_64-unknown-linux-gnu
+ + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UnitTotalFrontendCodegenFeatures
1.torrust-tracker v3.0.0-develop integration "test" (test)117.3s
2.torrust-tracker v3.0.0-develop torrust-tracker "bin"117.0s
3.torrust-tracker v3.0.0-develop profiling "bin"115.6s
4.torrust-tracker v3.0.0-develop torrust_tracker_lib "lib" (test)109.4s
5.torrust-tracker-axum-health-check-api-server v3.0.0-develop integration "test" (test)109.0s
6.torrust-tracker-core v3.0.0-develop persistence_benchmark_runner "bin"104.3sdb-compatibility-tests, default
7.torrust-tracker-core v3.0.0-develop torrust_tracker_core "lib" (test)102.7sdb-compatibility-tests, default
8.torrust-tracker-axum-http-server v3.0.0-develop integration "test" (test)94.1s
9.torrust-tracker-axum-rest-api-server v3.0.0-develop integration "test" (test)92.9s
10.torrust-tracker-axum-rest-api-server v3.0.0-develop torrust_tracker_axum_rest_api_server "lib" (test)91.7s
11.torrust-tracker-axum-http-server v3.0.0-develop torrust_tracker_axum_http_server "lib" (test)88.9s
12.torrust-tracker-udp-server v3.0.0-develop torrust_tracker_udp_server "lib" (test)78.4s
13.torrust-tracker-udp-server v3.0.0-develop integration "test" (test)70.9s
14.torrust-tracker v3.0.0-develop qbittorrent_e2e_runner "bin"59.8s
15.torrust-tracker-rest-api-core v3.0.0-develop torrust_tracker_rest_api_core "lib" (test)56.0s
16.torrust-tracker-http-tracker-core v3.0.0-develop torrust_tracker_http_tracker_core "lib" (test)52.1s
17.torrust-tracker-client v3.0.0-develop tracker_client "bin"51.5s
18.torrust-tracker-core v3.0.0-develop integration "test" (test)50.0sdb-compatibility-tests, default
19.torrust-tracker-http-tracker-core v3.0.0-develop http_tracker_core_benchmark "bench" (test)48.0s
20.torrust-tracker-client v3.0.0-develop tracker_checker "bin"47.0s
21.torrust-tracker-udp-tracker-core v3.0.0-develop udp_tracker_core_benchmark "bench" (test)46.1s
22.libsqlite3-sys v0.30.1 build-script (run)45.9sbundled, bundled_bindings, cc, pkg-config, unlock_notify, vcpkg
23.torrust-tracker-core v3.0.0-develop persistence_benchmark_runner "bin" (test)45.0sdb-compatibility-tests, default
24.torrust-tracker v3.0.0-develop e2e_tests_runner "bin"43.6s
25.torrust-tracker-client v3.0.0-develop http_tracker_client "bin"40.9s
26.torrust-tracker-torrent-repository-benchmarking v3.0.0-develop repository_benchmark "bench" (test)38.7s
27.torrust-tracker v3.0.0-develop qbittorrent_e2e_runner "bin" (test)35.0s
28.torrust-tracker v3.0.0-develop profiling "bin" (test)35.0s
29.torrust-tracker v3.0.0-develop e2e_tests_runner "bin" (test)34.6s
30.torrust-tracker v3.0.0-develop http_health_check "bin"34.5s
31.torrust-tracker v3.0.0-develop torrust-tracker "bin" (test)33.2s
32.aws-lc-sys v0.41.0 build-script (run)32.9sprebuilt-nasm
33.torrust-tracker-torrent-repository-benchmarking v3.0.0-develop integration "test" (test)30.2s
34.zstd-sys v2.0.16+zstd.1.5.7 build-script (run)26.4sstd
35.torrust-tracker-udp-tracker-core v3.0.0-develop torrust_tracker_udp_tracker_core "lib" (test)24.8s
36.torrust-tracker-contrib-bencode v3.0.0-develop bencode_benchmark "bench" (test)23.4s
37.torrust-tracker-client-lib v3.0.0-develop torrust_tracker_client "lib" (test)20.6s
38.torrust-tracker-configuration v3.0.0-develop torrust_tracker_configuration "lib" (test)19.8s
39.torrust-tracker-udp-tracker-protocol v3.0.0-develop torrust_tracker_udp_tracker_protocol "lib" (test)18.3sdefault
40.torrust-tracker-axum-health-check-api-server v3.0.0-develop torrust_tracker_axum_health_check_api_server "lib" (test)17.1s
41.bittorrent-peer-id v3.0.0-develop bittorrent_peer_id "lib" (test)16.4sdefault, quickcheck, serde, zerocopy
42.workspace-coupling v3.0.0-develop workspace-coupling "bin"16.3s
43.torrust-tracker-swarm-coordination-registry v3.0.0-develop torrust_tracker_swarm_coordination_registry "lib" (test)16.2s
44.torrust-metrics v3.0.0-develop torrust_metrics "lib" (test)16.2s
45.torrust-tracker-client v3.0.0-develop udp_tracker_client "bin"15.6s
46.torrust-tracker-client v3.0.0-develop torrust_tracker_console_client "lib" (test)14.6s
47.torrust-tracker v3.0.0-develop http_health_check "bin" (test)12.6s
48.torrust-tracker-axum-server v3.0.0-develop torrust_tracker_axum_server "lib" (test)12.4s
49.torrust-tracker-http-tracker-protocol v3.0.0-develop torrust_tracker_http_tracker_protocol "lib" (test)11.2s
50.torrust-tracker-client v3.0.0-develop tracker_client "bin" (test)10.8s
51.torrust-tracker-client v3.0.0-develop udp_tracker_client "bin" (test)10.5s
52.torrust-tracker-client v3.0.0-develop http_tracker_client "bin" (test)10.5s
53.torrust-tracker-events v3.0.0-develop torrust_tracker_events "lib" (test)10.3s
54.torrust-tracker-client v3.0.0-develop tracker_checker "bin" (test)10.2s
55.torrust-tracker-torrent-repository-benchmarking v3.0.0-develop torrust_tracker_torrent_repository_benchmarking "lib" (test)10.2s
56.ring v0.17.14 build-script (run)10.0salloc, default, dev_urandom_fallback
57.torrust-tracker-test-helpers v3.0.0-develop torrust_tracker_test_helpers "lib" (test)9.8s
58.torrust-tracker-primitives v3.0.0-develop torrust_tracker_primitives "lib" (test)9.2s
59.torrust-net-primitives v3.0.0-develop torrust_net_primitives "lib" (test)8.4s
60.torrust-tracker v3.0.0-develop8.3s3.1s (38%)5.1s (62%)
61.torrust-tracker-rest-api-client v3.0.0-develop torrust_tracker_rest_api_client "lib" (test)8.2s
62.workspace-coupling v3.0.0-develop workspace-coupling "bin" (test)8.1s
63.torrust-clock v3.0.0-develop torrust_clock "lib" (test)7.8s
64.torrust-tracker-axum-rest-api-server v3.0.0-develop7.7s1.9s (25%)5.8s (75%)
65.torrust-tracker-contrib-bencode v3.0.0-develop torrust_tracker_contrib_bencode "lib" (test)7.6s
66.tokio v1.52.37.6s4.4s (59%)3.1s (41%)bytes, default, fs, io-util, libc, macros, mio, net, process, rt, rt-multi-thread, signal, signal-hook-registry, socket2, sync, time, tokio-macros
67.torrust-located-error v3.0.0-develop torrust_located_error "lib" (test)7.5s
68.bollard-stubs v1.52.1-rc.29.1.37.5s7.2s (97%)0.2s (3%)base64, bollard-buildkit-proto, buildkit, bytes, prost, time
69.sqlx-postgres v0.8.67.4s3.8s (52%)3.6s (48%)any, json, migrate
70.torrust-tracker-contrib-bencode v3.0.0-develop mod "test" (test)7.2s
71.torrust-clock v3.0.0-develop integration "test" (test)7.2s
72.criterion v0.5.17.1s2.4s (34%)4.7s (66%)async, async_tokio, cargo_bench_support, default, futures, plotters, rayon, tokio
73.criterion v0.8.26.5s2.5s (38%)4.0s (62%)async, async_tokio, cargo_bench_support, default, plotters, rayon
74.h2 v0.4.146.0s4.2s (69%)1.9s (31%)
75.torrust-tracker-client v3.0.0-develop tracker_checker "test" (test)6.0s
76.regex-automata v0.4.145.9s2.3s (38%)3.7s (62%)alloc, dfa-onepass, hybrid, meta, nfa-backtrack, nfa-pikevm, nfa-thompson, perf-inline, perf-literal, perf-literal-multisubstring, perf-literal-substring, std, syntax, unicode, unicode-age, unicode-bool, unicode-case, unicode-gencat, unicode-perl, unicode-script, unicode-segment, unicode-word-boundary
77.libsqlite3-sys v0.30.1 build-script (run)5.7sbundled, bundled_bindings, cc, pkg-config, unlock_notify, vcpkg
78.torrust-tracker-configuration v3.0.0-develop5.7s1.0s (18%)4.7s (82%)
79.clap_builder v4.6.05.6s2.0s (35%)3.6s (65%)color, env, error-context, help, std, suggestions, usage
80.sqlx-postgres v0.8.65.4s3.7s (68%)1.8s (32%)json, migrate, offline
81.sqlx-mysql v0.8.65.2s2.1s (41%)3.1s (59%)any, json, migrate, serde
82.toml_edit v0.22.275.1s1.6s (32%)3.5s (68%)display, parse, serde
83.torrust-tracker-client v3.0.0-develop tracker_client "test" (test)5.0s
84.torrust-server-lib v3.0.0-develop torrust_server_lib "lib" (test)4.7s
85.sqlx-core v0.8.64.6s2.3s (51%)2.2s (49%)_rt-tokio, _tls-native-tls, any, crc, default, json, migrate, native-tls, offline, serde, serde_json, sha2, tokio, tokio-stream
86.tokio v1.52.34.4s3.5s (80%)0.9s (20%)bytes, default, fs, io-util, libc, mio, net, rt, socket2, sync, time
87.syn v2.0.1174.3s3.0s (70%)1.3s (30%)clone-impls, default, derive, extra-traits, fold, full, parsing, printing, proc-macro, visit, visit-mut
88.bollard v0.20.24.2s2.2s (52%)2.0s (48%)bollard-buildkit-proto, buildkit_providerless, default, home, http, hyper-named-pipe, hyper-rustls, hyper-util, hyperlocal, num, pipe, rand, rustls, rustls-native-certs, rustls-pki-types, ssl, ssl_providerless, time, tokio-stream, tonic, tower-service
89.axum v0.8.94.1s3.8s (91%)0.4s (9%)default, form, http1, json, macros, matched-path, original-uri, query, tokio, tower-log, tracing
90.openssl v0.10.803.8s2.6s (69%)1.2s (31%)default
91.torrust-tracker-core v3.0.0-develop3.7s2.1s (58%)1.6s (42%)db-compatibility-tests, default
92.brotli v8.0.23.7s3.1s (85%)0.6s (15%)alloc-stdlib, default, std
93.zerocopy v0.8.483.7s3.5s (96%)0.2s (4%)derive, simd, zerocopy-derive
94.neli v0.7.43.6s2.1s (58%)1.5s (42%)default, parking_lot, sync
95.openmetrics-parser v0.4.43.6s0.9s (25%)2.7s (75%)
96.regex-syntax v0.8.103.5s1.4s (39%)2.1s (61%)default, std, unicode, unicode-age, unicode-bool, unicode-case, unicode-gencat, unicode-perl, unicode-script, unicode-segment
97.object v0.37.33.4s3.1s (91%)0.3s (9%)archive, coff, elf, macho, pe, read_core, unaligned, xcoff
98.zerocopy v0.8.483.2s3.1s (96%)0.1s (4%)simd
99.testcontainers v0.27.33.1s1.9s (60%)1.3s (40%)default, ring
100.torrust-tracker-udp-server v3.0.0-develop3.1s1.3s (41%)1.8s (59%)
101.openssl v0.10.803.1s2.5s (81%)0.6s (19%)default
102.sqlx-sqlite v0.8.63.1s1.8s (58%)1.3s (42%)bundled, json, migrate, offline, serde
103.tonic v0.14.63.1s1.9s (61%)1.2s (39%)channel, codegen, default, router, server, transport
104.sqlx-mysql v0.8.63.0s1.9s (61%)1.2s (39%)json, migrate, offline, serde
105.regex-automata v0.4.142.8s1.9s (68%)0.9s (32%)alloc, dfa-onepass, hybrid, meta, nfa-backtrack, nfa-pikevm, nfa-thompson, perf-inline, perf-literal, perf-literal-multisubstring, perf-literal-substring, std, syntax, unicode, unicode-age, unicode-bool, unicode-case, unicode-gencat, unicode-perl, unicode-script, unicode-segment, unicode-word-boundary
106.rstest_macros v0.25.02.8sasync-timeout, crate-name
107.serde_derive v1.0.2282.8sdefault
108.figment v0.10.192.7s0.9s (32%)1.9s (68%)env, parking_lot, parse-value, pear, tempfile, test, toml
109.aho-corasick v1.1.42.7s0.9s (34%)1.8s (66%)perf-literal, std
110.rustls v0.23.402.7s2.0s (72%)0.8s (28%)aws-lc-rs, aws_lc_rs, log, logging, ring, std, tls12
111.rstest_macros v0.26.12.7sasync-timeout, crate-name
112.sqlx-core v0.8.62.7s2.1s (76%)0.6s (24%)_rt-tokio, _tls-native-tls, any, crc, default, json, migrate, native-tls, offline, serde, serde_json, sha2, tokio, tokio-stream
113.futures-util v0.3.322.6s2.5s (95%)0.1s (5%)alloc, async-await, async-await-macro, channel, default, futures-channel, futures-io, futures-macro, futures-sink, io, memchr, sink, slab, std
114.ring v0.17.142.6s1.4s (56%)1.1s (44%)alloc, default, dev_urandom_fallback
115.gimli v0.32.32.5s2.2s (85%)0.4s (15%)read, read-core
116.mockall_derive v0.14.02.5s
117.time v0.3.472.5s1.7s (66%)0.8s (34%)alloc, default, formatting, parsing, serde, serde-well-known, std
118.torrust-tracker-axum-http-server v3.0.0-develop2.5s0.9s (36%)1.6s (64%)
119.hyper v1.9.02.5s1.5s (60%)1.0s (40%)client, default, http1, http2, server
120.futures-util v0.3.322.4s2.4s (96%)0.1s (4%)alloc, futures-io, futures-sink, io, memchr, sink, slab, std
121.rustix v1.1.42.4s1.8s (76%)0.6s (24%)alloc, default, fs, std, termios
122.backtrace v0.3.762.4s0.5s (23%)1.8s (77%)default, std
123.toml v0.9.12+spec-1.1.02.3s1.0s (45%)1.2s (55%)default, display, parse, serde, std
124.torrust-tracker-swarm-coordination-registry v3.0.0-develop2.3s0.8s (35%)1.5s (65%)
125.darling_core v0.23.02.3s1.3s (56%)1.0s (44%)strsim, suggestions
126.tracing-subscriber v0.3.232.3s1.1s (46%)1.2s (54%)alloc, ansi, default, fmt, json, nu-ansi-term, registry, serde, serde_json, sharded-slab, smallvec, std, thread_local, tracing-log, tracing-serde
127.regex-syntax v0.8.102.2s1.5s (69%)0.7s (31%)default, std, unicode, unicode-age, unicode-bool, unicode-case, unicode-gencat, unicode-perl, unicode-script, unicode-segment
128.toml v1.1.2+spec-1.1.02.2s0.9s (42%)1.3s (58%)default, display, parse, serde, std
129.num-bigint-dig v0.8.62.2s1.0s (47%)1.2s (53%)i128, prime, rand, u64_digit, zeroize
130.darling_core v0.20.112.2s1.2s (57%)0.9s (43%)strsim, suggestions
131.chrono v0.4.442.2s1.1s (50%)1.1s (50%)alloc, clock, iana-time-zone, now, std, winapi, windows-link
132.encoding_rs v0.8.352.1s1.0s (46%)1.1s (54%)alloc, default
133.miette v7.6.02.1s0.7s (35%)1.3s (65%)default, derive, fancy, fancy-base, fancy-no-backtrace
134.hyper-util v0.1.202.0s1.6s (77%)0.5s (23%)client, client-legacy, client-proxy, client-proxy-system, default, http1, http2, server, server-auto, service, tokio
135.rayon v1.12.02.0s1.9s (93%)0.1s (7%)
136.num-bigint v0.4.61.9s1.2s (63%)0.7s (37%)std
137.serde_json v1.0.1501.9s0.9s (49%)1.0s (51%)alloc, default, indexmap, preserve_order, raw_value, std
138.torrust-tracker-client v3.0.0-develop1.9s1.1s (55%)0.9s (45%)
139.serde_core v1.0.2281.9s1.8s (94%)0.1s (6%)alloc, default, rc, result, std
140.serde_core v1.0.2281.9s1.8s (94%)0.1s (6%)alloc, rc, result, std
141.brotli-decompressor v5.0.01.9s0.7s (40%)1.1s (60%)alloc-stdlib, std
142.reqwest v0.13.41.9s0.9s (48%)1.0s (52%)__rustls, __rustls-aws-lc-rs, __tls, charset, default, default-tls, http2, json, multipart, query, rustls, system-proxy
143.bollard-buildkit-proto v0.7.01.8s1.7s (91%)0.2s (9%)default, fetch, ureq
144.winnow v0.7.151.8s1.6s (87%)0.2s (13%)alloc, default, std
145.serde_with v3.20.01.8s1.7s (95%)0.1s (5%)alloc, default, json, macros, std
146.derive_more-impl v2.1.11.8sas_ref, constructor, default, display, from
147.sqlx-sqlite v0.8.61.8s1.1s (63%)0.7s (37%)any, bundled, json, migrate, serde
148.torrust-tracker-test-helpers v3.0.0-develop1.7s0.3s (20%)1.4s (80%)
149.torrust-tracker-torrent-repository-benchmarking v3.0.0-develop1.6s0.6s (36%)1.1s (64%)
150.der v0.7.101.6s1.0s (61%)0.6s (39%)alloc, oid, pem, std, zeroize
151.axum-core v0.5.61.6s1.3s (79%)0.3s (21%)tracing
152.sqlx-macros-core v0.8.61.6s1.1s (67%)0.5s (33%)_rt-tokio, _sqlite, _tls-native-tls, default, derive, json, macros, migrate, mysql, postgres, sqlite, sqlx-mysql, sqlx-postgres, sqlx-sqlite, tokio
153.quickcheck v1.1.01.5s0.5s (34%)1.0s (66%)default, env_logger, log, regex, use_logging
154.clap_derive v4.6.11.5sdefault
155.prost-types v0.14.31.5s1.0s (66%)0.5s (34%)default, std
156.torrust-metrics v3.0.0-develop1.5s0.6s (38%)0.9s (62%)
157.icu_locale_core v2.2.01.5s0.8s (58%)0.6s (42%)zerovec
158.itertools v0.14.01.4s1.4s (93%)0.1s (7%)default, use_alloc, use_std
159.itertools v0.13.01.4s1.3s (91%)0.1s (9%)default, use_alloc, use_std
160.toml v0.8.231.4s0.5s (33%)1.0s (67%)default, display, parse
161.aho-corasick v1.1.41.4s0.7s (53%)0.7s (47%)perf-literal, std
162.rsa v0.9.101.4s0.5s (36%)0.9s (64%)default, pem, std, u64_digit
163.local-ip-address v0.6.131.3s0.2s (16%)1.1s (84%)
164.pest v2.8.61.3s1.1s (82%)0.2s (18%)default, memchr, std
165.prost-derive v0.14.31.3s
166.deranged v0.5.81.3s1.3s (96%)0.1s (4%)default, powerfmt, serde
167.axum-macros v0.5.11.3sdefault
168.url v2.5.81.3s0.5s (41%)0.8s (59%)default, serde, std
169.zerocopy-derive v0.8.481.3s
170.torrust-tracker-http-tracker-protocol v3.0.0-develop1.3s0.4s (30%)0.9s (70%)
171.pest_meta v2.8.61.3s0.6s (48%)0.7s (52%)default
172.cc v1.2.621.2s0.7s (58%)0.5s (42%)parallel
173.der v0.7.101.2s0.9s (77%)0.3s (23%)alloc, oid, pem, std, zeroize
174.plotters v0.3.71.2s1.0s (88%)0.1s (12%)area_series, line_series, plotters-svg, svg_backend
175.itertools v0.14.01.2s1.1s (95%)0.1s (5%)default, use_alloc, use_std
176.stringprep v0.1.51.2s0.2s (17%)1.0s (83%)
177.http v1.4.11.2s0.7s (59%)0.5s (41%)default, std
178.itertools v0.10.51.2s1.1s (92%)0.1s (8%)default, use_alloc, use_std
179.pest v2.8.61.1s1.0s (90%)0.1s (10%)default, memchr, std
180.tower v0.5.31.1s1.0s (87%)0.1s (13%)balance, buffer, discover, futures-core, futures-util, indexmap, limit, load, load-shed, log, make, pin-project-lite, ready-cache, retry, slab, sync_wrapper, timeout, tokio, tokio-util, tracing, util
181.ureq-proto v0.6.01.1s0.4s (32%)0.8s (68%)client
182.parse-display-derive v0.9.11.1s
183.sha2 v0.11.01.1s0.8s (71%)0.3s (29%)alloc, default, oid
184.icu_properties v2.2.01.1s0.9s (80%)0.2s (20%)compiled_data
185.winnow v1.0.31.1s1.0s (90%)0.1s (10%)alloc, ascii, binary, default, parser, std
186.serde_json v1.0.1501.1s0.8s (77%)0.3s (23%)default, raw_value, std
187.sqlx-macros v0.8.61.1s_rt-tokio, _tls-native-tls, default, derive, json, macros, migrate, mysql, postgres, sqlite
188.icu_properties v2.2.01.0s0.8s (82%)0.2s (18%)compiled_data
189.thiserror-impl v2.0.181.0s
190.derive_more-impl v1.0.01.0sdefault, display
191.num-bigint-dig v0.8.61.0s0.8s (75%)0.3s (25%)i128, prime, rand, u64_digit, zeroize
192.tracing-attributes v0.1.311.0s
193.astral-tokio-tar v0.6.21.0s0.7s (69%)0.3s (31%)default, xattr
194.libm v0.2.161.0s0.6s (63%)0.4s (37%)arch, default
195.thiserror-impl v1.0.691.0s
196.ureq v3.3.01.0s0.6s (60%)0.4s (40%)_rustls, _tls, rustls-no-provider
197.idna v1.1.01.0s0.3s (30%)0.7s (70%)alloc, compiled_data, std
198.icu_locale_core v2.2.00.9s0.7s (74%)0.2s (26%)zerovec
199.miette-derive v7.6.00.9s
200.textwrap v0.16.20.9s0.3s (33%)0.6s (67%)unicode-linebreak, unicode-width
201.libm v0.2.160.9s0.7s (79%)0.2s (21%)arch, default
202.zerofrom-derive v0.1.70.9s
203.typenum v1.20.00.9s0.9s (96%)0.0s (4%)const-generics
204.zerovec-derive v0.11.30.9s
205.toml_edit v0.25.11+spec-1.1.00.9s0.5s (60%)0.4s (40%)parse
206.torrust-tracker-axum-health-check-api-server v3.0.0-develop0.9s0.4s (49%)0.5s (51%)
207.crypto-common v0.2.20.9s0.5s (56%)0.4s (44%)
208.docker_credential v1.4.00.9s0.2s (25%)0.7s (75%)
209.rayon-core v1.13.00.8s0.4s (51%)0.4s (49%)
210.pear v0.2.90.8s0.5s (61%)0.3s (39%)color, default, yansi
211.pin-project-internal v1.1.130.8s
212.yoke-derive v0.8.20.8s
213.toml_parser v1.1.2+spec-1.1.00.8s0.3s (40%)0.5s (60%)alloc, std
214.serde_with_macros v3.20.00.8s
215.structmeta-derive v0.3.00.8s
216.num-traits v0.2.190.8s0.7s (84%)0.1s (16%)default, i128, libm, std
217.miniz_oxide v0.8.90.8s0.4s (49%)0.4s (51%)simd, simd-adler32, with-alloc
218.unicode-bidi v0.3.180.8s0.4s (46%)0.4s (54%)default, hardcoded-data, std
219.num-rational v0.4.20.8s0.3s (35%)0.5s (65%)num-bigint, num-bigint-std, std
220.neli-proc-macros v0.2.20.8s
221.owo-colors v4.3.00.8s0.6s (83%)0.1s (17%)
222.derive_builder_core v0.20.20.8s0.5s (59%)0.3s (41%)lib_has_std
223.pkcs1 v0.7.50.8s0.2s (29%)0.5s (71%)alloc, pem, pkcs8, std, zeroize
224.async-trait v0.1.890.7s
225.regex v1.12.30.7s0.4s (55%)0.3s (45%)default, perf, perf-backtrack, perf-cache, perf-dfa, perf-inline, perf-literal, perf-onepass, std, unicode, unicode-age, unicode-bool, unicode-case, unicode-gencat, unicode-perl, unicode-script, unicode-segment
226.sha2 v0.10.90.7s0.3s (39%)0.4s (61%)
227.tokio-util v0.7.180.7s0.4s (62%)0.3s (38%)codec, default, io
228.aws-lc-sys v0.41.0 build-script0.7sprebuilt-nasm
229.pest_generator v2.8.60.7s0.5s (64%)0.2s (36%)std
230.compact_str v0.9.00.7s0.4s (55%)0.3s (45%)default, std
231.rand v0.8.60.7s0.6s (87%)0.1s (13%)alloc, getrandom, libc, rand_chacha, std, std_rng
232.hashbrown v0.15.50.7s0.6s (93%)0.1s (7%)allocator-api2, default, default-hasher, equivalent, inline-more, raw-entry
233.ciborium v0.2.20.7s0.5s (74%)0.2s (26%)default, std
234.num-traits v0.2.190.7s0.6s (93%)0.1s (7%)i128, libm, std
235.typenum v1.20.00.7s0.6s (93%)0.1s (7%)
236.ferroid v2.0.00.7s0.2s (30%)0.5s (70%)base32, default, std, ulid
237.torrust-tracker-client-lib v3.0.0-develop0.7s0.5s (70%)0.2s (30%)
238.indexmap v2.14.00.7s0.6s (95%)0.0s (5%)default, std
239.icu_normalizer v2.2.00.7s0.3s (51%)0.3s (49%)compiled_data
240.tinytemplate v1.2.10.7s0.2s (35%)0.4s (65%)
241.rustc-demangle v0.1.270.6s0.3s (42%)0.4s (58%)
242.rand v0.10.10.6s0.5s (77%)0.2s (23%)alloc, default, std, std_rng, sys_rng, thread_rng
243.tower-http v0.6.110.6s0.5s (83%)0.1s (17%)compression-br, compression-deflate, compression-full, compression-gzip, compression-zstd, cors, default, follow-redirect, futures-core, futures-util, propagate-header, request-id, tokio-util, tower, trace, tracing, uuid
244.hashbrown v0.14.50.6s0.6s (94%)0.0s (6%)raw
245.url v2.5.80.6s0.4s (70%)0.2s (30%)default, std
246.toml_parser v1.1.2+spec-1.1.00.6s0.4s (60%)0.2s (40%)alloc, default, std
247.torrust-tracker-contrib-bencode v3.0.0-develop0.6s0.2s (37%)0.4s (63%)
248.criterion-plot v0.8.20.6s0.3s (51%)0.3s (49%)
249.aws-lc-rs v1.17.00.6s0.5s (83%)0.1s (17%)aws-lc-sys, prebuilt-nasm
250.rand v0.8.60.6s0.6s (89%)0.1s (11%)alloc, getrandom, libc, rand_chacha, small_rng, std, std_rng
251.futures-macro v0.3.320.6s
252.zerovec v0.11.60.6s0.6s (94%)0.0s (6%)derive, yoke
253.torrust-tracker-udp-tracker-core v3.0.0-develop0.6s0.3s (57%)0.3s (43%)
254.libc v0.2.1860.6s0.6s (92%)0.0s (8%)default, std
255.libc v0.2.1860.6s0.6s (93%)0.0s (7%)default, std
256.hashbrown v0.15.50.6s0.6s (95%)0.0s (5%)allocator-api2, default, default-hasher, equivalent, inline-more, raw-entry
257.rand v0.9.40.6s0.5s (84%)0.1s (16%)alloc, default, os_rng, small_rng, std, std_rng, thread_rng
258.criterion-plot v0.5.00.6s0.3s (49%)0.3s (51%)
259.predicates v3.1.40.6s0.3s (56%)0.2s (44%)
260.indexmap v2.14.00.6s0.5s (95%)0.0s (5%)default, std
261.tracing-core v0.1.360.6s0.4s (70%)0.2s (30%)once_cell, std
262.pear_codegen v0.2.90.6s
263.zerovec v0.11.60.6s0.5s (89%)0.1s (11%)derive, yoke
264.ipnet v2.12.00.6s0.2s (35%)0.4s (65%)default, std
265.bytes v1.11.10.5s0.4s (81%)0.1s (19%)default, std
266.openssl-sys v0.9.1160.5s0.5s (89%)0.1s (11%)
267.tempfile v3.27.00.5s0.2s (43%)0.3s (57%)default, getrandom
268.dotenvy v0.15.70.5s0.2s (32%)0.4s (68%)
269.portable-atomic v1.13.10.5s0.4s (81%)0.1s (19%)default, fallback
270.serde v1.0.2280.5s0.5s (87%)0.1s (13%)alloc, default, derive, rc, serde_derive, std
271.rsa v0.9.100.5s0.4s (73%)0.1s (27%)default, pem, std, u64_digit
272.vcpkg v0.2.150.5s0.3s (52%)0.2s (48%)
273.env_filter v1.0.10.5s0.2s (35%)0.3s (65%)regex
274.tracing-core v0.1.360.5s0.2s (39%)0.3s (61%)default, once_cell, std
275.bencode2json v0.1.00.5s0.2s (37%)0.3s (63%)
276.sharded-slab v0.1.70.5s0.5s (92%)0.0s (8%)
277.parking_lot v0.12.50.5s0.2s (36%)0.3s (64%)default
278.synstructure v0.13.20.5s0.3s (58%)0.2s (42%)default, proc-macro
279.crossbeam-utils v0.8.210.5s0.4s (78%)0.1s (22%)default, std
280.socket2 v0.6.30.5s0.3s (60%)0.2s (40%)all
281.openssl-sys v0.9.1160.5s0.4s (88%)0.1s (12%)
282.icu_collections v2.2.00.5s0.3s (63%)0.2s (37%)
283.rustls-pki-types v1.14.10.5s0.2s (49%)0.2s (51%)alloc, default, std
284.torrust-tracker-http-tracker-core v3.0.0-develop0.5s0.3s (56%)0.2s (44%)
285.compression-codecs v0.4.380.5s0.1s (31%)0.3s (69%)brotli, flate2, gzip, libzstd, memchr, zlib, zstd, zstd-safe
286.generic-array v0.14.70.5s0.5s (94%)0.0s (6%)more_lengths
287.generic-array v0.14.70.5s0.4s (94%)0.0s (6%)more_lengths
288.axum-client-ip v0.7.00.5s0.3s (55%)0.2s (45%)
289.serde v1.0.2280.5s0.4s (91%)0.0s (9%)alloc, default, derive, rc, serde_derive, std
290.idna v1.1.00.5s0.2s (49%)0.2s (51%)alloc, compiled_data, std
291.unicode-bidi v0.3.180.5s0.3s (70%)0.1s (30%)default, hardcoded-data, std
292.flate2 v1.1.90.5s0.4s (79%)0.1s (21%)any_impl, default, miniz_oxide, rust_backend
293.unicode-normalization v0.1.250.5s0.4s (78%)0.1s (22%)default, std
294.rand_chacha v0.3.10.5s0.2s (37%)0.3s (63%)std
295.mime_guess v2.0.50.5s0.2s (54%)0.2s (46%)
296.mio v1.2.00.5s0.3s (59%)0.2s (41%)net, os-ext, os-poll
297.hashbrown v0.17.10.5s0.4s (89%)0.1s (11%)
298.rustls-native-certs v0.8.30.5s0.1s (28%)0.3s (72%)
299.prost v0.14.30.5s0.4s (83%)0.1s (17%)default, derive, std
300.tokio-macros v2.7.00.5s
301.socket2 v0.6.30.5s0.3s (62%)0.2s (38%)all
302.getset v0.1.60.5s
303.axum-extra v0.12.60.5s0.3s (69%)0.1s (31%)default, query, tracing
304.hashbrown v0.17.10.4s0.3s (77%)0.1s (23%)
305.walkdir v2.5.00.4s0.2s (41%)0.3s (59%)
306.tokio-stream v0.1.180.4s0.4s (89%)0.0s (11%)default, fs, net, time
307.num-complex v0.4.60.4s0.4s (84%)0.1s (16%)std
308.unicode-normalization v0.1.250.4s0.4s (91%)0.0s (9%)default, std
309.camino v1.1.120.4s0.3s (68%)0.1s (32%)serde, serde1
310.env_logger v0.11.100.4s0.2s (43%)0.2s (57%)regex
311.pem-rfc7468 v0.7.00.4s0.2s (39%)0.3s (61%)alloc
312.bittorrent-peer-id v3.0.0-develop0.4s0.2s (45%)0.2s (55%)default, quickcheck, serde, zerocopy
313.fs-err v3.3.00.4s0.3s (72%)0.1s (28%)tokio
314.tokio-stream v0.1.180.4s0.4s (86%)0.1s (14%)default, fs, time
315.memchr v2.8.00.4s0.3s (67%)0.1s (33%)alloc, default, std
316.displaydoc v0.2.50.4s
317.futures-intrusive v0.5.00.4s0.3s (83%)0.1s (17%)alloc, default, parking_lot, std
318.addr2line v0.25.10.4s0.3s (83%)0.1s (17%)
319.dashmap v6.2.10.4s0.3s (71%)0.1s (29%)
320.bytes v1.11.10.4s0.3s (64%)0.1s (36%)default, std
321.icu_normalizer v2.2.00.4s0.3s (74%)0.1s (26%)compiled_data
322.pkcs8 v0.10.20.4s0.1s (31%)0.3s (69%)alloc, pem, std
323.strsim v0.11.10.4s0.1s (29%)0.3s (71%)
324.futures-timer v3.0.40.4s0.2s (41%)0.2s (59%)
325.torrust-tracker-udp-tracker-protocol v3.0.0-develop0.4s0.3s (80%)0.1s (20%)default
326.allocator-api2 v0.2.210.4s0.4s (95%)0.0s (5%)alloc
327.icu_collections v2.2.00.4s0.3s (78%)0.1s (22%)
328.hybrid-array v0.4.120.4s0.4s (95%)0.0s (5%)
329.rand_chacha v0.9.00.4s0.1s (35%)0.3s (65%)std
330.pkcs1 v0.7.50.4s0.2s (57%)0.2s (42%)alloc, pem, pkcs8, std, zeroize
331.formatjson v0.3.10.4s0.2s (40%)0.2s (60%)
332.axum-server v0.8.00.4s0.3s (68%)0.1s (32%)arc-swap, default, rustls, rustls-pki-types, tls-rustls-no-provider, tokio-rustls
333.ring v0.17.14 build-script0.4salloc, default, dev_urandom_fallback
334.parse-display v0.9.10.4s0.1s (32%)0.3s (68%)default, regex, regex-syntax, std
335.crossbeam-utils v0.8.210.4s0.3s (87%)0.1s (13%)std
336.openssl-sys v0.9.116 build-script0.4s
337.anyhow v1.0.1020.4s0.2s (54%)0.2s (46%)default, std
338.tinyvec v1.11.00.4s0.4s (92%)0.0s (8%)alloc, default, tinyvec_macros
339.matchit v0.8.40.4s0.2s (59%)0.2s (41%)default
340.num-integer v0.1.460.4s0.2s (64%)0.1s (36%)i128, std
341.regex v1.12.30.4s0.3s (77%)0.1s (23%)default, perf, perf-backtrack, perf-cache, perf-dfa, perf-inline, perf-literal, perf-onepass, std, unicode, unicode-age, unicode-bool, unicode-case, unicode-gencat, unicode-perl, unicode-script, unicode-segment
342.async-stream-impl v0.3.60.4s
343.rustls-webpki v0.103.130.4s0.3s (67%)0.1s (33%)alloc, aws-lc-rs, ring, std
344.icu_provider v2.2.00.4s0.2s (58%)0.2s (42%)baked
345.futures-intrusive v0.5.00.4s0.3s (89%)0.0s (11%)alloc, default, parking_lot, std
346.mio v1.2.00.4s0.3s (71%)0.1s (29%)net, os-ext, os-poll
347.winnow v1.0.30.4s0.3s (82%)0.1s (18%)
348.serde_path_to_error v0.1.200.4s0.3s (79%)0.1s (21%)
349.sha2 v0.10.90.4s0.3s (74%)0.1s (26%)default, std
350.proc-macro-crate v3.5.00.4s0.2s (50%)0.2s (50%)
351.proc-macro2 v1.0.1060.4s0.2s (50%)0.2s (50%)default, proc-macro
352.serde_html_form v0.2.80.4s0.2s (68%)0.1s (32%)default, ryu
353.serde_bencode v0.2.40.4s0.2s (57%)0.2s (43%)
354.fragile v2.1.00.4s0.2s (46%)0.2s (54%)default, future, futures-core, stream
355.memchr v2.8.00.4s0.2s (59%)0.1s (41%)alloc, default, std
356.torrust-tracker-primitives v3.0.0-develop0.4s0.2s (69%)0.1s (31%)
357.xattr v1.6.10.4s0.1s (36%)0.2s (64%)default, unsupported
358.tdyne-peer-id-registry v0.1.10.4s0.2s (58%)0.1s (42%)
359.rand_chacha v0.3.10.4s0.2s (47%)0.2s (53%)std
360.ppv-lite86 v0.2.210.3s0.3s (91%)0.0s (9%)simd, std
361.stringprep v0.1.50.3s0.2s (49%)0.2s (51%)
362.chacha20 v0.10.00.3s0.2s (51%)0.2s (49%)rng
363.cmake v0.1.580.3s0.2s (60%)0.1s (40%)
364.mime_guess v2.0.5 build-script0.3s
365.anstream v1.0.00.3s0.2s (62%)0.1s (38%)auto, default, wincon
366.jobserver v0.1.340.3s0.2s (65%)0.1s (35%)
367.half v2.7.10.3s0.3s (85%)0.1s (15%)
368.ucd-trie v0.1.70.3s0.1s (42%)0.2s (58%)std
369.portable-atomic v1.13.1 build-script0.3sdefault, fallback
370.serde_repr v0.1.200.3s
371.uuid v1.23.10.3s0.2s (67%)0.1s (33%)default, rng, std, v4
372.ppv-lite86 v0.2.210.3s0.3s (94%)0.0s (6%)simd, std
373.forwarded-header-value v0.1.10.3s0.1s (42%)0.2s (58%)
374.toml_datetime v0.7.5+spec-1.1.00.3s0.2s (56%)0.1s (44%)alloc, serde, std
375.tdyne-peer-id-registry v0.1.1 build-script0.3s
376.yansi v1.0.10.3s0.3s (81%)0.1s (19%)alloc, default, std
377.native-tls v0.2.180.3s0.2s (50%)0.2s (50%)default
378.linux-raw-sys v0.12.10.3s0.3s (81%)0.1s (19%)auxvec, elf, errno, general, ioctl, no_std
379.crossbeam-skiplist v0.1.30.3s0.3s (94%)0.0s (6%)alloc, default, std
380.zerotrie v0.2.40.3s0.2s (69%)0.1s (31%)yoke, zerofrom
381.base64 v0.22.10.3s0.2s (58%)0.1s (42%)alloc, default, std
382.whoami v1.6.10.3s0.2s (58%)0.1s (42%)
383.nu-ansi-term v0.50.30.3s0.2s (74%)0.1s (26%)default, std
384.crossbeam-epoch v0.9.180.3s0.2s (71%)0.1s (29%)alloc, std
385.diff v0.1.130.3s0.1s (45%)0.2s (55%)
386.tinyvec v1.11.00.3s0.3s (90%)0.0s (10%)alloc, default, tinyvec_macros
387.zstd-sys v2.0.16+zstd.1.5.7 build-script0.3sstd
388.unicode-segmentation v1.13.20.3s0.3s (84%)0.0s (16%)
389.darling_macro v0.20.110.3s
390.libsqlite3-sys v0.30.1 build-script0.3sbundled, bundled_bindings, cc, pkg-config, unlock_notify, vcpkg
391.anyhow v1.0.1020.3s0.2s (70%)0.1s (30%)default, std
392.base64ct v1.8.30.3s0.3s (87%)0.0s (13%)alloc
393.base64 v0.22.10.3s0.2s (83%)0.0s (17%)alloc, std
394.tracing v0.1.440.3s0.2s (70%)0.1s (30%)attributes, default, log, std, tracing-attributes
395.pretty_assertions v1.4.10.3s0.1s (38%)0.2s (62%)default, std
396.toml_datetime v1.1.1+spec-1.1.00.3s0.2s (55%)0.1s (45%)alloc, serde, std
397.aws-lc-sys v0.41.00.3s0.2s (86%)0.0s (14%)prebuilt-nasm
398.hashlink v0.10.00.3s0.3s (93%)0.0s (7%)
399.torrust-tracker-axum-server v3.0.0-develop0.3s0.2s (62%)0.1s (38%)
400.parking_lot v0.12.50.3s0.2s (62%)0.1s (38%)default
401.rustversion v1.0.220.3s
402.etcetera v0.11.00.3s0.2s (59%)0.1s (41%)
403.glob v0.3.30.3s0.2s (64%)0.1s (36%)
404.num-integer v0.1.460.3s0.2s (75%)0.1s (25%)i128
405.yansi v1.0.10.3s0.2s (79%)0.1s (21%)alloc, default, std
406.torrust-tracker-rest-api-core v3.0.0-develop0.3s0.2s (75%)0.1s (25%)
407.hyperlocal v0.9.10.3s0.1s (54%)0.1s (46%)client, default, http-body-util, hyper-util, server, tower-service
408.mime v0.3.170.3s0.1s (50%)0.1s (50%)
409.allocator-api2 v0.2.210.3s0.2s (86%)0.0s (14%)alloc
410.async-compression v0.4.420.3s0.2s (78%)0.1s (22%)brotli, gzip, tokio, zlib, zstd
411.predicates-tree v1.0.130.3s0.1s (37%)0.2s (63%)
412.icu_provider v2.2.00.3s0.2s (85%)0.0s (15%)baked
413.sha1 v0.11.00.3s0.1s (52%)0.1s (48%)alloc, default, oid
414.quickcheck_macros v1.2.00.3s
415.proc-macro-error-attr2 v2.0.00.3s
416.event-listener v5.4.10.3s0.2s (74%)0.1s (26%)default, parking, std
417.torrust-tracker-rest-api-client v3.0.0-develop0.3s0.2s (62%)0.1s (38%)
418.darling_macro v0.23.00.3s
419.httparse v1.10.1 build-script0.3sdefault, std
420.thiserror v1.0.69 build-script0.3s
421.arc-swap v1.9.10.3s0.2s (81%)0.1s (19%)
422.strsim v0.11.10.3s0.2s (65%)0.1s (35%)
423.bitflags v2.11.10.2s0.2s (64%)0.1s (36%)serde, serde_core, std
424.plotters-backend v0.3.70.2s0.2s (80%)0.0s (20%)
425.iana-time-zone v0.1.650.2s0.1s (44%)0.1s (56%)fallback
426.signal-hook-registry v1.4.80.2s0.1s (60%)0.1s (40%)
427.ringbuf v0.5.00.2s0.2s (92%)0.0s (8%)alloc, default, std
428.futures-executor v0.3.320.2s0.1s (52%)0.1s (48%)default, std
429.semver v1.0.280.2s0.2s (64%)0.1s (36%)default, std
430.toml_datetime v0.6.110.2s0.1s (56%)0.1s (44%)serde
431.parking_lot_core v0.9.120.2s0.2s (68%)0.1s (32%)
432.pkg-config v0.3.330.2s0.2s (79%)0.0s (21%)
433.zmij v1.0.210.2s0.2s (79%)0.0s (21%)
434.dotenvy v0.15.70.2s0.1s (62%)0.1s (38%)
435.zerotrie v0.2.40.2s0.2s (83%)0.0s (17%)yoke, zerofrom
436.flume v0.11.10.2s0.2s (88%)0.0s (12%)async, futures-core, futures-sink
437.torrust-server-lib v3.0.0-develop0.2s0.1s (58%)0.1s (42%)
438.proc-macro-error2 v2.0.10.2s0.2s (71%)0.1s (29%)default, syn-error
439.hashlink v0.10.00.2s0.2s (96%)0.0s (4%)
440.crossbeam-utils v0.8.21 build-script0.2sstd
441.unicode-linebreak v0.1.50.2s0.2s (70%)0.1s (30%)
442.relative-path v1.9.30.2s0.2s (74%)0.1s (26%)default
443.tracing-log v0.2.00.2s0.1s (52%)0.1s (48%)log-tracer, std
444.derive_builder_macro v0.20.20.2slib_has_std
445.plotters-svg v0.3.70.2s0.1s (57%)0.1s (43%)
446.unicode-width v0.2.20.2s0.2s (83%)0.0s (17%)cjk, default
447.rustversion v1.0.22 build-script0.2s
448.http-body-util v0.1.30.2s0.2s (83%)0.0s (17%)default
449.proc-macro2-diagnostics v0.10.10.2s0.1s (61%)0.1s (39%)colors, default, yansi
450.zerocopy v0.8.48 build-script0.2sderive, simd, zerocopy-derive
451.inlinable_string v0.1.150.2s0.2s (74%)0.1s (26%)
452.pest_derive v2.8.60.2sdefault, std
453.simd-adler32 v0.3.90.2s0.1s (22%)0.2s (78%)
454.byteorder v1.5.00.2s0.2s (91%)0.0s (9%)std
455.cipher v0.5.20.2s0.2s (91%)0.0s (9%)
456.fs_extra v1.3.00.2s0.1s (64%)0.1s (36%)
457.toml_write v0.1.20.2s0.2s (86%)0.0s (14%)alloc, default, std
458.thread_local v1.1.90.2s0.2s (73%)0.1s (27%)
459.pem-rfc7468 v0.7.00.2s0.1s (55%)0.1s (45%)alloc
460.serde_core v1.0.228 build-script0.2salloc, rc, result, std
461.native-tls v0.2.180.2s0.1s (64%)0.1s (36%)default
462.event-listener v5.4.10.2s0.2s (77%)0.0s (23%)default, parking, std
463.concurrent-queue v2.5.00.2s0.2s (91%)0.0s (9%)std
464.flume v0.11.10.2s0.2s (82%)0.0s (18%)async, futures-core, futures-sink
465.either v1.16.00.2s0.2s (95%)0.0s (5%)default, serde, std, use_std
466.smallvec v1.15.10.2s0.2s (86%)0.0s (14%)const_generics, serde
467.getrandom v0.3.40.2s0.1s (64%)0.1s (36%)std
468.ringbuffer v0.15.00.2s0.2s (77%)0.0s (23%)alloc, default
469.digest v0.10.70.2s0.2s (82%)0.0s (18%)alloc, block-buffer, const-oid, core-api, default, mac, oid, std, subtle
470.sha1 v0.10.60.2s0.1s (52%)0.1s (48%)
471.zmij v1.0.210.2s0.1s (52%)0.1s (48%)
472.whoami v1.6.10.2s0.1s (71%)0.1s (29%)
473.crc32fast v1.5.0 build-script0.2sdefault, std
474.smallvec v1.15.10.2s0.2s (95%)0.0s (5%)const_generics, const_new, serde
475.unicode-width v0.1.140.2s0.2s (86%)0.0s (14%)cjk, default
476.anes v0.1.60.2s0.2s (80%)0.0s (20%)default
477.libsqlite3-sys v0.30.10.2s0.2s (90%)0.0s (10%)bundled, bundled_bindings, cc, pkg-config, unlock_notify, vcpkg
478.serde_bytes v0.11.190.2s0.2s (85%)0.0s (15%)default, std
479.quote v1.0.450.2s0.1s (70%)0.1s (30%)default, proc-macro
480.spki v0.7.30.2s0.1s (75%)0.1s (25%)alloc, pem, std
481.crossbeam-deque v0.8.60.2s0.2s (90%)0.0s (10%)default, std
482.futures-channel v0.3.320.2s0.2s (85%)0.0s (15%)alloc, futures-sink, sink, std
483.either v1.16.00.2s0.2s (80%)0.0s (20%)default, serde, std, use_std
484.rustc_version v0.4.10.2s0.1s (60%)0.1s (40%)
485.ucd-trie v0.1.70.2s0.1s (60%)0.1s (40%)std
486.once_cell v1.21.40.2s0.1s (70%)0.1s (30%)alloc, default, race, std
487.serde_urlencoded v0.7.10.2s0.2s (89%)0.0s (11%)
488.tracing v0.1.440.2s0.2s (84%)0.0s (16%)attributes, default, log, std, tracing-attributes
489.ciborium-ll v0.2.20.2s0.1s (74%)0.0s (26%)
490.sha1 v0.10.60.2s0.1s (74%)0.0s (26%)
491.bittorrent-primitives v0.2.00.2s0.1s (58%)0.1s (42%)
492.serde_urlencoded v0.7.10.2s0.2s (84%)0.0s (16%)
493.rand_core v0.6.40.2s0.1s (79%)0.0s (21%)alloc, getrandom, std
494.rstest_macros v0.26.1 build-script0.2sasync-timeout, crate-name
495.base64ct v1.8.30.2s0.2s (84%)0.0s (16%)alloc
496.unicode-properties v0.1.40.2s0.2s (84%)0.0s (16%)default, emoji, general-category
497.hex v0.4.30.2s0.2s (84%)0.0s (16%)alloc, default, std
498.openssl-macros v0.1.10.2s
499.spin v0.9.80.2s0.1s (74%)0.0s (26%)barrier, default, lazy, lock_api, lock_api_crate, mutex, once, rwlock, spin_mutex
500.torrust-net-primitives v3.0.0-develop0.2s0.1s (74%)0.0s (26%)
501.rstest_macros v0.25.0 build-script0.2sasync-timeout, crate-name
502.unicase v2.9.00.2s0.1s (79%)0.0s (21%)
503.uncased v0.9.10 build-script0.2salloc, default
504.httparse v1.10.10.2s0.1s (53%)0.1s (47%)default, std
505.clap_lex v1.1.00.2s0.1s (47%)0.1s (53%)
506.sqlx v0.8.60.2s0.1s (42%)0.1s (58%)_rt-tokio, _sqlite, any, default, derive, json, macros, migrate, mysql, postgres, runtime-tokio, runtime-tokio-native-tls, sqlite, sqlx-macros, sqlx-mysql, sqlx-postgres, sqlx-sqlite, tls-native-tls
507.rustls-platform-verifier v0.7.00.2s0.1s (33%)0.1s (67%)
508.rand_core v0.9.50.2s0.1s (83%)0.0s (17%)os_rng, std
509.spin v0.9.80.2s0.1s (72%)0.0s (28%)barrier, default, lazy, lock_api, lock_api_crate, mutex, once, rwlock, spin_mutex
510.httpdate v1.0.30.2s0.1s (50%)0.1s (50%)
511.getrandom v0.4.20.2s0.1s (61%)0.1s (39%)std, sys_rng
512.futures-executor v0.3.320.2s0.1s (67%)0.1s (33%)default, std
513.camino v1.1.12 build-script0.2sserde, serde1
514.toml_writer v1.1.1+spec-1.1.00.2s0.1s (83%)0.0s (17%)alloc, std
515.parking_lot_core v0.9.120.2s0.1s (78%)0.0s (22%)
516.lock_api v0.4.140.2s0.1s (83%)0.0s (17%)atomic_usize, default
517.rustix v1.1.4 build-script0.2salloc, default, fs, std, termios
518.pkcs8 v0.10.20.2s0.1s (61%)0.1s (39%)alloc, pem, std
519.parking_lot_core v0.9.12 build-script0.2s
520.aws-lc-rs v1.17.0 build-script0.2saws-lc-sys, prebuilt-nasm
521.fastrand v2.4.10.2s0.1s (72%)0.0s (28%)alloc, default, std
522.digest v0.10.70.2s0.2s (89%)0.0s (11%)alloc, block-buffer, const-oid, core-api, default, mac, oid, std, subtle
523.byteorder v1.5.00.2s0.1s (78%)0.0s (22%)default, std
524.ctutils v0.4.20.2s0.2s (94%)0.0s (6%)
525.torrust-clock v3.0.0-develop0.2s0.1s (65%)0.1s (35%)
526.libsqlite3-sys v0.30.10.2s0.1s (76%)0.0s (24%)bundled, bundled_bindings, cc, pkg-config, unlock_notify, vcpkg
527.filetime v0.2.290.2s0.1s (76%)0.0s (24%)
528.ryu v1.0.230.2s0.0s (6%)0.2s (94%)
529.bloom v0.3.20.2s0.1s (65%)0.1s (35%)
530.concurrent-queue v2.5.00.2s0.1s (88%)0.0s (12%)std
531.getrandom v0.2.170.2s0.1s (88%)0.0s (12%)std
532.crc v3.4.00.2s0.1s (76%)0.0s (24%)
533.getrandom v0.3.4 build-script0.2sstd
534.object v0.37.3 build-script0.2sarchive, coff, elf, macho, pe, read_core, unaligned, xcoff
535.heck v0.5.00.2s0.1s (53%)0.1s (47%)
536.spki v0.7.30.2s0.1s (76%)0.0s (24%)alloc, pem, std
537.owo-colors v4.3.0 build-script0.2s
538.hex v0.4.30.2s0.2s (94%)0.0s (6%)alloc, default, std
539.hyper-timeout v0.5.20.2s0.2s (94%)0.0s (6%)
540.yoke v0.8.20.2s0.1s (82%)0.0s (18%)derive, zerofrom
541.num-traits v0.2.19 build-script0.2si128, libm, std
542.convert_case v0.10.00.2s0.1s (50%)0.1s (50%)
543.anstyle v1.0.140.2s0.1s (75%)0.0s (25%)default, std
544.phf_shared v0.11.30.2s0.1s (62%)0.1s (38%)std
545.futures-channel v0.3.320.2s0.1s (75%)0.0s (25%)alloc, default, futures-sink, sink, std
546.cmov v0.5.30.2s0.1s (94%)0.0s (6%)
547.toml_datetime v1.1.1+spec-1.1.00.2s0.1s (69%)0.1s (31%)alloc, default, std
548.alloca v0.4.0 build-script0.2s
549.rand_core v0.6.40.2s0.1s (81%)0.0s (19%)alloc, getrandom, std
550.bit-vec v0.4.40.2s0.1s (81%)0.0s (19%)
551.form_urlencoded v1.2.20.2s0.1s (69%)0.1s (31%)alloc, default, std
552.supports-color v3.0.20.2s0.1s (56%)0.1s (44%)
553.mutants v0.0.30.2s
554.zstd-safe v7.2.4 build-script0.2sstd
555.cast v0.3.00.2s0.1s (88%)0.0s (12%)
556.openssl v0.10.80 build-script0.2sdefault
557.backtrace-ext v0.2.10.2s0.1s (50%)0.1s (50%)
558.native-tls v0.2.18 build-script0.2sdefault
559.subtle v2.6.10.2s0.1s (75%)0.0s (25%)
560.tinystr v0.8.30.2s0.1s (81%)0.0s (19%)zerovec
561.unicode-properties v0.1.40.2s0.1s (75%)0.0s (25%)default, emoji, general-category
562.structmeta v0.3.00.2s0.1s (88%)0.0s (12%)
563.want v0.3.10.2s0.1s (62%)0.1s (38%)
564.const-oid v0.9.60.1s0.1s (67%)0.0s (33%)
565.bitflags v2.11.10.1s0.1s (80%)0.0s (20%)serde, serde_core
566.digest v0.11.30.1s0.1s (80%)0.0s (20%)alloc, block-api, default, mac, oid
567.slab v0.4.120.1s0.1s (73%)0.0s (27%)default, std
568.ryu v1.0.230.1s0.1s (67%)0.0s (33%)
569.openssl-probe v0.2.10.1s0.1s (53%)0.1s (47%)
570.anyhow v1.0.102 build-script0.1sdefault, std
571.version_check v0.9.50.1s0.1s (73%)0.0s (27%)
572.crc v3.4.00.1s0.1s (93%)0.0s (7%)
573.litemap v0.8.20.1s0.1s (80%)0.0s (20%)
574.tonic-prost v0.14.60.1s0.1s (67%)0.0s (33%)
575.autocfg v1.5.10.1s0.0s (27%)0.1s (73%)
576.futures-core v0.3.320.1s0.1s (67%)0.0s (33%)alloc, default, std
577.serde_json v1.0.150 build-script0.1sdefault, raw_value, std
578.foldhash v0.1.50.1s0.1s (73%)0.0s (27%)
579.const-oid v0.10.20.1s0.1s (73%)0.0s (27%)
580.form_urlencoded v1.2.20.1s0.1s (60%)0.1s (40%)alloc, default, std
581.predicates-core v1.0.100.1s0.1s (60%)0.1s (40%)
582.thiserror v2.0.18 build-script0.1sdefault, std
583.crossbeam-utils v0.8.21 build-script0.1sdefault, std
584.anstyle-parse v1.0.00.1s0.1s (93%)0.0s (7%)default, utf8
585.supports-hyperlinks v3.2.00.1s0.1s (57%)0.1s (43%)
586.icu_properties_data v2.2.00.1s0.1s (71%)0.0s (29%)
587.tower-layer v0.3.30.1s0.1s (93%)0.0s (7%)
588.lock_api v0.4.140.1s0.1s (71%)0.0s (29%)atomic_usize, default
589.mockall v0.14.00.1s0.1s (71%)0.0s (29%)
590.powerfmt v0.2.00.1s0.1s (64%)0.1s (36%)
591.tower-service v0.3.30.1s0.1s (79%)0.0s (21%)
592.num-traits v0.2.19 build-script (run)0.1sdefault, i128, libm, std
593.multimap v0.10.10.1s0.1s (93%)0.0s (7%)default, serde, serde_impl
594.rand_core v0.10.10.1s0.1s (71%)0.0s (29%)
595.unicase v2.9.00.1s0.1s (86%)0.0s (14%)
596.log v0.4.300.1s0.1s (71%)0.0s (29%)
597.siphasher v1.0.30.1s0.1s (86%)0.0s (14%)default, std
598.crc32fast v1.5.00.1s0.1s (86%)0.0s (14%)default, std
599.yoke v0.8.20.1s0.1s (86%)0.0s (14%)derive, zerofrom
600.hyper-rustls v0.27.90.1s0.1s (64%)0.1s (36%)aws-lc-rs, http1, http2, tls12
601.icu_properties_data v2.2.00.1s0.1s (64%)0.1s (36%)
602.tinystr v0.8.30.1s0.1s (79%)0.0s (21%)zerovec
603.foldhash v0.1.50.1s0.1s (86%)0.0s (14%)
604.phf_shared v0.11.30.1s0.1s (50%)0.1s (50%)default, std
605.percent-encoding v2.3.20.1s0.0s (29%)0.1s (71%)alloc, default, std
606.openssl-probe v0.2.10.1s0.1s (54%)0.1s (46%)
607.zstd v0.13.30.1s0.1s (77%)0.0s (23%)
608.mockall_derive v0.14.0 build-script0.1s
609.slab v0.4.120.1s0.1s (92%)0.0s (8%)std
610.crossbeam-queue v0.3.120.1s0.1s (85%)0.0s (15%)alloc, default, std
611.siphasher v1.0.30.1s0.1s (62%)0.1s (38%)default, std
612.futures-task v0.3.320.1s0.1s (85%)0.0s (15%)alloc, std
613.zerocopy v0.8.48 build-script0.1ssimd
614.uncased v0.9.100.1s0.1s (62%)0.1s (38%)alloc, default
615.getrandom v0.2.170.1s0.1s (85%)0.0s (15%)std
616.torrust-tracker-events v3.0.0-develop0.1s0.1s (85%)0.0s (15%)
617.mockall v0.14.0 build-script0.1s
618.percent-encoding v2.3.20.1s0.1s (77%)0.0s (23%)alloc, default, std
619.signature v2.2.00.1s0.1s (69%)0.0s (31%)alloc, digest, rand_core, std
620.parking v2.2.10.1s0.1s (69%)0.0s (31%)
621.writeable v0.6.30.1s0.1s (92%)0.0s (8%)
622.bollard-buildkit-proto v0.7.0 build-script0.1sdefault, fetch, ureq
623.utf8-zero v0.8.10.1s0.1s (83%)0.0s (17%)default, std
624.rustix v1.1.4 build-script (run)0.1salloc, default, fs, std, termios
625.itoa v1.0.180.1s0.1s (75%)0.0s (25%)
626.phf_generator v0.11.30.1s0.1s (58%)0.0s (42%)
627.writeable v0.6.30.1s0.1s (75%)0.0s (25%)
628.futures-io v0.3.320.1s0.1s (50%)0.1s (50%)default, std
629.atoi v2.0.00.1s0.1s (83%)0.0s (17%)default, std
630.same-file v1.0.60.1s0.1s (75%)0.0s (25%)
631.tokio-rustls v0.26.40.1s0.1s (92%)0.0s (8%)aws-lc-rs, aws_lc_rs, tls12
632.icu_properties_data v2.2.0 build-script (run)0.1s
633.alloc-stdlib v0.2.20.1s0.1s (75%)0.0s (25%)
634.try-lock v0.2.50.1s0.1s (58%)0.0s (42%)
635.proc-macro2-diagnostics v0.10.1 build-script0.1scolors, default, yansi
636.fnv v1.0.70.1s0.1s (67%)0.0s (33%)default, std
637.figment v0.10.19 build-script0.1senv, parking_lot, parse-value, pear, tempfile, test, toml
638.rstest v0.26.10.1s0.1s (83%)0.0s (17%)async-timeout, crate-name, default
639.atoi v2.0.00.1s0.1s (83%)0.0s (17%)default, std
640.nonempty v0.7.00.1s0.1s (83%)0.0s (17%)
641.potential_utf v0.1.50.1s0.1s (67%)0.0s (33%)zerovec
642.num-conv v0.2.20.1s0.1s (83%)0.0s (17%)
643.fs-err v3.3.0 build-script0.1stokio
644.phf v0.11.30.1s0.1s (83%)0.0s (17%)default, std
645.litemap v0.8.20.1s0.1s (100%)0.0s (0%)
646.zeroize v1.8.20.1s0.1s (67%)0.0s (33%)alloc, default
647.http-body v1.0.10.1s0.1s (75%)0.0s (25%)
648.getrandom v0.4.2 build-script0.1sstd, sys_rng
649.hmac v0.12.10.1s0.1s (83%)0.0s (17%)reset
650.hkdf v0.12.40.1s0.1s (75%)0.0s (25%)
651.crossbeam-queue v0.3.120.1s0.1s (92%)0.0s (8%)alloc, default, std
652.utf8parse v0.2.20.1s0.1s (50%)0.1s (50%)default
653.md-5 v0.10.60.1s0.1s (100%)0.0s (0%)
654.time-core v0.1.80.1s0.1s (91%)0.0s (9%)
655.async-stream v0.3.60.1s0.1s (91%)0.0s (9%)
656.zerofrom v0.1.80.1s0.1s (82%)0.0s (18%)derive
657.parking v2.2.10.1s0.1s (73%)0.0s (27%)
658.tracing-serde v0.2.00.1s0.1s (82%)0.0s (18%)
659.is_ci v1.2.00.1s0.1s (45%)0.1s (55%)
660.getrandom v0.4.2 build-script (run)0.1sstd, sys_rng
661.hmac v0.13.00.1s0.1s (91%)0.0s (9%)
662.pin-project-lite v0.2.170.1s0.1s (55%)0.1s (45%)
663.torrust-located-error v3.0.0-develop0.1s0.1s (64%)0.0s (36%)
664.zeroize v1.8.20.1s0.0s (36%)0.1s (64%)alloc, default
665.terminal_size v0.4.40.1s0.1s (82%)0.0s (18%)
666.downcast v0.11.00.1s0.1s (82%)0.0s (18%)default, std
667.const-oid v0.9.60.1s0.1s (73%)0.0s (27%)
668.termtree v0.5.10.1s0.1s (91%)0.0s (9%)
669.supports-unicode v3.0.00.1s0.1s (73%)0.0s (27%)
670.crypto-common v0.1.70.1s0.1s (73%)0.0s (27%)std
671.scopeguard v1.2.00.1s0.1s (73%)0.0s (27%)
672.block-buffer v0.10.40.1s0.1s (91%)0.0s (9%)
673.rustc-hash v2.1.20.1s0.1s (64%)0.0s (36%)default, std
674.colorchoice v1.0.50.1s0.1s (55%)0.1s (45%)
675.hkdf v0.12.40.1s0.1s (70%)0.0s (30%)
676.hmac v0.12.10.1s0.1s (90%)0.0s (10%)reset
677.untrusted v0.9.00.1s0.1s (70%)0.0s (30%)
678.num-traits v0.2.19 build-script (run)0.1si128, libm, std
679.libm v0.2.16 build-script0.1sarch, default
680.zerofrom v0.1.80.1s0.1s (90%)0.0s (10%)derive
681.tdyne-peer-id v1.0.20.1s0.1s (60%)0.0s (40%)
682.derive_builder v0.20.20.1s0.1s (70%)0.0s (30%)default, std
683.rayon-core v1.13.0 build-script0.1s
684.home v0.5.120.1s0.1s (70%)0.0s (30%)
685.zerocopy v0.8.48 build-script (run)0.1sderive, simd, zerocopy-derive
686.icu_properties_data v2.2.0 build-script0.1s
687.block-buffer v0.12.00.1s0.1s (80%)0.0s (20%)
688.atomic-waker v1.1.20.1s0.1s (60%)0.0s (40%)
689.signature v2.2.00.1s0.1s (90%)0.0s (10%)alloc, digest, rand_core, std
690.icu_normalizer_data v2.2.0 build-script0.1s
691.num-iter v0.1.450.1s0.1s (90%)0.0s (10%)
692.errno v0.3.140.1s0.1s (60%)0.0s (40%)default, std
693.generic-array v0.14.7 build-script0.1smore_lengths
694.serde_spanned v1.1.10.1s0.1s (80%)0.0s (20%)alloc, serde, std
695.futures-task v0.3.320.1s0.1s (60%)0.0s (40%)alloc, std
696.blowfish v0.10.00.1s0.1s (70%)0.0s (30%)
697.rustversion v1.0.22 build-script (run)0.1s
698.md-5 v0.10.60.1s0.1s (70%)0.0s (30%)
699.num-bigint-dig v0.8.6 build-script0.1si128, prime, rand, u64_digit, zeroize
700.anyhow v1.0.102 build-script (run)0.1sdefault, std
701.compression-core v0.4.320.1s0.1s (70%)0.0s (30%)
702.unicode-xid v0.2.60.1s0.1s (78%)0.0s (22%)default
703.approx v0.5.10.1s0.1s (78%)0.0s (22%)default, std
704.num-iter v0.1.450.1s0.1s (89%)0.0s (11%)i128, std
705.phf_codegen v0.11.30.1s0.1s (89%)0.0s (11%)
706.parking_lot_core v0.9.12 build-script (run)0.1s
707.rstest v0.25.00.1s0.1s (89%)0.0s (11%)async-timeout, crate-name, default
708.adler2 v2.0.10.1s0.0s (33%)0.1s (67%)
709.inout v0.2.20.1s0.1s (89%)0.0s (11%)
710.idna_adapter v1.2.20.1s0.1s (78%)0.0s (22%)compiled_data
711.utf8_iter v1.0.40.1s0.1s (78%)0.0s (22%)
712.dunce v1.0.50.1s0.0s (33%)0.1s (67%)
713.crypto-common v0.1.70.1s0.1s (89%)0.0s (11%)std
714.alloc-no-stdlib v2.0.40.1s0.1s (100%)0.0s (0%)
715.proc-macro2-diagnostics v0.10.1 build-script (run)0.1scolors, default, yansi
716.oorandom v11.1.50.1s0.1s (75%)0.0s (25%)
717.pbkdf2 v0.13.00.1s0.1s (88%)0.0s (12%)default, hmac
718.utf8_iter v1.0.40.1s0.1s (100%)0.0s (0%)
719.castaway v0.2.40.1s0.1s (88%)0.0s (12%)alloc
720.block-buffer v0.10.40.1s0.1s (88%)0.0s (12%)
721.page_size v0.6.00.1s0.1s (75%)0.0s (25%)
722.thiserror v1.0.690.1s0.1s (62%)0.0s (38%)
723.zstd-safe v7.2.40.1s0.1s (88%)0.0s (12%)std
724.thiserror v1.0.69 build-script (run)0.1s
725.futures-io v0.3.320.1s0.1s (88%)0.0s (12%)default, std
726.serde_spanned v0.6.90.1s0.1s (75%)0.0s (25%)serde
727.generic-array v0.14.7 build-script (run)0.1smore_lengths
728.potential_utf v0.1.50.1s0.1s (75%)0.0s (25%)zerovec
729.crc32fast v1.5.0 build-script (run)0.1sdefault, std
730.derive_more v2.1.10.1s0.1s (100%)0.0s (0%)as_ref, constructor, default, display, from, std
731.cpufeatures v0.2.170.1s0.1s (71%)0.0s (29%)
732.lazy_static v1.5.00.1s0.1s (71%)0.0s (29%)spin, spin_no_std
733.generic-array v0.14.7 build-script (run)0.1smore_lengths
734.idna_adapter v1.2.20.1s0.1s (86%)0.0s (14%)compiled_data
735.anyhow v1.0.102 build-script (run)0.1sdefault, std
736.is_terminal_polyfill v1.70.20.1s0.1s (86%)0.0s (14%)default
737.darling v0.20.110.1s0.1s (86%)0.0s (14%)default, suggestions
738.binascii v0.1.40.1s0.0s (14%)0.1s (86%)decode, default, encode
739.thiserror v2.0.18 build-script (run)0.1sdefault, std
740.icu_normalizer_data v2.2.0 build-script (run)0.1s
741.darling v0.23.00.1s0.1s (86%)0.0s (14%)default, suggestions
742.static_assertions v1.1.00.1s0.1s (100%)0.0s (0%)
743.icu_normalizer_data v2.2.00.1s0.1s (100%)0.0s (0%)
744.crc-catalog v2.5.00.1s0.1s (71%)0.0s (29%)
745.futures-sink v0.3.320.1s0.0s (57%)0.0s (43%)
746.alloca v0.4.0 build-script (run)0.1s
747.home v0.5.120.1s0.1s (71%)0.0s (29%)
748.ciborium-io v0.2.20.1s0.1s (71%)0.0s (29%)alloc, std
749.openssl-sys v0.9.116 build-script (run)0.1s
750.libm v0.2.16 build-script (run)0.1sarch, default
751.icu_normalizer_data v2.2.0 build-script (run)0.1s
752.foreign-types v0.3.20.1s0.1s (86%)0.0s (14%)
753.thiserror v2.0.180.1s0.0s (67%)0.0s (33%)default, std
754.libc v0.2.186 build-script0.1sdefault, std
755.anstyle-query v1.1.50.1s0.1s (100%)0.0s (0%)
756.subtle v2.6.10.1s0.0s (67%)0.0s (33%)
757.stable_deref_trait v1.2.10.1s0.1s (100%)0.0s (0%)
758.tinyvec_macros v0.1.10.1s0.1s (83%)0.0s (17%)
759.rstest_macros v0.25.0 build-script (run)0.1sasync-timeout, crate-name
760.crc-catalog v2.5.00.1s0.1s (100%)0.0s (0%)
761.thiserror v2.0.180.1s0.1s (83%)0.0s (17%)default, std
762.portable-atomic v1.13.1 build-script (run)0.1sdefault, fallback
763.foreign-types v0.3.20.1s0.1s (83%)0.0s (17%)
764.ident_case v1.0.10.1s0.1s (83%)0.0s (17%)
765.quote v1.0.45 build-script (run)0.1sdefault, proc-macro
766.stable_deref_trait v1.2.10.1s0.0s (50%)0.0s (50%)
767.fs-err v3.3.0 build-script (run)0.1stokio
768.futures v0.3.320.1s0.0s (67%)0.0s (33%)alloc, async-await, default, executor, futures-executor, std
769.rustls v0.23.40 build-script0.1saws-lc-rs, aws_lc_rs, log, logging, ring, std, tls12
770.rstest_macros v0.26.1 build-script (run)0.1sasync-timeout, crate-name
771.fnv v1.0.70.1s0.1s (83%)0.0s (17%)default, std
772.phf v0.11.30.1s0.1s (83%)0.0s (17%)
773.alloca v0.4.00.1s0.1s (83%)0.0s (17%)
774.proc-macro2 v1.0.106 build-script0.1sdefault, proc-macro
775.libm v0.2.16 build-script (run)0.1sarch, default
776.openssl v0.10.80 build-script (run)0.1sdefault
777.foreign-types-shared v0.1.10.1s0.0s (80%)0.0s (20%)
778.serde v1.0.228 build-script0.1salloc, default, derive, rc, serde_derive, std
779.openssl-sys v0.9.116 build-script (run)0.1s
780.is-terminal v0.4.170.1s0.1s (100%)0.0s (0%)
781.itoa v1.0.180.1s0.0s (0%)0.1s (100%)
782.uncased v0.9.10 build-script (run)0.1salloc, default
783.auto_ops v0.3.00.1s0.0s (80%)0.0s (20%)
784.tinyvec_macros v0.1.10.1s0.1s (100%)0.0s (0%)
785.find-msvc-tools v0.1.90.1s0.0s (0%)0.1s (100%)
786.pin-project v1.1.130.1s0.0s (80%)0.0s (20%)
787.cpufeatures v0.3.00.1s0.0s (60%)0.0s (40%)
788.once_cell v1.21.40.1s0.0s (0%)0.1s (100%)alloc, default, race, std
789.serde_core v1.0.228 build-script0.1salloc, default, rc, result, std
790.zstd-sys v2.0.16+zstd.1.5.70.1s0.0s (60%)0.0s (40%)std
791.zmij v1.0.21 build-script0.1s
792.sync_wrapper v1.0.20.1s0.1s (100%)0.0s (0%)futures, futures-core
793.mockall v0.14.0 build-script (run)0.1s
794.log v0.4.300.1s0.0s (0%)0.1s (100%)std
795.httparse v1.10.1 build-script (run)0.1sdefault, std
796.mockall_derive v0.14.0 build-script (run)0.0s
797.derive_more v1.0.00.0s0.0s (100%)0.0s (0%)default, display, std
798.getrandom v0.3.4 build-script (run)0.0sstd
799.icu_normalizer_data v2.2.00.0s0.0s (75%)0.0s (25%)
800.serde_core v1.0.228 build-script (run)0.0salloc, default, rc, result, std
801.zerocopy v0.8.48 build-script (run)0.0ssimd
802.thiserror v2.0.18 build-script (run)0.0sdefault, std
803.futures-core v0.3.320.0s0.0s (75%)0.0s (25%)alloc, default, std
804.zmij v1.0.21 build-script (run)0.0s
805.clap v4.6.10.0s0.0s (75%)0.0s (25%)color, default, derive, env, error-context, help, std, suggestions, usage
806.camino v1.1.12 build-script (run)0.0sserde, serde1
807.native-tls v0.2.18 build-script (run)0.0sdefault
808.foreign-types-shared v0.1.10.0s0.0s (75%)0.0s (25%)
809.cpufeatures v0.2.170.0s0.0s (100%)0.0s (0%)
810.libc v0.2.186 build-script (run)0.0sdefault, std
811.serde_json v1.0.150 build-script0.0salloc, default, indexmap, preserve_order, raw_value, std
812.libc v0.2.186 build-script (run)0.0sdefault, std
813.num-traits v0.2.19 build-script0.0sdefault, i128, libm, std
814.futures-sink v0.3.320.0s0.0s (75%)0.0s (25%)alloc, default, std
815.crossbeam-utils v0.8.21 build-script (run)0.0sdefault, std
816.num-bigint-dig v0.8.6 build-script (run)0.0si128, prime, rand, u64_digit, zeroize
817.serde_json v1.0.150 build-script (run)0.0salloc, default, indexmap, preserve_order, raw_value, std
818.mime_guess v2.0.5 build-script (run)0.0s
819.equivalent v1.0.20.0s0.0s (67%)0.0s (33%)
820.parking_lot_core v0.9.12 build-script (run)0.0s
821.icu_properties_data v2.2.0 build-script (run)0.0s
822.owo-colors v4.3.0 build-script (run)0.0s
823.figment v0.10.19 build-script (run)0.0senv, parking_lot, parse-value, pear, tempfile, test, toml
824.openssl v0.10.80 build-script (run)0.0sdefault
825.bollard-buildkit-proto v0.7.0 build-script (run)0.0sdefault, fetch, ureq
826.serde_json v1.0.150 build-script (run)0.0sdefault, raw_value, std
827.object v0.37.3 build-script (run)0.0sarchive, coff, elf, macho, pe, read_core, unaligned, xcoff
828.num v0.4.30.0s0.0s (100%)0.0s (0%)default, num-bigint, std
829.rayon-core v1.13.0 build-script (run)0.0s
830.zmij v1.0.21 build-script (run)0.0s
831.tdyne-peer-id-registry v0.1.1 build-script (run)0.0s
832.native-tls v0.2.18 build-script (run)0.0sdefault
833.quote v1.0.45 build-script0.0sdefault, proc-macro
834.num-bigint-dig v0.8.6 build-script (run)0.0si128, prime, rand, u64_digit, zeroize
835.serde v1.0.228 build-script (run)0.0salloc, default, derive, rc, serde_derive, std
836.unicode-ident v1.0.240.0s0.0s (100%)0.0s (0%)
837.crossbeam-utils v0.8.21 build-script (run)0.0sstd
838.proc-macro2 v1.0.106 build-script (run)0.0sdefault, proc-macro
839.serde v1.0.228 build-script (run)0.0salloc, default, derive, rc, serde_derive, std
840.rustls v0.23.40 build-script (run)0.0saws-lc-rs, aws_lc_rs, log, logging, ring, std, tls12
841.zstd-safe v7.2.4 build-script (run)0.0sstd
842.lazy_static v1.5.00.0s0.0s (100%)0.0s (0%)spin, spin_no_std
843.serde_core v1.0.228 build-script (run)0.0salloc, rc, result, std
844.aws-lc-rs v1.17.0 build-script (run)0.0saws-lc-sys, prebuilt-nasm
845.cfg-if v1.0.40.0s0.0s (NaN%)0.0s (NaN%)
846.pin-project-lite v0.2.170.0s0.0s (NaN%)0.0s (NaN%)
847.cfg-if v1.0.40.0s0.0s (NaN%)0.0s (NaN%)
848.scopeguard v1.2.00.0s0.0s (NaN%)0.0s (NaN%)
849.shlex v1.3.00.0s0.0s (NaN%)0.0s (NaN%)default, std
850.equivalent v1.0.20.0s0.0s (NaN%)0.0s (NaN%)
+ + + diff --git a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/container-baseline-20260527T210123Z.log b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/container-baseline-20260527T210123Z.log new file mode 100644 index 000000000..1a1621fa5 --- /dev/null +++ b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/container-baseline-20260527T210123Z.log @@ -0,0 +1,17 @@ +[meta] start_utc=2026-05-27T21:01:23Z +[meta] workflow=container +[cold] cache_reset_start +[cold] cache_reset_done +[cold] build_debug_start +[cold] build_debug_seconds=239 +[cold] inspect_start +[cold] inspect_seconds=0 +[cold] build_release_start +[cold] build_release_seconds=260 +[warm] build_debug_start +[warm] build_debug_seconds=2 +[warm] inspect_start +[warm] inspect_seconds=0 +[warm] build_release_start +[warm] build_release_seconds=0 +[meta] end_utc=2026-05-27T21:10:40Z diff --git a/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/testing-baseline-20260527T211129Z.log b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/testing-baseline-20260527T211129Z.log new file mode 100644 index 000000000..ca553e163 --- /dev/null +++ b/docs/issues/open/1841-1840-workflow-performance-baseline-analysis/evidence/testing-baseline-20260527T211129Z.log @@ -0,0 +1,10633 @@ +[meta] start_utc=2026-05-27T21:11:29Z +[meta] workflow=testing +[meta] cargo_home=/home/josecelano/Documents/git/committer/me/github/torrust/torrust-tracker-agent-01/.tmp/issue-1841/cargo-home +[meta] cargo_target_dir=/home/josecelano/Documents/git/committer/me/github/torrust/torrust-tracker-agent-01/.tmp/issue-1841/target-testing +[cold] cache_reset_start +[cold] cache_reset_done +[cold] fetch_start +[cold] fetch_seconds=7 +[cold] fetch_exit_code=0 +[cold] install_linter_start +[cold] install_linter_seconds=5 +[cold] install_linter_exit_code=0 +[cold] format_start +[cold] format_seconds=0 +[cold] format_exit_code=0 +[cold] lint_start +2026-05-27T21:11:47.802541Z  INFO torrust_linting::cli: Running All Linters +2026-05-27T21:11:47.803933Z  INFO markdown: Scanning markdown files... + +2026-05-27T21:11:55.538999Z ERROR markdown: Markdown linting failed. Please fix the issues above. (7.735s) +2026-05-27T21:11:55.539461Z ERROR torrust_linting::cli: Markdown linting failed: Markdown linting failed +2026-05-27T21:11:55.540458Z  INFO yaml: Scanning YAML files... +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/nu-ansi-term-0.50.3/.github/workflows/ci.yml + 1:4 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/log-0.4.30/.github/workflows/main.yml + 37:5 error wrong indentation: expected 6 but found 4 (indentation) + 46:201 error line too long (296 > 200 characters) (line-length) + 54:5 error wrong indentation: expected 6 but found 4 (indentation) + 70:5 error wrong indentation: expected 6 but found 4 (indentation) + 129:201 error line too long (298 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/winapi-util-0.1.11/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 40:9 error wrong indentation: expected 10 but found 8 (indentation) + 62:5 error wrong indentation: expected 6 but found 4 (indentation) + 78:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc-hash-2.1.2/.github/workflows/rust.yml + 35:13 error wrong indentation: expected 10 but found 12 (indentation) + 36:13 error wrong indentation: expected 10 but found 12 (indentation) + 37:13 error wrong indentation: expected 10 but found 12 (indentation) + 38:13 error wrong indentation: expected 10 but found 12 (indentation) + 39:11 error wrong indentation: expected 8 but found 10 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cfg-if-1.0.4/.github/workflows/publish.yaml + 8:10 error too many spaces inside braces (braces) + 8:27 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/local-ip-address-0.6.13/.cirrus.yml + 59:1 error duplication of key "task" in mapping (key-duplicates) + 72:1 error duplication of key "task" in mapping (key-duplicates) + 84:1 error duplication of key "task" in mapping (key-duplicates) + 96:1 error duplication of key "task" in mapping (key-duplicates) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyperlocal-0.9.1/.github/workflows/main.yml + 19:21 error too many spaces after colon (colons) + 81:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/dunce-1.0.5/.appveyor.yml + 5:3 warning comment not indented like content (comments-indentation) + 8:3 warning comment not indented like content (comments-indentation) + 11:3 warning comment not indented like content (comments-indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/dunce-1.0.5/.gitlab-ci.yml + 9:3 error wrong indentation: expected 4 but found 2 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/supports-color-3.0.2/.github/workflows/miri.yml + 14:13 error wrong indentation: expected 10 but found 12 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/shlex-1.3.0/.github/workflows/test.yml + 27:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/h2-0.4.14/.github/workflows/CI.yml + 64:4 warning missing starting space in comment (comments) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bit-vec-0.4.4/.travis.yml + 9:5 error wrong indentation: expected 2 but found 4 (indentation) + 19:5 error wrong indentation: expected 2 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tinytemplate-1.2.1/.github/workflows/ci.yml + 1:25 error wrong new line character: expected \n (new-lines) + 38:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/page_size-0.6.0/.travis.yml + 31:20 error trailing spaces (trailing-spaces) + 94:20 error trailing spaces (trailing-spaces) + 139:19 error trailing spaces (trailing-spaces) + 143:17 error trailing spaces (trailing-spaces) + 147:20 error trailing spaces (trailing-spaces) + 261:16 error trailing spaces (trailing-spaces) + 263:20 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-ext-0.2.1/.github/workflows/ci.yml + 1:52 error wrong new line character: expected \n (new-lines) + 38:4 error wrong indentation: expected 4 but found 3 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/mime_guess-2.0.5/.github/workflows/rust.yml + 1:11 error wrong new line character: expected \n (new-lines) + 11:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cmake-0.1.58/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cmake-0.1.58/.github/workflows/main.yml + 30:5 error wrong indentation: expected 6 but found 4 (indentation) + 42:13 error too many spaces inside brackets (brackets) + 42:18 error too many spaces inside brackets (brackets) + 74:5 error wrong indentation: expected 6 but found 4 (indentation) + 95:13 error too many spaces inside brackets (brackets) + 95:18 error too many spaces inside brackets (brackets) + 103:5 error wrong indentation: expected 6 but found 4 (indentation) + 121:5 error wrong indentation: expected 6 but found 4 (indentation) + 147:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-bidi-0.3.18/.appveyor.yml + 12:5 error wrong indentation: expected 2 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-bidi-0.3.18/.github/workflows/main.yml + 41:14 error too many spaces after colon (colons) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/combine-4.6.7/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 24:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/approx-0.5.1/.travis.yml + 1:15 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/approx-0.5.1/.github/dependabot.yml + 1:11 error wrong new line character: expected \n (new-lines) + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/approx-0.5.1/.github/workflows/ci-build.yml + 1:22 error wrong new line character: expected \n (new-lines) + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.14.0/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.14.0/.github/workflows/coverage.yml + 4:18 error trailing spaces (trailing-spaces) + 5:16 error trailing spaces (trailing-spaces) + 7:18 error trailing spaces (trailing-spaces) + 8:16 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.14.0/.github/workflows/ci.yml + 18:15 error wrong indentation: expected 12 but found 14 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-native-certs-0.8.3/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-native-certs-0.8.3/.github/workflows/smoke-tests.yaml + 25:14 error too many spaces inside brackets (brackets) + 25:28 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-native-certs-0.8.3/.github/workflows/rust.yml + 72:7 warning comment not indented like content (comments-indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/filetime-0.2.29/.github/workflows/main.yml + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + 44:5 error wrong indentation: expected 6 but found 4 (indentation) + 53:5 error wrong indentation: expected 6 but found 4 (indentation) + 65:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc_version-0.4.1/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc_version-0.4.1/.github/workflows/rust.yml + 69:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/dashmap-6.2.1/.github/workflows/ci.yml + 9:5 error wrong indentation: expected 6 but found 4 (indentation) + 14:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/plain-0.2.3/.travis.yml + 6:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/android.yml + 20:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/unsupported.yml + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/freebsd.yml + 20:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/linux.yml + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/macos.yml + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/netbsd.yml + 19:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ringbuffer-0.15.0/.github/workflows/coverage.yml + 37:27 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/indexmap-1.9.3/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:37 error too many spaces inside brackets (brackets) + 5:16 error too many spaces inside brackets (brackets) + 5:37 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bittorrent-primitives-0.2.0/.github/workflows/testing.yaml + 72:201 error line too long (218 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-properties-0.1.4/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 26:5 error wrong indentation: expected 6 but found 4 (indentation) + 30:11 error wrong indentation: expected 8 but found 10 (indentation) + 60:5 error wrong indentation: expected 6 but found 4 (indentation) + 64:11 error wrong indentation: expected 8 but found 10 (indentation) + 71:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cast-0.3.0/.github/workflows/ci.yml + 10:7 error too many spaces before colon (colons) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bs58-0.5.1/.github/workflows/staging.yml + 11:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bs58-0.5.1/.github/workflows/pull_request.yml + 9:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bs58-0.5.1/.github/workflows/nightly.yml + 7:3 error wrong indentation: expected 4 but found 2 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/jobserver-0.1.34/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/jobserver-0.1.34/.github/actions/compile-make/action.yml + 33:201 error line too long (223 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rsa-0.9.10/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/log-0.4.29/.github/workflows/main.yml + 37:5 error wrong indentation: expected 6 but found 4 (indentation) + 42:201 error line too long (296 > 200 characters) (line-length) + 50:5 error wrong indentation: expected 6 but found 4 (indentation) + 63:5 error wrong indentation: expected 6 but found 4 (indentation) + 105:201 error line too long (298 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-named-pipe-0.1.0/appveyor.yml + 6:3 warning comment not indented like content (comments-indentation) + 9:3 warning comment not indented like content (comments-indentation) + 13:1 warning comment not indented like content (comments-indentation) + 15:3 warning comment not indented like content (comments-indentation) + 18:3 warning comment not indented like content (comments-indentation) + 31:13 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atomic-0.6.1/.travis.yml + 5:1 error wrong indentation: expected at least 1 (indentation) + 11:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/arc-swap-1.9.1/.github/workflows/benchmarks.yaml + 7:3 warning comment not indented like content (comments-indentation) + 10:4 warning missing starting space in comment (comments) + 65:12 warning missing starting space in comment (comments) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/arc-swap-1.9.1/.github/workflows/test.yaml + 264:5 error wrong indentation: expected 6 but found 4 (indentation) + 277:11 error wrong indentation: expected 8 but found 10 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.4/.github/workflows/ci.yaml + 21:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-util-0.1.20/.github/workflows/CI.yml + 63:16 error too many spaces inside brackets (brackets) + 63:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/forwarded-header-value-0.1.1/.github/workflows/ci.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + 32:5 error wrong indentation: expected 6 but found 4 (indentation) + 46:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.3.0/.github/workflows/rust-tests.yml + 41:5 error wrong indentation: expected 6 but found 4 (indentation) + 66:9 error wrong indentation: expected 10 but found 8 (indentation) + 73:5 error wrong indentation: expected 6 but found 4 (indentation) + 103:9 error wrong indentation: expected 10 but found 8 (indentation) + 110:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/docker_credential-1.4.0/.github/workflows/ci.yml + 5:16 error too many spaces inside brackets (brackets) + 5:25 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:25 error too many spaces inside brackets (brackets) + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-0.3.76/.github/workflows/publish.yml + 8:10 error too many spaces inside braces (braces) + 8:29 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/spin-0.9.8/.travis.yml + 16:3 error wrong indentation: expected 4 but found 2 (indentation) + 25:6 warning missing starting space in comment (comments) + 31:3 error wrong indentation: expected 4 but found 2 (indentation) + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/spin-0.9.8/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 23:5 error wrong indentation: expected 6 but found 4 (indentation) + 44:5 error wrong indentation: expected 6 but found 4 (indentation) + 52:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/pkg-config-0.3.33/.github/workflows/ci.yml + 6:16 error too many spaces inside brackets (brackets) + 6:23 error too many spaces inside brackets (brackets) + 8:16 error too many spaces inside brackets (brackets) + 8:23 error too many spaces inside brackets (brackets) + 26:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atoi-2.0.0/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atoi-2.0.0/.github/workflows/release.yml + 1:14 error wrong new line character: expected \n (new-lines) + 22:49 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atoi-2.0.0/.github/workflows/test.yml + 1:21 error wrong new line character: expected \n (new-lines) + 24:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/siphasher-1.0.3/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/http-1.4.1/.github/workflows/ci.yml + 42:6 warning missing starting space in comment (comments) + 103:6 warning missing starting space in comment (comments) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.10.5/.github/workflows/ci.yml + 36:18 error too few spaces after comma (commas) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/testcontainers-0.27.3/tests/test-compose.yml + 10:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/.circleci/config.yml + 12:201 error line too long (238 > 200 characters) (line-length) + 15:201 error line too long (228 > 200 characters) (line-length) + 16:201 error line too long (234 > 200 characters) (line-length) + 17:201 error line too long (261 > 200 characters) (line-length) + 18:201 error line too long (267 > 200 characters) (line-length) + 19:201 error line too long (240 > 200 characters) (line-length) + 20:201 error line too long (246 > 200 characters) (line-length) + 138:9 warning comment not indented like content (comments-indentation) + 160:201 error line too long (520 > 200 characters) (line-length) + 162:201 error line too long (298 > 200 characters) (line-length) + 162:298 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/iana-time-zone-0.1.65/.github/workflows/release.yml + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/iana-time-zone-0.1.65/.github/workflows/rust.yml + 268:201 error line too long (210 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/binascii-0.1.4/.travis.yml + 9:3 error wrong indentation: expected 4 but found 2 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.gitlab-ci.yml + 1:31 error wrong new line character: expected \n (new-lines) + 31:71 error trailing spaces (trailing-spaces) + 64:1 error trailing spaces (trailing-spaces) + 66:5 error wrong indentation: expected 2 but found 4 (indentation) + 67:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/rust-1.12.yml + 1:29 error wrong new line character: expected \n (new-lines) + 39:7 warning comment not indented like content (comments-indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/windows.yml + 1:14 error wrong new line character: expected \n (new-lines) + 16:15 error wrong indentation: expected 12 but found 14 (indentation) + 17:15 error wrong indentation: expected 12 but found 14 (indentation) + 18:15 error wrong indentation: expected 12 but found 14 (indentation) + 19:13 error wrong indentation: expected 10 but found 12 (indentation) + 21:15 error wrong indentation: expected 12 but found 14 (indentation) + 22:15 error wrong indentation: expected 12 but found 14 (indentation) + 23:13 error wrong indentation: expected 10 but found 12 (indentation) + 25:15 error wrong indentation: expected 12 but found 14 (indentation) + 26:15 error wrong indentation: expected 12 but found 14 (indentation) + 27:15 error wrong indentation: expected 12 but found 14 (indentation) + 28:13 error wrong indentation: expected 10 but found 12 (indentation) + 30:15 error wrong indentation: expected 12 but found 14 (indentation) + 31:15 error wrong indentation: expected 12 but found 14 (indentation) + 32:15 error wrong indentation: expected 12 but found 14 (indentation) + 33:13 error wrong indentation: expected 10 but found 12 (indentation) + 35:15 error wrong indentation: expected 12 but found 14 (indentation) + 36:15 error wrong indentation: expected 12 but found 14 (indentation) + 37:13 error wrong indentation: expected 10 but found 12 (indentation) + 39:15 error wrong indentation: expected 12 but found 14 (indentation) + 40:15 error wrong indentation: expected 12 but found 14 (indentation) + 41:15 error wrong indentation: expected 12 but found 14 (indentation) + 42:13 error wrong indentation: expected 10 but found 12 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/linux.yml + 1:12 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/macos.yml + 1:12 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/parking_lot-0.12.5/.github/workflows/rust.yml + 31:5 error wrong indentation: expected 6 but found 4 (indentation) + 50:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-6.0.0/.github/workflows/rust-tests.yml + 41:5 error wrong indentation: expected 6 but found 4 (indentation) + 66:9 error wrong indentation: expected 10 but found 8 (indentation) + 73:5 error wrong indentation: expected 6 but found 4 (indentation) + 103:9 error wrong indentation: expected 10 but found 8 (indentation) + 110:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/auto_ops-0.3.0/.travis.yml + 1:15 error wrong new line character: expected \n (new-lines) + 21:201 error line too long (698 > 200 characters) (line-length) + 30:201 error line too long (698 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.13.0/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.13.0/.github/workflows/coverage.yml + 4:18 error trailing spaces (trailing-spaces) + 5:16 error trailing spaces (trailing-spaces) + 7:18 error trailing spaces (trailing-spaces) + 8:16 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.13.0/.github/workflows/ci.yml + 18:15 error wrong indentation: expected 12 but found 14 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/yansi-1.0.1/.github/workflows/ci.yml + 21:14 error too many spaces inside braces (braces) + 21:49 error too many spaces inside braces (braces) + 22:14 error too many spaces inside braces (braces) + 22:52 error too many spaces inside braces (braces) + 23:14 error too many spaces inside braces (braces) + 23:48 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/httparse-1.10.1/.github/workflows/cifuzz.yml + 7:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/.github/workflows/rust.yaml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/.github/workflows/audit.yml + 4:11 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/version_check-0.9.5/.github/workflows/ci.yml + 15:14 error too many spaces inside braces (braces) + 15:49 error too many spaces inside braces (braces) + 16:14 error too many spaces inside braces (braces) + 16:52 error too many spaces inside braces (braces) + 17:14 error too many spaces inside braces (braces) + 17:48 error too many spaces inside braces (braces) + 20:18 error too many spaces inside braces (braces) + 20:53 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/.github/workflows/ci.yaml + 21:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro-crate-3.5.0/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 24:5 error wrong indentation: expected 6 but found 4 (indentation) + 37:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.11.1+wasi-snapshot-preview1/.github/workflows/main.yml + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + 28:5 error wrong indentation: expected 6 but found 4 (indentation) + 39:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/openssl-probe-0.2.1/.github/workflows/main.yml + 21:9 error wrong indentation: expected 10 but found 8 (indentation) + 25:5 error wrong indentation: expected 6 but found 4 (indentation) + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + 86:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/inlinable_string-0.1.15/.travis.yml + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 15:1 error wrong indentation: expected 2 but found 0 (indentation) + 19:1 error wrong indentation: expected 2 but found 0 (indentation) + 24:1 error wrong indentation: expected 2 but found 0 (indentation) + 30:1 error wrong indentation: expected 2 but found 0 (indentation) + 35:3 error wrong indentation: expected 4 but found 2 (indentation) + 36:201 error line too long (696 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/indexmap-2.14.0/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:21 error too many spaces inside brackets (brackets) + 5:16 error too many spaces inside brackets (brackets) + 5:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/ISSUE_TEMPLATE/bug_report.yml + 12:90 error trailing spaces (trailing-spaces) + 13:60 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/ISSUE_TEMPLATE/feature_request.yml + 37:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/workflows/sqlx.yml + 24:19 error too many spaces inside brackets (brackets) + 24:36 error too many spaces inside brackets (brackets) + 25:15 error too many spaces inside brackets (brackets) + 25:40 error too many spaces inside brackets (brackets) + 82:25 error trailing spaces (trailing-spaces) + 88:25 error trailing spaces (trailing-spaces) + 94:25 error trailing spaces (trailing-spaces) + 100:25 error trailing spaces (trailing-spaces) + 121:19 error too many spaces inside brackets (brackets) + 121:36 error too many spaces inside brackets (brackets) + 122:19 error too many spaces inside brackets (brackets) + 122:44 error too many spaces inside brackets (brackets) + 205:20 error too many spaces inside brackets (brackets) + 205:27 error too many spaces inside brackets (brackets) + 206:19 error too many spaces inside brackets (brackets) + 206:36 error too many spaces inside brackets (brackets) + 207:15 error too many spaces inside brackets (brackets) + 207:63 error too many spaces inside brackets (brackets) + 222:22 error trailing spaces (trailing-spaces) + 322:17 error too many spaces inside brackets (brackets) + 322:19 error too many spaces inside brackets (brackets) + 323:19 error too many spaces inside brackets (brackets) + 323:36 error too many spaces inside brackets (brackets) + 324:15 error too many spaces inside brackets (brackets) + 324:63 error too many spaces inside brackets (brackets) + 422:19 error too many spaces inside brackets (brackets) + 422:49 error too many spaces inside brackets (brackets) + 423:19 error too many spaces inside brackets (brackets) + 423:36 error too many spaces inside brackets (brackets) + 424:15 error too many spaces inside brackets (brackets) + 424:63 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/workflows/sqlx-cli.yml + 91:1 error trailing spaces (trailing-spaces) + 93:1 error trailing spaces (trailing-spaces) + 99:1 error trailing spaces (trailing-spaces) + 101:1 error trailing spaces (trailing-spaces) + 103:1 error trailing spaces (trailing-spaces) + 110:1 error trailing spaces (trailing-spaces) + 112:1 error trailing spaces (trailing-spaces) + 114:1 error trailing spaces (trailing-spaces) + 127:1 error trailing spaces (trailing-spaces) + 129:1 error trailing spaces (trailing-spaces) + 131:1 error trailing spaces (trailing-spaces) + 133:1 error trailing spaces (trailing-spaces) + 170:1 error trailing spaces (trailing-spaces) + 172:1 error trailing spaces (trailing-spaces) + 178:1 error trailing spaces (trailing-spaces) + 180:1 error trailing spaces (trailing-spaces) + 182:1 error trailing spaces (trailing-spaces) + 189:1 error trailing spaces (trailing-spaces) + 191:1 error trailing spaces (trailing-spaces) + 193:1 error trailing spaces (trailing-spaces) + 206:1 error trailing spaces (trailing-spaces) + 208:1 error trailing spaces (trailing-spaces) + 210:1 error trailing spaces (trailing-spaces) + 212:1 error trailing spaces (trailing-spaces) + 241:1 error trailing spaces (trailing-spaces) + 243:1 error trailing spaces (trailing-spaces) + 249:1 error trailing spaces (trailing-spaces) + 251:1 error trailing spaces (trailing-spaces) + 253:1 error trailing spaces (trailing-spaces) + 260:1 error trailing spaces (trailing-spaces) + 262:1 error trailing spaces (trailing-spaces) + 264:1 error trailing spaces (trailing-spaces) + 277:1 error trailing spaces (trailing-spaces) + 279:1 error trailing spaces (trailing-spaces) + 281:1 error trailing spaces (trailing-spaces) + 283:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/tests/docker-compose.yml + 252:201 error line too long (202 > 200 characters) (line-length) + 288:201 error line too long (202 > 200 characters) (line-length) + 324:201 error line too long (202 > 200 characters) (line-length) + 360:201 error line too long (202 > 200 characters) (line-length) + 396:201 error line too long (202 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aho-corasick-1.1.4/.github/workflows/ci.yml + 6:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:3 error wrong indentation: expected 4 but found 2 (indentation) + 50:9 error wrong indentation: expected 10 but found 8 (indentation) + 88:5 error wrong indentation: expected 6 but found 4 (indentation) + 139:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-normalization-0.1.25/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 46:14 error too many spaces inside brackets (brackets) + 46:44 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/quickcheck-1.1.0/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 40:9 error wrong indentation: expected 10 but found 8 (indentation) + 62:5 error wrong indentation: expected 6 but found 4 (indentation) + 77:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/formatjson-0.3.1/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:25 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:25 error too many spaces inside brackets (brackets) + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bytes-1.11.1/.github/workflows/ci.yml + 28:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/alloc-no-stdlib-2.0.4/.travis.yml + 17:53 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ipnet-2.12.0/.travis.yml + 8:3 error wrong indentation: expected 4 but found 2 (indentation) + 9:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/either-1.16.0/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ident_case-1.0.1/.travis.yml + 5:12 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/matchers-0.2.0/.github/workflows/ci.yml + 90:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sharded-slab-0.1.7/.github/workflows/release.yml + 22:52 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ureq-3.3.0/.github/workflows/test.yml + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + 160:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicase-2.9.0/.github/workflows/CI.yml + 83:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/axum-server-0.8.0/.github/workflows/ci.yml + 54:14 error too many spaces inside braces (braces) + 54:27 error too many spaces inside braces (braces) + 55:14 error too many spaces inside braces (braces) + 55:70 error too many spaces inside braces (braces) + 57:15 error wrong indentation: expected 12 but found 14 (indentation) + 58:15 error wrong indentation: expected 12 but found 14 (indentation) + 59:13 error wrong indentation: expected 10 but found 12 (indentation) + 61:15 error wrong indentation: expected 12 but found 14 (indentation) + 62:15 error wrong indentation: expected 12 but found 14 (indentation) + 63:15 error wrong indentation: expected 12 but found 14 (indentation) + 64:13 error wrong indentation: expected 10 but found 12 (indentation) + 66:15 error wrong indentation: expected 12 but found 14 (indentation) + 67:15 error wrong indentation: expected 12 but found 14 (indentation) + 68:15 error wrong indentation: expected 12 but found 14 (indentation) + 69:13 error wrong indentation: expected 10 but found 12 (indentation) + 90:14 error too many spaces inside braces (braces) + 90:30 error too many spaces inside braces (braces) + 92:15 error wrong indentation: expected 12 but found 14 (indentation) + 93:15 error wrong indentation: expected 12 but found 14 (indentation) + 94:15 error wrong indentation: expected 12 but found 14 (indentation) + 95:13 error wrong indentation: expected 10 but found 12 (indentation) + 119:14 error too many spaces inside braces (braces) + 119:43 error too many spaces inside braces (braces) + 120:14 error too many spaces inside braces (braces) + 120:54 error too many spaces inside braces (braces) + 122:14 error too many spaces inside braces (braces) + 122:27 error too many spaces inside braces (braces) + 123:14 error too many spaces inside braces (braces) + 123:70 error too many spaces inside braces (braces) + 125:15 error wrong indentation: expected 12 but found 14 (indentation) + 126:15 error wrong indentation: expected 12 but found 14 (indentation) + 127:13 error wrong indentation: expected 10 but found 12 (indentation) + 129:15 error wrong indentation: expected 12 but found 14 (indentation) + 130:15 error wrong indentation: expected 12 but found 14 (indentation) + 131:15 error wrong indentation: expected 12 but found 14 (indentation) + 132:13 error wrong indentation: expected 10 but found 12 (indentation) + 134:15 error wrong indentation: expected 12 but found 14 (indentation) + 135:15 error wrong indentation: expected 12 but found 14 (indentation) + 136:15 error wrong indentation: expected 12 but found 14 (indentation) + 137:13 error wrong indentation: expected 10 but found 12 (indentation) + 160:14 error too many spaces inside braces (braces) + 160:27 error too many spaces inside braces (braces) + 161:14 error too many spaces inside braces (braces) + 161:70 error too many spaces inside braces (braces) + 163:15 error wrong indentation: expected 12 but found 14 (indentation) + 164:15 error wrong indentation: expected 12 but found 14 (indentation) + 165:13 error wrong indentation: expected 10 but found 12 (indentation) + 167:15 error wrong indentation: expected 12 but found 14 (indentation) + 168:15 error wrong indentation: expected 12 but found 14 (indentation) + 169:15 error wrong indentation: expected 12 but found 14 (indentation) + 170:13 error wrong indentation: expected 10 but found 12 (indentation) + 172:15 error wrong indentation: expected 12 but found 14 (indentation) + 173:15 error wrong indentation: expected 12 but found 14 (indentation) + 174:15 error wrong indentation: expected 12 but found 14 (indentation) + 175:13 error wrong indentation: expected 10 but found 12 (indentation) + 201:14 error too many spaces inside braces (braces) + 201:27 error too many spaces inside braces (braces) + 202:14 error too many spaces inside braces (braces) + 202:70 error too many spaces inside braces (braces) + 204:15 error wrong indentation: expected 12 but found 14 (indentation) + 205:15 error wrong indentation: expected 12 but found 14 (indentation) + 206:13 error wrong indentation: expected 10 but found 12 (indentation) + 208:15 error wrong indentation: expected 12 but found 14 (indentation) + 209:15 error wrong indentation: expected 12 but found 14 (indentation) + 210:15 error wrong indentation: expected 12 but found 14 (indentation) + 211:13 error wrong indentation: expected 10 but found 12 (indentation) + 213:15 error wrong indentation: expected 12 but found 14 (indentation) + 214:15 error wrong indentation: expected 12 but found 14 (indentation) + 215:15 error wrong indentation: expected 12 but found 14 (indentation) + 216:13 error wrong indentation: expected 10 but found 12 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc-demangle-0.1.27/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc-demangle-0.1.27/.github/workflows/main.yml + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + 24:5 error wrong indentation: expected 6 but found 4 (indentation) + 35:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bytemuck-1.25.0/.github/workflows/rust.yml + 21:9 error wrong indentation: expected 10 but found 8 (indentation) + 21:12 error too many spaces inside braces (braces) + 21:44 error too many spaces inside braces (braces) + 22:12 error too many spaces inside braces (braces) + 22:44 error too many spaces inside braces (braces) + 23:12 error too many spaces inside braces (braces) + 23:44 error too many spaces inside braces (braces) + 24:12 error too many spaces inside braces (braces) + 24:42 error too many spaces inside braces (braces) + 25:12 error too many spaces inside braces (braces) + 25:45 error too many spaces inside braces (braces) + 27:12 error too many spaces inside braces (braces) + 27:43 error too many spaces inside braces (braces) + 28:12 error too many spaces inside braces (braces) + 28:45 error too many spaces inside braces (braces) + 29:12 error too many spaces inside braces (braces) + 29:56 error too many spaces inside braces (braces) + 30:12 error too many spaces inside braces (braces) + 30:55 error too many spaces inside braces (braces) + 31:12 error too many spaces inside braces (braces) + 31:54 error too many spaces inside braces (braces) + 33:5 error wrong indentation: expected 6 but found 4 (indentation) + 56:5 error wrong indentation: expected 6 but found 4 (indentation) + 73:5 error wrong indentation: expected 6 but found 4 (indentation) + 94:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/simd_cesu8-1.1.1/.github/workflows/ci.yml + 3:6 error too many spaces inside brackets (brackets) + 3:25 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hybrid-array-0.4.12/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hybrid-array-0.4.12/.github/workflows/publish.yml + 4:12 error too many spaces inside brackets (brackets) + 4:17 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/byteorder-1.5.0/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 52:9 error wrong indentation: expected 10 but found 8 (indentation) + 90:5 error wrong indentation: expected 6 but found 4 (indentation) + 161:5 error wrong indentation: expected 6 but found 4 (indentation) + 175:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/simd-adler32-0.3.9/.github/workflows/build.yaml + 92:16 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/glob-0.3.3/.github/workflows/rust.yml + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + 48:5 error wrong indentation: expected 6 but found 4 (indentation) + 63:5 error wrong indentation: expected 6 but found 4 (indentation) + 77:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/.github/workflows/ci.yml + 18:14 error too many spaces inside braces (braces) + 18:49 error too many spaces inside braces (braces) + 19:14 error too many spaces inside braces (braces) + 19:52 error too many spaces inside braces (braces) + 20:14 error too many spaces inside braces (braces) + 20:48 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-timeout-0.5.2/.github/workflows/ci.yml + 4:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/walkdir-2.5.0/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 40:9 error wrong indentation: expected 10 but found 8 (indentation) + 65:5 error wrong indentation: expected 6 but found 4 (indentation) + 85:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/castaway-0.2.4/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/equivalent-1.0.2/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:21 error too many spaces inside brackets (brackets) + 5:16 error too many spaces inside brackets (brackets) + 5:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-diagnostics-0.10.1/.github/workflows/ci.yml + 18:14 error too many spaces inside braces (braces) + 18:49 error too many spaces inside braces (braces) + 19:14 error too many spaces inside braces (braces) + 19:52 error too many spaces inside braces (braces) + 20:14 error too many spaces inside braces (braces) + 20:48 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/utf8-zero-0.8.1/.github/workflows/ci.yml + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + + + +2026-05-27T21:11:57.243064Z ERROR yaml: YAML linting failed. Please fix the issues above. (1.703s) +2026-05-27T21:11:57.243071Z ERROR torrust_linting::cli: YAML linting failed: YAML linting failed +2026-05-27T21:11:57.243992Z  INFO toml: Scanning TOML files... + +2026-05-27T21:12:00.265921Z ERROR toml: TOML formatting failed. Please fix the issues above. (3.022s) +2026-05-27T21:12:00.265929Z ERROR toml: Run 'taplo fmt **/*.toml' to auto-fix formatting issues. +2026-05-27T21:12:00.265932Z ERROR torrust_linting::cli: TOML linting failed: TOML formatting failed +2026-05-27T21:12:00.267529Z  INFO cspell: Running spell check on all files... +2026-05-27T21:12:03.119966Z  INFO cspell: All files passed spell checking! (2.852s) +2026-05-27T21:12:03.119980Z  INFO clippy: Running Rust Clippy linter... +2026-05-27T21:12:33.644064Z  INFO clippy: Clippy linting completed successfully! (30.524s) +2026-05-27T21:12:33.644077Z  INFO rustfmt: Running Rust formatter check... +2026-05-27T21:12:33.925311Z  INFO rustfmt: Rust formatting check passed! (0.281s) +2026-05-27T21:12:33.925321Z  INFO shellcheck: Running ShellCheck on shell scripts... +2026-05-27T21:12:34.705580Z  INFO shellcheck: Found 77 shell script(s) to check + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/axum-client-ip-0.7.0/.pre-commit.sh line 9: + read -p "Link this script as the git pre-commit hook to avoid further manual running? (y/N): " answer + ^--^ SC2162 (info): read without -r will mangle backslashes. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bit-vec-0.4.4/crusader.sh line 4: +cd cargo-crusader +^---------------^ SC2164 (warning): Use 'cd ... || exit' or 'cd ... || return' in case cd fails. + +Did you mean: +cd cargo-crusader || exit + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bit-vec-0.4.4/crusader.sh line 6: +export PATH=$PATH:`pwd`/target/release/ + ^--^ SC2155 (warning): Declare and assign separately to avoid masking return values. + ^---^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: +export PATH=$PATH:$(pwd)/target/release/ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 8: +for test_file in $(ls tests/); do + ^----------^ SC2045 (error): Iterating over ls output is fragile. Use globs. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 14: + > results/failures-${test_name}.csv + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + > results/failures-"${test_name}".csv + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 16: + cat tests/${test_file} \ + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cat tests/"${test_file}" \ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 18: + > results/result-${test_name}.csv + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + > results/result-"${test_name}".csv + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 20: + cat results/result-${test_name}.csv >> results/result.csv + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cat results/result-"${test_name}".csv >> results/result.csv + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/combine-4.6.7/release.sh line 9: +clog --$VERSION && \ + ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +clog --"$VERSION" && \ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/combine-4.6.7/release.sh line 12: + cargo release --execute $VERSION + ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cargo release --execute "$VERSION" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/darling-0.20.11/compiletests.sh line 1: +RUSTFLAGS="--cfg=compiletests" cargo +1.77.0 test --test compiletests +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.6/ci/rustup.sh line 11: + $run $PWD/ci/test_full.sh + ^--^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + $run "$PWD"/ci/test_full.sh + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.6/ci/test_full.sh line 5: +echo Testing num-bigint on rustc ${TRAVIS_RUST_VERSION} + ^--------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +echo Testing num-bigint on rustc "${TRAVIS_RUST_VERSION}" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-windows-debug-crt-static-test.sh line 20: +case `uname -s` in + ^--------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: +case $(uname -s) in + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-windows-debug-crt-static-test.sh line 24: + *) echo Unknown OS: `uname -s`; exit 1;; + ^--------^ SC2046 (warning): Quote this to prevent word splitting. + ^--------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: + *) echo Unknown OS: $(uname -s); exit 1;; + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-windows-debug-crt-static-test.sh line 27: +TMP_DIR=`mktemp -d` + ^---------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: +TMP_DIR=$(mktemp -d) + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-valgrind.sh line 206: +if eval ${CARGO_CMD}; then + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +if eval "${CARGO_CMD}"; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 10: +git clone https://github.com/aws/s2n-quic.git $S2N_QUIC_TEMP + ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +git clone https://github.com/aws/s2n-quic.git "$S2N_QUIC_TEMP" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 11: +cd $S2N_QUIC_TEMP + ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +cd "$S2N_QUIC_TEMP" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 15: + find ./ -type f -name "Cargo.toml" | xargs sed -i '' -e "s|${QUIC_AWS_LC_RS_STRING}|${QUIC_PATH_STRING}|" + ^-- SC2038 (warning): Use 'find .. -print0 | xargs -0 ..' or 'find .. -exec .. +' to allow non-alphanumeric filenames. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 17: + find ./ -type f -name "Cargo.toml" | xargs sed -i -e "s|${QUIC_AWS_LC_RS_STRING}|${QUIC_PATH_STRING}|" + ^-- SC2038 (warning): Use 'find .. -print0 | xargs -0 ..' or 'find .. -exec .. +' to allow non-alphanumeric filenames. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-rustls-integration.sh line 116: + trap "rm -f '$tmp_file'" RETURN + ^-------^ SC2064 (warning): Use single quotes, otherwise this expands now rather than when signalled. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/libsqlite3-sys-0.30.1/upgrade_sqlcipher.sh line 13: +mkdir -p $SCRIPT_DIR/sqlcipher.src + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +mkdir -p "$SCRIPT_DIR"/sqlcipher.src + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/futures-intrusive-0.5.0/benches/bench_mutex.sh line 1: +# This is just a convenience script to filter the important facts out of the criterion report +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/darling-0.23.0/compiletests.sh line 1: +RUSTFLAGS="--cfg=compiletests" cargo +1.88.0 test --test compiletests +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/resources/dockerfiles/bin/run_integration_tests.sh line 7: +export REGISTRY_PASSWORD=$(date | md5sum | cut -f1 -d\ ) + ^---------------^ SC2155 (warning): Declare and assign separately to avoid masking return values. + ^-----------------------------^ SC2046 (warning): Quote this to prevent word splitting. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/resources/dockerfiles/bin/run_integration_tests.sh line 9: +echo -n "${REGISTRY_PASSWORD}" | docker run --rm -i --entrypoint=htpasswd --volumes-from config nimmis/alpine-apache -i -B -c /etc/docker/registry/htpasswd bollard + ^-- SC3037 (warning): In POSIX sh, echo flags are undefined. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/resources/dockerfiles/bin/run_integration_tests.sh line 24: +docker run -e RUST_LOG=bollard=trace -e REGISTRY_PASSWORD -e REGISTRY_HTTP_ADDR=localhost:5000 -v /var/run/docker.sock:/var/run/docker.sock $DOCKER_PARAMETERS -ti --rm bollard cargo test $@ -- --test-threads 1 + ^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements. + +Did you mean: +docker run -e RUST_LOG=bollard=trace -e REGISTRY_PASSWORD -e REGISTRY_HTTP_ADDR=localhost:5000 -v /var/run/docker.sock:/var/run/docker.sock "$DOCKER_PARAMETERS" -ti --rm bollard cargo test $@ -- --test-threads 1 + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 1: +#!/bin/bash + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 2: +set -ex + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 3: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 4: +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 5: +cd $SCRIPTDIR + ^--------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: +cd "$SCRIPTDIR" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 6: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 7: +export VCPKG_ROOT=$SCRIPTDIR/../vcp + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 8: +export VCPKGRS_TRIPLET=test-triplet + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 9: +export VCPKG_DEFAULT_TRIPLET=test-triplet + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 10: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 11: +cp $VCPKG_ROOT/triplets/x64-linux.cmake $VCPKG_ROOT/triplets/test-triplet.cmake + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: +cp "$VCPKG_ROOT"/triplets/x64-linux.cmake "$VCPKG_ROOT"/triplets/test-triplet.cmake + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 12: +for port in harfbuzz ; do + ^------^ SC2043 (warning): This loop will only ever run once. Bad quoting or missing glob/expansion? + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 13: + # check that the port fails before it is installed + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 14: + $VCPKG_ROOT/vcpkg remove --no-binarycaching $port || true + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg remove --no-binarycaching $port || true + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 15: + cargo clean --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 16: + cargo run --manifest-path $port/Cargo.toml && exit 2 + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 17: + echo THIS FAILURE IS EXPECTED + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 18: + echo This is to ensure that we are not spuriously succeeding because the libraries already exist somewhere on the build machine. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 19: + # disable binary caching because it breaks this build as of vcpkg 53e6588 (since vcpkg 52a9d9a) + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 20: + $VCPKG_ROOT/vcpkg install --no-binarycaching $port + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg install --no-binarycaching $port + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 21: + cargo run --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 22: +done + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 1: +#!/bin/bash + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 2: +set -ex + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 3: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 4: +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 5: +cd $SCRIPTDIR + ^--------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: +cd "$SCRIPTDIR" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 6: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 7: +export VCPKG_ROOT=$SCRIPTDIR/../vcp + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 8: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 9: +source ../setup_vcp.sh + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 10: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 11: +for port in harfbuzz ; do + ^------^ SC2043 (warning): This loop will only ever run once. Bad quoting or missing glob/expansion? + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 12: + # check that the port fails before it is installed + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 13: + $VCPKG_ROOT/vcpkg remove $port || true + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg remove $port || true + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 14: + cargo clean --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 15: + cargo run --manifest-path $port/Cargo.toml && exit 2 + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 16: + echo THIS FAILURE IS EXPECTED + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 17: + echo This is to ensure that we are not spuriously succeeding because the libraries already exist somewhere on the build machine. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 18: + $VCPKG_ROOT/vcpkg install $port + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg install $port + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 19: + cargo run --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 20: +done + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 1: +#!/bin/bash + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 2: +# + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 3: +# This script can be sourced to ensure VCPKG_ROOT points at a bootstrapped vcpkg repository. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 4: +# It will also modify the environment (if sourced) to reflect any overrides in + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 5: +# vcpkg triplet used neccesary to match the semantics of vcpkg-rs. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 6: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 7: +if [ "$VCPKG_ROOT" == "" ]; then + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 8: + echo "VCPKG_ROOT must be set." + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 9: + exit 1 + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 10: +fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 11: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 12: +# Bootstrap ./vcp if it doesn't already exist. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 13: +if [ ! -d "$VCPKG_ROOT" ]; then + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 14: + echo "Bootstrapping ./vcp for systest" + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 15: + pushd .. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 16: + git clone https://github.com/microsoft/vcpkg.git vcp + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 17: + cd vcp + ^----^ SC2164 (warning): Use 'cd ... || exit' or 'cd ... || return' in case cd fails. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + cd vcp || exit + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 18: + if [ "$OS" == "Windows_NT" ]; then + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 19: + ./bootstrap-vcpkg.bat + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 20: + else + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 21: + ./bootstrap-vcpkg.sh + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 22: + fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 23: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 24: + popd + ^--^ SC2164 (warning): Use 'popd ... || exit' or 'popd ... || return' in case popd fails. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + popd || exit + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 25: +fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 26: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 27: +# Override triplet used if we are on Windows, as the default there is 32bit + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 28: +# dynamic, whereas on 64 bit vcpkg-rs will prefer static with dynamic CRT + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 29: +# linking. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 30: +if [ "$OS" == "Windows_NT" -a "$PROCESSOR_ARCHITECTURE" == "AMD64" ] ; then + ^-- SC2166 (warning): Prefer [ p ] && [ q ] as [ p -a q ] is not well defined. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 31: + export VCPKG_DEFAULT_TRIPLET=x64-windows-static-md + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 32: +fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 12: + width=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\1/') + ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + width=$(echo "$line" | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\1/') + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 13: + params=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\2/' | sed 's/ /, /g' | sed 's/=/: /g') + ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + params=$(echo "$line" | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\2/' | sed 's/ /, /g' | sed 's/=/: /g') + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 14: + name=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\3/' | sed 's/[-\/]/_/g') + ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + name=$(echo "$line" | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\3/' | sed 's/[-\/]/_/g') + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 18: + echo -n " " + ^-- SC3037 (warning): In POSIX sh, echo flags are undefined. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 19: + if [ $width -le 8 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + if [ "$width" -le 8 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 21: + elif [ $width -le 16 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 16 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 23: + elif [ $width -le 32 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 32 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 25: + elif [ $width -le 64 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 64 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 27: + elif [ $width -le 128 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 128 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/ci/script.sh line 1: +set -ex +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/ci/script.sh line 25: + cargo build --features "$FEATURES" $BUILD_ARGS + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cargo build --features "$FEATURES" "$BUILD_ARGS" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/ci/install.sh line 1: +set -ex +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 1: +# Requires Github CLI and `jq` +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 19: + PAGE=$(gh api graphql -f after="$CURSOR" -f query='query($after: String) { + ^-- SC2016 (info): Expressions don't expand in single quotes, use double quotes for that. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 68: +echo "Found $COUNT pull requests merged on or after $1\n" + ^-- SC2028 (info): echo may not expand escape sequences. Use printf. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 70: +if [ -z $COUNT ]; then exit 0; fi; + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +if [ -z "$COUNT" ]; then exit 0; fi; + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 75: +echo "\nLinks:" + ^--------^ SC2028 (info): echo may not expand escape sequences. Use printf. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 78: +echo "\nNew Authors:" + ^--------------^ SC2028 (info): echo may not expand escape sequences. Use printf. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 82: +echo "$PULLS" | jq -r '.[].author.login' | while read author; do + ^--^ SC2162 (info): read without -r will mangle backslashes. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 92: + echo $author_entry + ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$author_entry" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/tests/mssql/configure-db.sh line 7: +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -d master -i setup.sql + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -d master -i setup.sql + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/encoding_rs-0.8.35/ci/miri.sh line 1: +set -ex +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 36: + local tab=$(printf '\t') + ^-^ SC2155 (warning): Declare and assign separately to avoid masking return values. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 37: + local matches=$(git grep -PIn "${tab}" "${PROJECT_ROOT}" | grep -v 'LICENSE') + ^-----^ SC2155 (warning): Declare and assign separately to avoid masking return values. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 47: + local matches=$(git grep -PIn "\s+$" "${PROJECT_ROOT}" | grep -v -F '.stderr:') + ^-----^ SC2155 (warning): Declare and assign separately to avoid masking return values. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 88: + $CARGO test --all-features --all $@ + ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 31: +for arg in $*; do + ^-- SC2048 (warning): Use "$@" (with quotes) to prevent whitespace problems. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 143: + while read executable; do + ^--^ SC2162 (info): read without -r will mangle backslashes. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 145: + llvm-profdata-$llvm_version merge -sparse ""$coverage_dir"/$basename.profraw" -o "$coverage_dir"/$basename.profdata + ^-----------^ SC2027 (warning): The surrounding quotes actually unquote this. Remove or escape them. + ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + llvm-profdata-$llvm_version merge -sparse """$coverage_dir""/$basename.profraw" -o "$coverage_dir"/"$basename".profdata + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 148: + --instr-profile "$coverage_dir"/$basename.profdata \ + ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + --instr-profile "$coverage_dir"/"$basename".profdata \ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 151: + > "$coverage_dir"/reports/coverage-$basename.txt + ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + > "$coverage_dir"/reports/coverage-"$basename".txt + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_actions.sh line 43: + echo "$output" | sed "s|^|$script_name: |" >&2 + ^-- SC2001 (style): See if you can use ${variable//search/replace} instead. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_job_dependencies.sh line 15: +for i in $(find .github -iname '*.yaml' -or -iname '*.yml'); do + ^-- SC2044 (warning): For loops over find output are fragile. Use find -exec or a while read loop. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_job_dependencies.sh line 27: + echo "$i: all-jobs-succeed missing dependencies on some jobs: $missing_jobs" | tee -a $GITHUB_STEP_SUMMARY >&2 + ^------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$i: all-jobs-succeed missing dependencies on some jobs: $missing_jobs" | tee -a "$GITHUB_STEP_SUMMARY" >&2 + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_todo.sh line 32: + commit_output=$(echo "$commit_output" | sed "s/^/COMMIT_MESSAGE:/") + ^-- SC2001 (style): See if you can use ${variable//search/replace} instead. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_versions.sh line 47: + echo "$SUCCESS_MSG" | tee -a $GITHUB_STEP_SUMMARY + ^------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$SUCCESS_MSG" | tee -a "$GITHUB_STEP_SUMMARY" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_versions.sh line 49: + echo "$FAILURE_MSG" | tee -a $GITHUB_STEP_SUMMARY >&2 + ^------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$FAILURE_MSG" | tee -a "$GITHUB_STEP_SUMMARY" >&2 + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/cargo.sh line 17: +./tools/target/debug/cargo-zerocopy $@ + ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements. + +For more information: + https://www.shellcheck.net/wiki/SC1017 -- Literal carriage return. Run scri... + https://www.shellcheck.net/wiki/SC2045 -- Iterating over ls output is fragi... + https://www.shellcheck.net/wiki/SC2068 -- Double quote array expansions to ... + + +2026-05-27T21:12:35.475355Z ERROR shellcheck: shellcheck failed (1.550s) +2026-05-27T21:12:35.475373Z ERROR torrust_linting::cli: Shell script linting failed: shellcheck failed +2026-05-27T21:12:35.475376Z ERROR torrust_linting::cli: Some linters failed +[cold] lint_seconds=48 +[cold] lint_exit_code=1 +[cold] test_docs_start + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test packages/located-error/src/lib.rs - (line 4) ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.21s; merged doctests compilation took 1.20s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test packages/net-primitives/src/service_binding.rs - service_binding::ServiceBinding (line 114) ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.60s; merged doctests compilation took 1.59s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 2 tests +test contrib/bencode/src/lib.rs - (line 7) ... ok +test contrib/bencode/src/lib.rs - (line 23) ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.87s + +all doctests ran in 0.90s; merged doctests compilation took 0.02s + +running 15 tests +test packages/tracker-core/src/announce_handler.rs - announce_handler (line 15) - compile ... ok +test packages/tracker-core/src/announce_handler.rs - announce_handler (line 61) - compile ... ok +test packages/tracker-core/src/scrape_handler.rs - scrape_handler (line 12) - compile ... ok +test packages/tracker-core/src/databases/setup.rs - databases::setup::initialize_database (line 78) - compile ... ok +test packages/tracker-core/src/torrent/mod.rs - torrent (line 105) - compile ... ok +test packages/tracker-core/src/scrape_handler.rs - scrape_handler (line 43) - compile ... ok +test packages/tracker-core/src/torrent/mod.rs - torrent (line 86) - compile ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key (line 31) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::Key (line 116) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::PeerKey (line 32) ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key (line 19) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::Key (line 123) ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key::generate_key (line 98) ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key::verify_key_expiration (line 141) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::ParseKeyError (line 178) ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 15.68s; merged doctests compilation took 15.68s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 11 tests +test packages/http-protocol/src/percent_encoding.rs - percent_encoding::percent_decode_peer_id (line 65) ... ok +test packages/http-protocol/src/percent_encoding.rs - percent_encoding::percent_decode_info_hash (line 35) ... ok +test packages/http-protocol/src/v1/requests/announce.rs - v1::requests::announce::Announce (line 45) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param (line 33) ... ok +test packages/http-protocol/src/v1/responses/announce.rs - v1::responses::announce::CompactPeer (line 231) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param_vec (line 62) ... ok +test packages/http-protocol/src/v1/responses/scrape.rs - v1::responses::scrape::Bencoded (line 40) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param_vec (line 75) ... ok +test packages/http-protocol/src/v1/responses/error.rs - v1::responses::error::Error::write (line 30) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param (line 46) ... ok +test packages/http-protocol/src/v1/responses/announce.rs - v1::responses::announce::NormalPeer (line 181) ... ok + +test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 2.87s; merged doctests compilation took 2.86s + +running 2 tests +test packages/primitives/src/peer.rs - peer (line 5) - compile ... ok +test packages/primitives/src/peer.rs - peer::Peer (line 93) - compile ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 3.19s; merged doctests compilation took 3.19s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test packages/udp-server/src/statistics/services.rs - statistics::services (line 32) - compile ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.03s; merged doctests compilation took 1.03s + +running 3 tests +test packages/udp-tracker-core/src/connection_cookie.rs - connection_cookie (line 23) ... ignored +test packages/udp-tracker-core/src/connection_cookie.rs - connection_cookie (line 43) ... ignored +test packages/udp-tracker-core/src/statistics/services.rs - statistics::services (line 32) - compile ... ok + +test result: ok. 1 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.06s; merged doctests compilation took 1.06s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +[cold] test_docs_seconds=58 +[cold] test_docs_exit_code=0 +[cold] test_unit_start + +running 1 test +test peer_client::tests::test_client_from_peer_id ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 11 tests +test clock::stopped::detail::tests::it_should_get_app_start_time ... ok +test clock::stopped::detail::tests::it_should_get_the_zero_start_time_when_testing ... ok +test clock::stopped::tests::it_should_possible_to_set_the_time ... ok +test clock::tests::it_should_be_the_stopped_clock_as_default_when_testing ... ok +test clock::stopped::tests::it_should_default_to_zero_when_testing ... ok +test clock::tests::it_should_have_different_times ... ok +test conv::tests::should_be_converted_from_datetime_utc ... ok +test clock::stopped::tests::it_should_default_to_zero_on_thread_exit ... ok +test conv::tests::should_be_converted_from_datetime_utc_in_iso_8601 ... ok +test conv::tests::should_be_converted_to_datetime_utc ... ok +test clock::tests::it_should_use_stopped_time_for_testing ... ok + +test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + + +running 1 test +test clock::it_should_use_stopped_time_for_testing ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + + +running 1 test +test tests::error_should_include_location ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 260 tests +test counter::tests::it_could_be_converted_from_i32 ... ok +test counter::tests::it_could_be_converted_from_u32 ... ok +test counter::tests::it_could_be_converted_from_u64 ... ok +test counter::tests::it_could_set_to_an_absolute_value ... ok +test counter::tests::it_could_be_incremented ... ok +test counter::tests::it_could_be_converted_into_u64 ... ok +test counter::tests::it_serializes_to_prometheus ... ok +test counter::tests::it_should_be_created_from_integer_values ... ok +test counter::tests::it_should_be_cloneable ... ok +test counter::tests::it_should_be_debuggable ... ok +test counter::tests::it_should_be_displayable ... ok +test counter::tests::it_should_handle_conversion_roundtrip ... ok +test counter::tests::it_should_handle_i32_conversion_roundtrip ... ok +test counter::tests::it_should_handle_i32_max_conversion ... ok +test counter::tests::it_should_handle_i32_min_conversion ... ok +test counter::tests::it_should_handle_large_increments ... ok +test counter::tests::it_should_handle_large_values ... ok +test counter::tests::it_should_handle_negative_i32_conversion ... ok +test counter::tests::it_should_handle_u32_max_conversion ... ok +test counter::tests::it_should_handle_u32_conversion_roundtrip ... ok +test counter::tests::it_should_handle_zero_value ... ok +test counter::tests::it_should_have_default_value ... ok +test counter::tests::it_should_return_primitive_value ... ok +test counter::tests::it_should_serialize_large_values_to_prometheus ... ok +test counter::tests::it_should_support_equality_comparison ... ok +test counter::tests::it_should_support_multiple_absolute_operations ... ok +test gauge::tests::it_could_be_converted_from_f32 ... ok +test gauge::tests::it_could_be_converted_from_u64 ... ok +test gauge::tests::it_could_be_decremented ... ok +test gauge::tests::it_could_be_converted_into_i64 ... ok +test gauge::tests::it_could_be_incremented ... ok +test gauge::tests::it_could_be_set ... ok +test gauge::tests::it_serializes_to_prometheus ... ok +test gauge::tests::it_should_be_cloneable ... ok +test gauge::tests::it_should_be_created_from_integer_values ... ok +test gauge::tests::it_should_be_debuggable ... ok +test gauge::tests::it_should_be_displayable ... ok +test gauge::tests::it_should_handle_conversion_roundtrip ... ok +test gauge::tests::it_should_handle_f32_conversion_roundtrip ... ok +test gauge::tests::it_should_handle_infinity ... ok +test gauge::tests::it_should_handle_large_values ... ok +test gauge::tests::it_should_handle_multiple_operations ... ok +test gauge::tests::it_should_handle_nan ... ok +test gauge::tests::it_should_handle_negative_values ... ok +test gauge::tests::it_should_handle_zero_value ... ok +test gauge::tests::it_should_return_primitive_value ... ok +test gauge::tests::it_should_have_default_value ... ok +test gauge::tests::it_should_serialize_special_values_to_prometheus ... ok +test gauge::tests::it_should_support_equality_comparison ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_1 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_2 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::empty_name - should panic ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_3 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_4 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_1 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_2 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_3 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_4 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_5 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_6 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_7 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_8 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_1 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_2 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_3 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_4 ... ok +test label::pair::tests::serialization_of_label_pair_to_prometheus::test_label_pair_serialization_to_prometheus ... ok +test label::set::tests::it_should_allow_displaying ... ok +test label::set::tests::it_should_allow_inserting_a_new_label_pair ... ok +test label::set::tests::it_should_allow_deserializing_from_json_as_an_array_of_label_objects ... ok +test label::set::tests::it_should_allow_instantiation_from_a_b_tree_map ... ok +test label::set::tests::it_should_allow_instantiation_from_a_label_pair ... ok +test label::set::tests::it_should_allow_instantiation_from_a_vec_of_label_pairs ... ok +test label::set::tests::it_should_allow_instantiation_from_an_array_of_label_pairs ... ok +test label::set::tests::it_should_allow_instantiation_from_array_of_str_tuples ... ok +test label::set::tests::it_should_allow_instantiation_from_array_of_string_tuples ... ok +test label::set::tests::it_should_allow_instantiation_from_vec_of_string_tuples ... ok +test label::set::tests::it_should_allow_serializing_to_json_as_an_array_of_label_objects ... ok +test label::set::tests::it_should_allow_instantiation_from_vec_of_serialized_label ... ok +test label::set::tests::it_should_allow_serializing_to_prometheus_format ... ok +test label::set::tests::it_should_allow_updating_a_label_value ... ok +test label::set::tests::it_should_allow_instantiation_from_vec_of_str_tuples ... ok +test label::set::tests::it_should_alphabetically_order_labels_in_prometheus_format ... ok +test label::set::tests::it_should_allow_iteration_over_label_pairs ... ok +test label::set::tests::it_should_be_allow_ordering ... ok +test label::set::tests::it_should_be_comparable ... ok +test label::set::tests::it_should_be_hashable ... ok +test label::set::tests::it_should_check_if_contains_specific_label_pair ... ok +test label::set::tests::it_should_check_if_empty ... ok +test label::set::tests::it_should_check_if_non_empty ... ok +test label::set::tests::it_should_create_an_empty_label_set ... ok +test label::set::tests::it_should_display_empty_label_set ... ok +test label::set::tests::it_should_handle_prometheus_format_with_special_characters ... ok +test label::set::tests::it_should_implement_clone ... ok +test label::set::tests::it_should_maintain_order_in_iteration ... ok +test label::set::tests::it_should_match_against_criteria ... ok +test label::set::tests::it_should_serialize_empty_label_set_to_prometheus_format ... ok +test label::set::tests::try_from_openmetrics_parser_label_set::it_should_convert_empty_label_set ... ok +test label::set::tests::try_from_openmetrics_parser_label_set::it_should_convert_label_set_with_known_labels ... ok +test label::set::tests::try_from_openmetrics_parser_label_set::it_should_return_label_conversion_error_for_empty_label_name ... ok +test label::value::tests::it_could_be_initialized_from_str ... ok +test label::value::tests::it_serializes_to_prometheus ... ok +test label::value::tests::it_should_allow_to_create_an_ignored_label_value ... ok +test label::value::tests::it_should_be_allow_ordering ... ok +test label::value::tests::it_should_be_comparable ... ok +test label::value::tests::it_should_be_converted_from_string ... ok +test label::value::tests::it_should_be_hashable ... ok +test label::value::tests::it_should_implement_clone ... ok +test label::value::tests::it_should_implement_display ... ok +test metric::aggregate::avg::tests::test_counter_cases ... ok +test metric::aggregate::avg::tests::test_gauge_cases ... ok +test metric::aggregate::sum::tests::test_counter_cases ... ok +test metric::description::tests::it_serializes_to_prometheus ... ok +test metric::aggregate::sum::tests::test_gauge_cases ... ok +test metric::description::tests::it_should_be_converted_from_string ... ok +test metric::description::tests::it_should_be_converted_from_str ... ok +test metric::description::tests::it_should_be_created_from_a_string_reference ... ok +test metric::description::tests::it_should_be_displayed ... ok +test metric::name::tests::serialization_of_metric_name_to_prometheus::empty_name - should panic ... ok +test metric::name::tests::serialization_of_metric_name_to_prometheus::names_that_need_changes_in_prometheus ... ok +test metric::name::tests::serialization_of_metric_name_to_prometheus::valid_names_in_prometheus ... ok +test metric::tests::for_counter_metrics::it_should_allow_incrementing_a_sample ... ok +test metric::tests::for_counter_metrics::it_should_allow_setting_to_an_absolute_value ... ok +test metric::tests::for_counter_metrics::it_should_be_created_from_its_name_and_a_collection_of_samples ... ok +test metric::tests::for_gauge_metrics::it_should_allow_decrement_a_sample ... ok +test metric::tests::for_gauge_metrics::it_should_allow_incrementing_a_sample ... ok +test metric::tests::for_gauge_metrics::it_should_allow_setting_a_sample ... ok +test metric::tests::for_generic_metrics::it_should_be_empty_when_it_does_not_have_any_sample ... ok +test metric::tests::for_gauge_metrics::it_should_be_created_from_its_name_and_a_collection_of_samples ... ok +test metric::tests::for_generic_metrics::it_should_return_zero_number_of_samples_for_an_empty_metric ... ok +test metric::tests::for_generic_metrics::it_should_return_the_number_of_samples ... ok +test metric::tests::for_prometheus_serialization::it_should_return_empty_string_for_prometheus_help_line_when_description_is_none ... ok +test metric::tests::for_prometheus_serialization::it_should_return_formatted_help_line_for_prometheus_when_description_is_some ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::nonexistent_metric ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_counter_with_different_values ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_counter_with_two_samples ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_gauge_with_negative_values ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_gauge_with_two_samples ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::nonexistent_counter_metric_returns_none ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::nonexistent_gauge_metric_returns_none ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::type_counter_with_two_samples ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::type_gauge_with_two_samples ... ok +test metric_collection::error::tests::it_should_be_cloneable ... ok +test metric_collection::error::tests::it_should_display_duplicate_metric_name_in_list ... ok +test metric_collection::error::tests::it_should_display_metric_name_collision_adding ... ok +test metric_collection::error::tests::it_should_display_metric_name_collision_in_constructor ... ok +test metric_collection::error::tests::it_should_display_metric_name_collision_in_merge ... ok +test metric_collection::kind_collection::tests::it_should_not_allow_merging_counter_metric_collections_with_name_collisions ... ok +test metric_collection::prometheus::tests::helper_functions::description_from_help_returns_none_for_empty_help ... ok +test metric_collection::kind_collection::tests::it_should_not_allow_merging_gauge_metric_collections_with_name_collisions ... ok +test metric_collection::prometheus::tests::helper_functions::description_from_help_returns_some_for_non_empty_help ... ok +test metric_collection::prometheus::tests::helper_functions::ensure_trailing_newline_returns_borrowed_when_input_has_newline ... ok +test metric_collection::prometheus::tests::helper_functions::ensure_trailing_newline_returns_owned_when_input_missing_newline ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_classify_duplicate_metric_names_as_collection_errors ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_accept_a_counter_value_that_is_a_whole_number_float ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_deserialize_a_counter_metric_from_prometheus_text ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_deserialize_a_gauge_metric_from_prometheus_text ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_reject_a_float_counter_value_equal_to_first_unrepresentable_u64 ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_reject_fractional_counter_values ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_return_parse_error_for_malformed_input ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_return_unknown_type_error_when_no_type_declaration_is_present ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_return_unsupported_type_for_histogram ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_use_fallback_timestamp_when_sample_has_no_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_convert_a_fractional_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_round_trip_serialize_then_deserialize_prometheus_text ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_convert_a_whole_second_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_convert_zero_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_handle_nanosecond_boundary_overflow ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_nan ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_negative_infinity ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_negative_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_positive_infinity ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_when_timestamp_would_overflow_u64_seconds ... ok +test metric_collection::prometheus::tests::stage3_conversion::try_from_parsed_exposition_should_convert_counter_family ... ok +test metric_collection::prometheus::tests::stage3_conversion::from_prometheus_and_stage3_try_from_should_produce_same_output ... ok +test metric_collection::serde::tests::it_should_allow_deserializing_an_empty_json_array ... ok +test metric_collection::prometheus::tests::stage3_conversion::try_from_parsed_exposition_should_reject_unsupported_histogram ... ok +test metric_collection::serde::tests::it_should_allow_serializing_an_empty_collection_to_json ... ok +test metric_collection::serde::tests::it_should_allow_deserializing_from_json ... ok +test metric_collection::serde::tests::it_should_fail_deserializing_json_with_cross_type_name_collision ... ok +test metric_collection::serde::tests::it_should_allow_serializing_to_json ... ok +test metric_collection::serde::tests::it_should_fail_deserializing_json_with_duplicate_counter_names ... ok +test metric_collection::serde::tests::it_should_fail_deserializing_json_with_unknown_metric_type ... ok +test metric_collection::serde::tests::it_should_use_a_correct_sequence_length_hint_when_serializing ... ok +test metric_collection::tests::for_counters::it_should_allow_describing_a_counter_before_using_it ... ok +test metric_collection::tests::for_counters::it_should_allow_setting_to_an_absolute_value ... ok +test metric_collection::tests::for_counters::it_should_automatically_create_a_counter_when_increasing_if_it_does_not_exist ... ok +test metric_collection::tests::for_counters::it_should_fail_setting_to_an_absolute_value_if_a_gauge_with_the_same_name_exists ... ok +test metric_collection::tests::for_counters::it_should_increase_a_preexistent_counter ... ok +test metric_collection::tests::for_counters::it_should_not_allow_duplicate_metric_names_when_instantiating ... ok +test metric_collection::tests::for_gauges::it_should_allow_decrementing_a_gauge ... ok +test metric_collection::tests::for_gauges::it_should_allow_describing_a_gauge_before_using_it ... ok +test metric_collection::tests::for_gauges::it_should_allow_incrementing_a_gauge ... ok +test metric_collection::tests::for_gauges::it_should_automatically_create_a_gauge_when_setting_if_it_does_not_exist ... ok +test metric_collection::tests::for_gauges::it_should_fail_decrementing_a_gauge_if_it_exists_a_counter_with_the_same_name ... ok +test metric_collection::tests::for_gauges::it_should_fail_incrementing_a_gauge_if_it_exists_a_counter_with_the_same_name ... ok +test metric_collection::tests::for_gauges::it_should_not_allow_duplicate_metric_names_when_instantiating ... ok +test metric_collection::tests::for_gauges::it_should_set_a_preexistent_gauge ... ok +test metric_collection::tests::it_should_allow_merging_metric_collections ... ok +test metric_collection::tests::it_should_allow_serializing_to_prometheus_format ... ok +test metric_collection::tests::it_should_exclude_metrics_without_samples_from_prometheus_format ... ok +test metric_collection::tests::it_should_allow_serializing_to_prometheus_format_with_multiple_samples_per_metric ... ok +test metric_collection::tests::it_should_not_allow_creating_a_counter_with_the_same_name_as_a_gauge ... ok +test metric_collection::tests::it_should_not_allow_creating_a_gauge_with_the_same_name_as_a_counter ... ok +test metric_collection::tests::it_should_not_allow_duplicate_names_across_types ... ok +test metric_collection::tests::it_should_not_allow_merging_metric_collections_with_name_collisions_for_different_metric_types ... ok +test metric_collection::tests::it_should_not_allow_merging_metric_collections_with_name_collisions_for_the_same_metric_types ... ok +test sample::tests::for_counter_type_sample::it_should_allow_a_counter_type_value ... ok +test sample::tests::for_counter_type_sample::it_should_allow_exporting_to_prometheus_format ... ok +test sample::tests::for_counter_type_sample::it_should_allow_exporting_to_prometheus_format_with_empty_label_set ... ok +test sample::tests::for_counter_type_sample::it_should_allow_incrementing_the_counter ... ok +test sample::tests::for_counter_type_sample::it_should_record_the_latest_update_time_when_the_counter_is_incremented ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_a_counter_type_value ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_decrementing_the_value ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_exporting_to_prometheus_format ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_exporting_to_prometheus_format_with_empty_label_set ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_incrementing_the_value ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_setting_a_value ... ok +test sample::tests::for_gauge_type_sample::it_should_record_the_latest_update_time_when_the_counter_is_incremented ... ok +test sample::tests::it_should_allow_converting_sample_into_label_set_and_measurement ... ok +test sample::tests::it_should_allow_creating_measurement_directly ... ok +test sample::tests::it_should_expose_measurement ... ok +test sample::tests::it_should_have_a_value ... ok +test sample::tests::it_should_include_a_label_set ... ok +test sample::tests::it_should_record_the_latest_update_time ... ok +test sample::tests::serialization_to_json::test_invalid_update_datetime_deserialization ... ok +test sample::tests::serialization_to_json::test_invalid_update_timestamp_serialization ... ok +test sample::tests::serialization_to_json::test_rfc3339_serialization_format_for_update_time ... ok +test sample::tests::serialization_to_json::test_serialization_round_trip ... ok +test sample::tests::serialization_to_json::test_serialization_round_trip_with_pretty_formatter ... ok +test sample::tests::serialization_to_json::test_update_datetime_high_precision_nanoseconds ... ok +test sample_collection::tests::for_counters::it_should_allow_increment_the_counter_for_a_non_existent_label_set ... ok +test sample_collection::tests::for_counters::it_should_allow_setting_absolute_value_for_a_counter ... ok +test sample_collection::tests::for_counters::it_should_allow_setting_absolute_value_for_existing_counter ... ok +test sample_collection::tests::for_counters::it_should_increment_the_counter_for_a_preexisting_label_set ... ok +test sample_collection::tests::for_counters::it_should_increment_the_counter_for_multiple_labels ... ok +test sample_collection::tests::for_counters::it_should_update_the_latest_update_time_when_incremented ... ok +test sample_collection::tests::for_counters::it_should_update_time_when_setting_absolute_value ... ok +test sample_collection::tests::for_gauges::it_should_allow_decrementing_the_gauge ... ok +test sample_collection::tests::for_gauges::it_should_allow_incrementing_the_gauge ... ok +test sample_collection::tests::for_gauges::it_should_allow_setting_the_gauge_for_a_non_existent_label_set ... ok +test sample_collection::tests::for_gauges::it_should_allow_setting_the_gauge_for_a_preexisting_label_set ... ok +test sample_collection::tests::for_gauges::it_should_allow_setting_the_gauge_for_multiple_labels ... ok +test sample_collection::tests::for_gauges::it_should_create_a_default_gauge_when_decrementing_a_nonexistent_label_set ... ok +test sample_collection::tests::for_gauges::it_should_update_the_latest_update_time_when_setting ... ok +test sample_collection::tests::it_should_allow_iterating_samples ... ok +test sample_collection::tests::it_should_fail_trying_to_create_a_sample_collection_with_duplicate_label_sets ... ok +test sample_collection::tests::it_should_indicate_is_it_is_empty ... ok +test sample_collection::tests::it_should_return_a_sample_searching_by_label_set_with_one_empty_label_set ... ok +test sample_collection::tests::it_should_return_a_sample_searching_by_label_set_with_two_label_sets ... ok +test sample_collection::tests::it_should_return_the_number_of_samples_in_the_collection ... ok +test sample_collection::tests::it_should_return_zero_number_of_samples_when_empty ... ok +test sample_collection::tests::json_serialization::it_should_be_serializable_and_deserializable_for_json_format ... ok +test sample_collection::tests::json_serialization::it_should_fail_deserializing_from_json_with_duplicate_label_sets ... ok +test sample_collection::tests::prometheus_serialization::it_should_be_exportable_to_prometheus_format ... ok +test sample_collection::tests::prometheus_serialization::it_should_be_exportable_to_prometheus_format_when_empty ... ok +test unit::tests::it_should_deserialize_count_from_snake_case ... ok +test unit::tests::it_should_implement_clone_copy_eq_hash_debug ... ok +test unit::tests::it_should_round_trip_all_variants ... ok +test unit::tests::it_should_serialize_count_to_snake_case ... ok + +test result: ok. 260 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 14 tests +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_1 ... ok +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_2 ... ok +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_3 ... ok +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_4 ... ok +test service_binding::tests::the_service_binding::should_always_have_a_corresponding_unique_url::case_1 ... ok +test service_binding::tests::the_service_binding::should_always_have_a_corresponding_unique_url::case_2 ... ok +test service_binding::tests::the_service_binding::should_always_have_a_corresponding_unique_url::case_3 ... ok +test service_binding::tests::the_service_binding::should_be_converted_into_an_url ... ok +test service_binding::tests::the_service_binding::should_not_allow_undefined_port_zero ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address_plain_type_for_ipv4_ips ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address_plain_type_for_ipv6_ips ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address_v4_mapped_v7_type_for_ipv4_ips_mapped_to_ipv6 ... ok +test service_binding::tests::the_service_binding::should_return_the_corresponding_url ... ok + +test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 53 tests +test bootstrap::jobs::manager::tests::it_should_wait_for_all_jobs_to_finish ... ok +test bootstrap::jobs::manager::tests::it_should_log_when_a_job_panics ... ok +test console::ci::e2e::logs_parser::tests::it_should_replace_wildcard_ip_with_localhost ... ok +test bootstrap::config::tests::it_should_load_with_default_config ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_embed_raw_bytes_verbatim ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_embed_raw_inner_dict_inside_outer_dict ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_byte_string ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_dictionary_with_keys_sorted_lexicographically ... ok +test console::ci::e2e::logs_parser::tests::it_should_ignore_logs_with_no_matching_lines ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_negative_integer ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_positive_integer ... ok +test console::ci::e2e::logs_parser::tests::it_should_support_colored_output ... ok +test console::ci::e2e::logs_parser::tests::it_should_parse_multiple_services ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_an_empty_byte_string ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_an_empty_dictionary ... ok +test console::ci::e2e::logs_parser::tests::it_should_parse_from_logs_with_valid_logs ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_zero ... ok +test console::ci::qbittorrent_e2e::qbittorrent::client::tests::it_should_extract_sid_cookie_when_present ... ok +test console::ci::qbittorrent_e2e::qbittorrent::client::tests::it_should_return_none_when_sid_cookie_is_missing ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_deserialize_torrent_state_known_variant ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_deserialize_unknown_torrent_state_preserving_raw_value ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_display_known_and_unknown_torrent_state_values ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_report_torrent_progress_completion_threshold ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_payload_bytes_with_a_repeating_pattern ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_payload_bytes_with_the_right_length ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_payload_bytes_wrapping_around_the_pattern ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_torrent_bytes_as_a_valid_bencode_dictionary ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_embed_the_announce_url_verbatim_in_the_torrent_bytes ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_embed_the_info_dict_raw_so_it_appears_as_a_nested_bencode_dict ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_a_40_character_lowercase_hex_info_hash ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_a_different_info_hash_when_only_the_payload_changes ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_deterministic_torrent_bytes_for_identical_inputs ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_different_torrent_bytes_for_different_payloads ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_the_same_info_hash_regardless_of_the_announce_url ... ok +test console::ci::qbittorrent_e2e::types::compose_project_name::tests::it_should_generate_expected_shape ... ok +test console::ci::qbittorrent_e2e::types::container_path::tests::it_should_build_from_new_and_format_as_string ... ok +test console::ci::qbittorrent_e2e::types::container_path::tests::it_should_convert_from_string_and_str ... ok +test console::ci::qbittorrent_e2e::types::deadline::tests::it_should_round_trip_duration ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_build_from_new_and_format_as_string ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_convert_from_string_and_str ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_implement_as_ref_path ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_reject_backslash ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_reject_double_dot ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_reject_forward_slash ... ok +test console::ci::qbittorrent_e2e::types::info_hash::tests::it_should_construct_info_hash_and_expose_accessors ... ok +test console::ci::qbittorrent_e2e::types::info_hash::tests::it_should_deserialize_info_hash_from_json_string ... ok +test console::ci::qbittorrent_e2e::types::payload_size::tests::it_should_round_trip_payload_size ... ok +test console::ci::qbittorrent_e2e::types::piece_length::tests::it_should_round_trip_piece_length ... ok +test console::ci::qbittorrent_e2e::types::poll_interval::tests::it_should_round_trip_duration ... ok +test console::ci::qbittorrent_e2e::types::qbittorrent_image::tests::it_should_round_trip_image_string ... ok +test console::ci::qbittorrent_e2e::types::tracker_image::tests::it_should_round_trip_image_string ... ok +test bootstrap::jobs::http_tracker::tests::it_should_start_http_tracker ... ok +test bootstrap::jobs::tracker_apis::tests::it_should_start_http_tracker ... ok + +test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test servers::api::contract::stats::the_stats_api_endpoint_should_return_the_global_stats ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 7 tests +test server::contract::health_check_endpoint_should_return_status_ok_when_there_is_no_services_registered ... ok +test server::contract::http::it_should_return_good_health_for_http_service ... ok +test server::contract::udp::it_should_return_good_health_for_udp_service ... ok +test server::contract::api::it_should_return_error_when_api_service_was_stopped_after_registration ... ok +test server::contract::api::it_should_return_good_health_for_api_service ... ok +test server::contract::http::it_should_return_error_when_http_service_was_stopped_after_registration ... ok +test server::contract::udp::it_should_return_error_when_udp_service_was_stopped_after_registration ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.05s + + +running 21 tests +test v1::extractors::announce_request::tests::it_should_extract_the_announce_request_from_the_url_query_params ... ok +test v1::extractors::announce_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed_into_an_announce_request ... ok +test v1::extractors::announce_request::tests::it_should_reject_a_request_without_query_params ... ok +test v1::extractors::scrape_request::tests::it_should_extract_the_scrape_request_from_the_url_query_params_with_more_than_one_info_hash ... ok +test v1::extractors::announce_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed ... ok +test v1::extractors::scrape_request::tests::it_should_extract_the_scrape_request_from_the_url_query_params ... ok +test v1::extractors::authentication_key::tests::it_should_return_an_authentication_error_if_the_key_cannot_be_parsed ... ok +test v1::extractors::scrape_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed ... ok +test v1::extractors::scrape_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed_into_a_scrape_request ... ok +test v1::extractors::scrape_request::tests::it_should_reject_a_request_without_query_params ... ok +test v1::handlers::scrape::tests::with_tracker_in_listed_mode::it_should_return_zeroed_swarm_metadata_when_the_torrent_is_not_whitelisted ... ok +test v1::handlers::scrape::tests::with_tracker_in_private_mode::it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_invalid ... ok +test v1::handlers::scrape::tests::with_tracker_in_private_mode::it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing ... ok +test v1::handlers::scrape::tests::with_tracker_on_reverse_proxy::it_should_fail_when_the_right_most_x_forwarded_for_header_ip_is_not_available ... ok +test v1::handlers::scrape::tests::with_tracker_not_on_reverse_proxy::it_should_fail_when_the_client_ip_from_the_connection_info_is_not_available ... ok +test v1::handlers::announce::tests::with_tracker_on_reverse_proxy::it_should_fail_when_the_right_most_x_forwarded_for_header_ip_is_not_available ... ok +test v1::handlers::announce::tests::with_tracker_not_on_reverse_proxy::it_should_fail_when_the_client_ip_from_the_connection_info_is_not_available ... ok +test v1::handlers::announce::tests::with_tracker_in_listed_mode::it_should_fail_when_the_announced_torrent_is_not_whitelisted ... ok +test v1::handlers::announce::tests::with_tracker_in_private_mode::it_should_fail_when_the_authentication_key_is_missing ... ok +test v1::handlers::announce::tests::with_tracker_in_private_mode::it_should_fail_when_the_authentication_key_is_invalid ... ok +test server::tests::it_should_be_able_to_start_and_stop ... ok + +test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + +running 52 tests +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::it_should_start_and_stop ... ok +test server::v1::contract::environment_should_be_started_and_stopped ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_url_query_parameters_are_invalid ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_fail_if_the_key_query_param_cannot_be_parsed ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_return_the_real_file_stats_when_the_client_is_authenticated ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_return_the_zeroed_file_when_the_client_is_not_authenticated ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_fail_if_the_peer_cannot_be_authenticated_with_the_provided_key ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_url_query_component_is_empty ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_assign_to_the_peer_ip_the_remote_client_ip_instead_of_the_peer_address_in_the_request_param ... ok +test server::v1::contract::for_all_config_modes::and_running_on_reverse_proxy::should_fail_when_the_http_request_does_not_include_the_xff_http_request_header ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_fail_if_the_peer_has_not_provided_the_authentication_key ... ok +test server::v1::contract::configured_as_whitelisted::and_receiving_an_announce_request::should_fail_if_the_torrent_is_not_in_the_whitelist ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_increase_the_number_of_tcp4_announce_requests_handled_in_statistics ... ok +test server::v1::contract::configured_as_whitelisted::and_receiving_an_announce_request::should_allow_announcing_a_whitelisted_torrent ... ok +test server::v1::contract::for_all_config_modes::and_running_on_reverse_proxy::should_fail_when_the_xff_http_request_header_contains_an_invalid_ip ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_return_the_zeroed_file_when_the_authentication_key_provided_by_the_client_is_invalid ... ok +test server::v1::contract::configured_as_whitelisted::receiving_an_scrape_request::should_return_the_zeroed_file_when_the_requested_file_is_not_whitelisted ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_respond_to_authenticated_peers ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_fail_if_the_key_query_param_cannot_be_parsed ... ok +test server::v1::contract::configured_as_whitelisted::receiving_an_scrape_request::should_return_the_file_stats_when_the_requested_file_is_whitelisted ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_consider_two_peers_to_be_the_same_when_they_have_the_same_socket_address_even_if_the_peer_id_is_different ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_left_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_port_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::health_check_endpoint_should_return_ok_if_the_http_tracker_is_running ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_uploaded_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_downloaded_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_numwant_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_not_fail_when_the_peer_address_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_increase_the_number_of_tcp6_announce_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_peer_id_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_a_mandatory_field_is_missing ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_compact_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_not_increase_the_number_of_tcp6_announce_requests_handled_if_the_client_is_not_using_an_ipv6_ip ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_event_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_no_peers_if_the_announced_peer_is_the_first_one ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_info_hash_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_not_return_the_compact_response_by_default ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_the_list_of_previously_announced_peers ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_the_compact_response ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_respond_if_only_the_mandatory_fields_are_provided ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::when_the_client_ip_is_a_loopback_ipv6_it_should_assign_to_the_peer_ip_the_external_ip_in_the_tracker_configuration ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_return_the_file_with_the_complete_peer_when_there_is_one_peer_with_no_bytes_pending_to_download ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_the_list_of_previously_announced_peers_including_peers_using_ipv4_and_ipv6 ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_fail_when_the_request_is_empty ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_accept_multiple_infohashes ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_increase_the_number_ot_tcp6_scrape_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_increase_the_number_ot_tcp4_scrape_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_return_the_file_with_the_incomplete_peer_when_there_is_one_peer_with_bytes_pending_to_download ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::when_the_client_ip_is_a_loopback_ipv4_it_should_assign_to_the_peer_ip_the_external_ip_in_the_tracker_configuration ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::when_the_tracker_is_behind_a_reverse_proxy_it_should_assign_to_the_peer_ip_the_ip_in_the_x_forwarded_for_http_header ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_return_a_file_with_zeroed_values_when_there_are_no_peers ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_fail_when_the_info_hash_param_is_invalid ... ok + +test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s + + +running 7 tests +test v1::context::auth_key::resources::tests::it_should_be_convertible_from_an_auth_key ... ok +test v1::context::auth_key::resources::tests::it_should_be_convertible_into_an_auth_key ... ok +test v1::context::torrent::resources::torrent::tests::torrent_resource_list_item_should_be_converted_from_the_basic_torrent_info ... ok +test v1::context::auth_key::resources::tests::it_should_be_convertible_into_json ... ok +test v1::context::torrent::resources::torrent::tests::torrent_resource_should_be_converted_from_torrent_info ... ok +test v1::context::stats::resources::tests::stats_resource_should_be_converted_from_tracker_metrics ... ok +test server::tests::it_should_be_able_to_start_and_stop ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s + + +running 53 tests +test server::v1::contract::context::health_check::health_check_endpoint_should_return_status_ok_if_api_is_running ... ok +test server::v1::contract::context::stats::should_allow_getting_tracker_statistics ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_authentication_header::it_should_authenticate_requests_when_the_token_is_provided_in_the_authentication_header ... ok +test server::v1::contract::context::auth_key::should_fail_generating_a_new_auth_key_when_the_key_duration_is_invalid ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_not_authenticate_requests_when_the_token_is_empty ... ok +test server::v1::contract::authentication::given_that_not_token_is_provided::it_should_not_authenticate_requests_when_the_token_is_missing ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_fail_generating_a_new_auth_key_when_the_key_duration_is_invalid ... ok +test server::v1::contract::context::stats::should_not_allow_getting_tracker_statistics_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_allow_getting_a_torrent_info ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_not_allow_generating_a_new_auth_key_for_unauthenticated_users ... ok +test server::v1::contract::context::auth_key::should_allow_generating_a_new_random_auth_key ... ok +test server::v1::contract::context::auth_key::should_not_allow_deleting_an_auth_key_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_allow_getting_all_torrents ... ok +test server::v1::contract::context::auth_key::should_allow_deleting_an_auth_key ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_allow_generating_a_new_auth_key ... ok +test server::v1::contract::context::auth_key::should_allow_uploading_a_preexisting_auth_key ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_not_authenticate_requests_when_the_token_is_invalid ... ok +test server::v1::contract::context::auth_key::should_not_allow_generating_a_new_auth_key_for_unauthenticated_users ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_authentication_header::it_should_not_authenticate_requests_when_the_token_is_empty ... ok +test server::v1::contract::context::torrent::should_allow_getting_a_list_of_torrents_providing_infohashes ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_authentication_header::it_should_not_authenticate_requests_when_the_token_is_invalid ... ok +test server::v1::contract::context::auth_key::should_allow_reloading_keys ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_authenticate_requests_when_the_token_is_provided_as_a_query_param ... ok +test server::v1::contract::authentication::given_that_token_is_provided_via_get_param_and_authentication_header::it_should_authenticate_requests_using_the_token_provided_in_the_authentication_header ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_allow_the_token_query_param_to_be_at_any_position_in_the_url_query ... ok +test server::v1::contract::context::auth_key::should_fail_when_keys_cannot_be_reloaded ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_fail_when_the_auth_key_cannot_be_generated ... ok +test server::v1::contract::context::auth_key::should_fail_when_the_auth_key_cannot_be_generated ... ok +test server::v1::contract::context::auth_key::should_not_allow_reloading_keys_for_unauthenticated_users ... ok +test server::v1::contract::context::auth_key::should_fail_when_the_auth_key_cannot_be_deleted ... ok +test server::v1::contract::context::auth_key::should_fail_deleting_an_auth_key_when_the_key_id_is_invalid ... ok +test server::v1::contract::context::auth_key::should_fail_generating_a_new_auth_key_when_the_provided_key_is_invalid ... ok +test server::v1::contract::context::torrent::should_allow_the_torrents_result_pagination ... ok +test server::v1::contract::context::torrent::should_allow_limiting_the_torrents_in_the_result ... ok +test server::v1::contract::context::whitelist::should_allow_whitelisting_a_torrent ... ok +test server::v1::contract::context::whitelist::should_not_fail_trying_to_remove_a_non_whitelisted_torrent_from_the_whitelist ... ok +test server::v1::contract::context::whitelist::should_allow_removing_a_torrent_from_the_whitelist ... ok +test server::v1::contract::context::torrent::should_not_allow_getting_torrents_for_unauthenticated_users ... ok +test server::v1::contract::context::whitelist::should_allow_reload_the_whitelist_from_the_database ... ok +test server::v1::contract::context::torrent::should_not_allow_getting_a_torrent_info_for_unauthenticated_users ... ok +test server::v1::contract::context::whitelist::should_allow_whitelisting_a_torrent_that_has_been_already_whitelisted ... ok +test server::v1::contract::context::torrent::should_fail_while_getting_a_torrent_info_when_the_torrent_does_not_exist ... ok +test server::v1::contract::context::whitelist::should_not_allow_whitelisting_a_torrent_for_unauthenticated_users ... ok +test server::v1::contract::context::whitelist::should_fail_when_the_torrent_cannot_be_whitelisted ... ok +test server::v1::contract::context::whitelist::should_fail_when_the_torrent_cannot_be_removed_from_the_whitelist ... ok +test server::v1::contract::context::torrent::should_fail_getting_torrents_when_the_limit_query_parameter_cannot_be_parsed ... ok +test server::v1::contract::context::whitelist::should_not_allow_removing_a_torrent_from_the_whitelist_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_fail_getting_torrents_when_the_offset_query_parameter_cannot_be_parsed ... ok +test server::v1::contract::context::whitelist::should_fail_when_the_whitelist_cannot_be_reloaded_from_the_database ... ok +test server::v1::contract::context::torrent::should_fail_getting_torrents_when_the_info_hash_parameter_is_invalid ... ok +test server::v1::contract::context::whitelist::should_fail_whitelisting_a_torrent_when_the_provided_infohash_is_invalid ... ok +test server::v1::contract::context::whitelist::should_fail_removing_a_torrent_from_the_whitelist_when_the_provided_infohash_is_invalid ... ok +test server::v1::contract::context::torrent::should_fail_getting_a_torrent_info_when_the_provided_infohash_is_invalid ... ok + +test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.35s + + +running 2 tests +test tsl::tests::it_should_error_on_missing_cert_or_key_paths ... ok +test tsl::tests::it_should_error_on_bad_tls_config ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 46 tests +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::health_checks::it_should_fail_when_a_health_check_http_url_is_invalid ... ok +test console::clients::checker::checks::udp::tests::it_should_resolve_the_socket_address_for_udp_scheme_urls_containing_a_domain ... ok +test console::clients::checker::checks::udp::tests::it_should_resolve_the_socket_address_for_udp_scheme_urls_containing_an_ip ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::http_trackers::it_should_allow_the_url_to_contain_an_empty_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::http_trackers::it_should_allow_the_url_to_contain_a_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_add_the_udp_scheme_to_the_udp_url_when_it_is_missing ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::http_trackers::it_should_fail_when_a_tracker_http_url_is_invalid ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_allow_the_url_to_have_an_empty_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_allow_using_domains ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_allow_the_url_to_contain_a_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_fail_when_a_tracker_udp_url_is_invalid ... ok +test console::clients::checker::config::tests::configuration_should_be_build_from_plain_serializable_configuration ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_invalid_url_and_include_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_malformed_json_and_include_serde_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_missing_field_and_include_serde_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_trailing_comma_and_include_serde_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_succeed_with_valid_json ... ok +test console::clients::checker::error::tests::config_source_env_var_displays_as_variable_name ... ok +test console::clients::checker::error::tests::config_source_file_displays_as_path ... ok +test console::clients::checker::error::tests::invalid_config_error_from_file_includes_path_in_json ... ok +test console::clients::checker::error::tests::invalid_config_error_json_contains_expected_fields ... ok +test console::clients::checker::error::tests::invalid_config_error_json_escapes_special_characters ... ok +test console::clients::checker::error::tests::invalid_config_error_produces_exit_code_2 ... ok +test console::clients::checker::error::tests::runtime_error_json_contains_expected_fields ... ok +test console::clients::checker::error::tests::runtime_error_produces_exit_code_1 ... ok +test console::clients::checker::logger::tests::should_capture_the_clear_screen_command ... ok +test console::clients::checker::logger::tests::should_capture_the_print_command_output ... ok +test console::clients::checker::monitor::udp::tests::it_should_compute_integer_average_for_successful_probes ... ok +test console::clients::checker::monitor::udp::tests::it_should_compute_timeout_percent_as_integer ... ok +test console::clients::checker::monitor::udp::tests::it_should_return_all_null_latency_fields_when_every_probe_times_out ... ok +test console::clients::checker::monitor::udp::tests::it_should_return_none_average_when_there_are_no_successful_probes ... ok +test console::clients::http::app::tests::it_accepts_direct_validation_for_plain_base_url ... ok +test console::clients::http::app::tests::it_accepts_tracker_url_with_path_and_without_query_or_fragment ... ok +test console::clients::http::app::tests::it_rejects_tracker_url_with_fragment ... ok +test console::clients::http::app::tests::it_rejects_tracker_url_with_query ... ok +test console::clients::http::app::tests::it_should_serialize_compact_json ... ok +test console::clients::http::app::tests::it_should_serialize_pretty_json ... ok +test console::clients::udp::responses::json::tests::it_should_serialize_compact_json_when_pretty_is_false ... ok +test console::clients::udp::responses::json::tests::it_should_serialize_pretty_json_when_pretty_is_true ... ok +test console::clients::udp::tests::it_should_display_the_inner_udp_parse_error_for_announce_responses ... ok +test console::clients::unified::http::tests::it_accepts_direct_validation_for_plain_base_url ... ok +test console::clients::unified::http::tests::it_accepts_tracker_url_with_path_and_without_query_or_fragment ... ok +test console::clients::unified::http::tests::it_rejects_tracker_url_with_fragment ... ok +test console::clients::unified::http::tests::it_rejects_tracker_url_with_query ... ok +test console::clients::unified::http::tests::it_should_serialize_json_output ... ok +test console::clients::unified::http::tests::it_should_serialize_text_output_as_pretty_json ... ok + +test result: ok. 46 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 10 tests +test configuration::invalid_configuration_from_file::it_should_exit_with_code_2_on_invalid_json_in_file ... ok +test configuration::invalid_configuration_from_env_var::it_should_exit_with_code_2_on_invalid_json ... ok +test configuration::invalid_configuration_from_file::it_should_include_file_path_in_stderr_source_field ... ok +test configuration::invalid_configuration_from_env_var::it_should_include_parse_detail_in_stderr_error_message_on_trailing_comma ... ok +test configuration::no_configuration_provided::it_should_exit_with_code_2_when_no_config_is_provided ... ok +test configuration::invalid_configuration_from_env_var::it_should_produce_no_output_on_stdout_on_config_error ... ok +test configuration::no_configuration_provided::it_should_write_json_error_to_stderr_when_no_config_is_provided ... ok +test configuration::invalid_configuration_from_env_var::it_should_write_json_error_to_stderr_on_invalid_json ... ok +test configuration::invalid_configuration_from_file::it_should_exit_with_code_2_when_config_file_does_not_exist ... ok +test monitor::it_should_emit_monitor_probe_events_to_stderr_and_summary_to_stdout ... ok + +test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.09s + + +running 3 tests +test it_should_fail_udp_scrape_for_invalid_infohash ... ok +test it_should_show_unified_subcommands_in_help ... ok +test it_should_fail_http_announce_for_invalid_infohash ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 12 tests +test http::tests::it_should_encode_a_20_byte_array ... ok +test peer_id::tests::default_test_peer_id_should_use_rc_prefix_and_3000_version ... ok +test peer_id::tests::default_production_peer_id_should_be_stable_within_a_process ... ok +test udp::tests::it_should_display_unrecognized_udp_tracker_response_without_debug_noise ... ok +test http::client::tests::it_keeps_existing_scrape_path_unchanged ... ok +test http::client::tests::it_does_not_append_auth_key_when_path_already_ends_with_same_key ... ok +test http::client::tests::it_uses_announce_for_base_url_without_trailing_slash ... ok +test http::client::tests::it_appends_auth_key_to_existing_announce_path ... ok +test http::client::tests::it_keeps_existing_announce_path_unchanged ... ok +test http::client::tests::it_keeps_custom_path_unchanged_for_announce ... ok +test http::client::tests::it_uses_announce_for_base_url_with_trailing_slash ... ok +test http::client::tests::it_uses_scrape_for_base_url_without_trailing_slash ... ok + +test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + +running 12 tests +test v2_0_0::database::tests::it_should_allow_masking_the_mysql_user_password ... ok +test v2_0_0::database::tests::it_should_allow_masking_the_postgresql_user_password ... ok +test v2_0_0::tests::configuration_should_contain_the_external_ip ... ok +test v2_0_0::tests::configuration_should_have_default_values ... ok +test v2_0_0::tests::configuration_should_be_saved_in_a_toml_config_file ... ok +test v2_0_0::tracker_api::tests::default_http_api_configuration_should_not_contains_any_token ... ok +test v2_0_0::tracker_api::tests::http_api_configuration_should_allow_adding_tokens ... ok +test v2_0_0::tests::configuration_should_allow_to_overwrite_the_default_tracker_api_token_for_admin_with_an_env_var ... ok +test v2_0_0::tests::configuration_should_use_the_default_values_when_only_the_mandatory_options_are_provided_by_the_user_via_toml_content ... ok +test v2_0_0::tests::configuration_should_use_the_default_values_when_only_the_mandatory_options_are_provided_by_the_user_via_toml_file ... ok +test v2_0_0::tests::default_configuration_could_be_overwritten_from_a_single_env_var_with_toml_contents ... ok +test v2_0_0::tests::default_configuration_could_be_overwritten_from_a_toml_config_file ... ok + +test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 41 tests +test mutable::bencode_mut::test::positive_bytes_encode ... ok +test mutable::bencode_mut::test::positive_empty_dict_encode ... ok +test mutable::bencode_mut::test::positive_empty_list_encode ... ok +test mutable::bencode_mut::test::positive_int_encode ... ok +test mutable::bencode_mut::test::positive_nonempty_dict_encode ... ok +test mutable::bencode_mut::test::positive_nonempty_list_encode ... ok +test reference::bencode_ref::tests::positive_bytes_buffer ... ok +test reference::bencode_ref::tests::positive_dict_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_bytes_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_dict_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_int_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_list_buffer ... ok +test reference::bencode_ref::tests::positive_int_buffer ... ok +test reference::bencode_ref::tests::positive_list_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_bytes_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_dict_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_int_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_list_buffer ... ok +test reference::decode::tests::negative_decode_bytes_extra - should panic ... ok +test reference::decode::tests::negative_decode_bytes_not_utf8 ... ok +test reference::decode::tests::negative_decode_bytes_neg_len - should panic ... ok +test reference::decode::tests::negative_decode_dict_dup_keys_diff_data - should panic ... ok +test reference::decode::tests::negative_decode_dict_dup_keys_same_data - should panic ... ok +test reference::decode::tests::negative_decode_dict_unordered_keys - should panic ... ok +test reference::decode::tests::negative_decode_int_double_negative - should panic ... ok +test reference::decode::tests::negative_decode_int_double_zero - should panic ... ok +test reference::decode::tests::negative_decode_int_leading_zero - should panic ... ok +test reference::decode::tests::negative_decode_int_nan - should panic ... ok +test reference::decode::tests::negative_decode_int_negative_zero - should panic ... ok +test reference::decode::tests::positive_decode_bytes ... ok +test reference::decode::tests::positive_decode_bytes_utf8 ... ok +test reference::decode::tests::positive_decode_bytes_zero_len ... ok +test reference::decode::tests::positive_decode_dict ... ok +test reference::decode::tests::positive_decode_dict_unordered_keys ... ok +test reference::decode::tests::positive_decode_general ... ok +test reference::decode::tests::positive_decode_int ... ok +test reference::decode::tests::positive_decode_int_negative ... ok +test reference::decode::tests::positive_decode_int_zero ... ok +test reference::decode::tests::positive_decode_list ... ok +test reference::decode::tests::positive_decode_partial ... ok +test reference::decode::tests::positive_decode_recursion ... ok + +test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 2 tests +test positive_ben_list_macro ... ok +test positive_ben_map_macro ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +Testing bencode nested lists +Success + +Testing bencode multi kb +Success + + +running 124 tests +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_client_ip_is_a_ipv6_loopback_ip::it_should_use_the_external_ip_in_the_tracker_configuration_if_it_is_defined_even_if_the_external_ip_is_an_ipv4_ip ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_client_ip_is_a_ipv6_loopback_ip::it_should_use_the_external_ip_in_tracker_configuration_if_it_is_defined ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_the_client_ip_is_a_ipv4_loopback_ip::it_should_use_the_external_ip_in_the_tracker_configuration_if_it_is_defined_even_if_the_external_ip_is_an_ipv6_ip ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_client_ip_is_a_ipv6_loopback_ip::it_should_use_the_loopback_ip_if_the_tracker_does_not_have_the_external_ip_configuration ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_the_client_ip_is_a_ipv4_loopback_ip::it_should_use_the_external_tracker_ip_in_tracker_configuration_if_it_is_defined ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_the_client_ip_is_a_ipv4_loopback_ip::it_should_use_the_loopback_ip_if_the_tracker_does_not_have_the_external_ip_configuration ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::using_the_source_ip_instead_of_the_ip_in_the_announce_request ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_convert_the_peers_wanted_number_from_i32 ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_allow_limiting_the_peer_list ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_74_at_the_most_if_the_client_wants_them_all ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_the_maximin_number_of_peers_by_default ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_convert_the_peers_wanted_number_from_u32 ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_the_maximum_when_wanting_more_than_the_maximum ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_the_maximum_when_wanting_only_zero ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_fail_adding_a_pre_generated_key_when_there_is_a_database_error ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::randomly_generated::it_should_fail_adding_a_randomly_generated_key_when_there_is_a_database_error ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::randomly_generated::it_should_fail_adding_a_randomly_generated_key_when_there_is_a_database_error ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::pre_generated_keys::it_should_fail_adding_a_pre_generated_key_when_there_is_a_database_error ... ok +test authentication::key::peer_key::tests::key::should_be_parsed_from_an_string ... ok +test authentication::key::peer_key::tests::key::length_should_be_32 ... ok +test authentication::key::peer_key::tests::key::should_return_a_reference_to_the_inner_string ... ok +test authentication::key::peer_key::tests::peer_key::could_be_permanent ... ok +test authentication::key::peer_key::tests::peer_key::could_have_an_expiration_time ... ok +test authentication::key::peer_key::tests::peer_key::expiring::should_be_displayed_when_it_is_expiring ... ok +test authentication::key::peer_key::tests::peer_key::permanent::should_be_displayed_when_it_is_permanent ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::clear_all_peer_keys ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::get_a_new_peer_key_by_its_internal_key ... ok +test authentication::key::peer_key::tests::key::should_be_generated_randomly ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::insert_a_new_peer_key ... ok +test authentication::key::peer_key::tests::key::should_only_include_alphanumeric_chars ... ok +test authentication::key::tests::the_expiring_peer_key::should_be_displayed ... ok +test authentication::key::tests::the_expiring_peer_key::should_be_generated_with_a_expiration_time ... ok +test authentication::key::tests::the_key_verification_error::could_be_a_database_error ... ok +test authentication::key::tests::the_permanent_peer_key::should_be_displayed ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::remove_a_new_peer_key ... ok +test authentication::key::tests::the_expiring_peer_key::expiration_verification_should_fail_when_the_key_has_expired ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::reset_the_peer_keys_with_a_new_list_of_keys ... ok +test authentication::key::tests::the_permanent_peer_key::expiration_verification_should_always_succeed ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::but_the_key_expiration_check_is_disabled_by_configuration::it_should_authenticate_an_expired_registered_key ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_authenticate_a_registered_key ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_not_authenticate_a_registered_but_expired_key_by_default ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_not_authenticate_a_registered_but_expired_key_when_the_tracker_is_explicitly_configured_to_check_keys_expiration ... ok +test authentication::key::tests::the_permanent_peer_key::should_be_generated_without_expiration_time ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_not_authenticate_an_unregistered_key ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_public::it_should_always_authenticate_when_the_tracker_is_public ... ok +test databases::driver::mysql::tests::run_mysql_driver_tests ... ok +test databases::driver::postgres::tests::run_postgres_driver_tests ... ok +test databases::error::tests::it_should_build_a_database_error_from_a_sqlx_io_error ... ok +test databases::error::tests::it_should_build_a_database_error_from_a_sqlx_row_not_found_error ... ok +test databases::driver::sqlite::schema_migrator::tests::bootstrap_legacy_schema_should_be_a_noop_on_a_fresh_database ... ok +test error::tests::peer_key_error::duration_overflow ... ok +test error::tests::peer_key_error::parsing_from_string ... ok +test error::tests::peer_key_error::persisting_into_database ... ok +test error::tests::whitelist_error::torrent_not_whitelisted ... ok +test peer_tests::it_should_be_serializable ... ok +test scrape_handler::tests::it_should_allow_scraping_for_multiple_torrents ... ok +test scrape_handler::tests::it_should_return_a_zeroed_swarm_metadata_for_the_requested_file_if_the_tracker_does_not_have_that_torrent ... ok +test databases::driver::sqlite::schema_migrator::tests::bootstrap_legacy_schema_should_reject_partial_legacy_state ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_update_the_swarm_stats_for_the_torrent::when_a_previously_announced_started_peer_has_completed_downloading ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_update_the_swarm_stats_for_the_torrent::when_the_peer_is_a_leecher ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_update_the_swarm_stats_for_the_torrent::when_the_peer_is_a_seeder ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_return_the_announce_data_with_the_previously_announced_peers ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_return_the_announce_data_with_an_empty_peer_list_when_it_is_the_first_announced_peer ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_allow_peers_to_get_only_a_subset_of_the_peers_in_the_swarm ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::pre_generated_keys::it_should_fail_adding_a_pre_generated_key_when_the_key_is_invalid ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_fail_adding_a_pre_generated_key_when_the_key_duration_exceeds_the_maximum_duration ... ok +test torrent::services::tests::getting_a_torrent_info::it_should_return_none_if_the_tracker_does_not_have_the_torrent ... ok +test torrent::services::tests::getting_a_torrent_info::it_should_return_the_torrent_info_if_the_tracker_has_the_torrent ... ok +test torrent::services::tests::getting_basic_torrent_info_for_multiple_torrents_at_once::it_should_return_a_list_with_basic_info_about_the_requested_torrents ... ok +test torrent::services::tests::getting_basic_torrent_info_for_multiple_torrents_at_once::it_should_return_an_empty_list_if_none_of_the_requested_torrents_is_found ... ok +test torrent::services::tests::searching_for_torrents::it_should_allow_limiting_the_number_of_torrents_in_the_result ... ok +test torrent::services::tests::searching_for_torrents::it_should_allow_using_pagination_in_the_result ... ok +test torrent::services::tests::searching_for_torrents::it_should_return_a_summarized_info_for_all_torrents ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_fail_adding_a_pre_generated_key_when_the_key_is_invalid ... ok +test torrent::services::tests::searching_for_torrents::it_should_return_an_empty_result_if_the_tracker_does_not_have_any_torrent ... ok +test torrent::services::tests::searching_for_torrents::it_should_return_torrents_ordered_by_info_hash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_configured_as_listed::should_authorize_a_whitelisted_infohash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_configured_as_listed::should_not_authorize_a_non_whitelisted_infohash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_not_configured_as_listed::should_also_authorize_a_non_whitelisted_infohash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_not_configured_as_listed::should_authorize_a_whitelisted_infohash ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_add_a_pre_generated_key ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::it_should_generate_the_key ... ok +test whitelist::repository::in_memory::tests::should_allow_adding_a_new_torrent_to_the_whitelist ... ok +test whitelist::repository::in_memory::tests::should_allow_checking_if_an_infohash_is_whitelisted ... ok +test whitelist::repository::in_memory::tests::should_allow_clearing_the_whitelist ... ok +test whitelist::repository::in_memory::tests::should_allow_removing_a_new_torrent_to_the_whitelist ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::randomly_generated::it_should_add_a_randomly_generated_key ... ok +test databases::setup::tests::it_should_initialize_the_sqlite_database ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::randomly_generated::it_should_add_a_randomly_generated_key ... ok +test authentication::key::repository::persisted::tests::the_persisted_key_repository_should::remove_a_persisted_peer_key ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::pre_generated_keys::it_should_add_a_pre_generated_key ... ok +test authentication::key::repository::persisted::tests::the_persisted_key_repository_should::persist_a_new_peer_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::randomly_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_permanent_and::randomly_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::key::repository::persisted::tests::the_persisted_key_repository_should::load_all_persisted_peer_keys ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::pre_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::randomly_generated_keys::it_should_accept_an_expired_key_when_checking_expiration_is_disabled_in_configuration ... ok +test authentication::tests::the_tracker_configured_as_private::with_permanent_and::pre_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::pre_generated_keys::it_should_accept_an_expired_key_when_checking_expiration_is_disabled_in_configuration ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::randomly_generated::it_should_generate_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::it_should_remove_an_authentication_key ... ok +test authentication::tests::the_tracker_configured_as_private::it_should_load_authentication_keys_from_the_database ... ok +test statistics::persisted::downloads::tests::it_increases_the_numbers_of_downloads_for_a_torrent_into_the_database ... ok +test databases::driver::sqlite::tests::create_database_tables_should_be_idempotent_on_a_fresh_database ... ok +test databases::driver::sqlite::schema_migrator::tests::bootstrap_legacy_schema_should_seed_history_when_all_legacy_tables_exist ... ok +test statistics::persisted::downloads::tests::it_loads_the_numbers_of_downloads_for_all_torrents_from_the_database ... ok +test tests::the_tracker::configured_as_whitelisted::handling_a_scrape_request::it_should_return_the_zeroed_swarm_metadata_for_the_requested_file_if_it_is_not_whitelisted ... ok +test tests::the_tracker::for_all_config_modes::handling_a_scrape_request::it_should_return_the_swarm_metadata_for_the_requested_file_if_the_tracker_has_that_torrent ... ok +test torrent::manager::tests::cleaning_torrents::it_should_remove_peers_that_have_not_been_updated_after_a_cutoff_time ... ok +test torrent::manager::tests::cleaning_torrents::it_should_retain_peerless_torrents_when_it_is_configured_to_do_so ... ok +test statistics::persisted::downloads::tests::it_saves_the_numbers_of_downloads_for_a_torrent_into_the_database ... ok +test torrent::manager::tests::cleaning_torrents::it_should_remove_torrents_that_have_no_peers_when_it_is_configured_to_do_so ... ok +test torrent::manager::tests::it_should_load_the_numbers_of_downloads_for_all_torrents_from_the_database ... ok +test whitelist::tests::configured_as_whitelisted::handling_authorization::it_should_not_authorize_the_announce_and_scrape_actions_on_not_whitelisted_torrents ... ok +test whitelist::manager::tests::configured_as_whitelisted::handling_the_torrent_whitelist::it_should_remove_a_torrent_from_the_whitelist ... ok +test whitelist::manager::tests::configured_as_whitelisted::handling_the_torrent_whitelist::persistence::it_should_load_the_whitelist_from_the_database ... ok +test whitelist::manager::tests::configured_as_whitelisted::handling_the_torrent_whitelist::it_should_add_a_torrent_to_the_whitelist ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_remove_a_infohash_from_the_list ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_not_fail_removing_an_infohash_that_is_not_in_the_list ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_add_a_new_infohash_to_the_list ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_not_add_the_same_infohash_to_the_list_twice ... ok +test whitelist::tests::configured_as_whitelisted::handling_authorization::it_should_authorize_the_announce_and_scrape_actions_on_whitelisted_torrents ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_load_all_infohashes_from_the_database ... ok +test databases::driver::sqlite::tests::run_sqlite_driver_tests ... ok + +test result: ok. 124 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s + + +running 13 tests +test persistence_benchmark::metrics::tests::it_should_compute_sorted_best_median_and_worst_for_each_operation ... ok +test persistence_benchmark::report::tests::it_should_convert_operation_durations_to_microseconds_in_report ... ok +test persistence_benchmark::metrics::tests::it_should_fail_when_operation_has_no_samples ... ok +test persistence_benchmark::report::tests::it_should_serialize_report_as_valid_pretty_json ... ok +test persistence_benchmark::types::tests::it_should_parse_db_version_when_value_has_allowed_characters ... ok +test persistence_benchmark::types::tests::it_should_parse_ops_count_when_value_is_positive ... ok +test persistence_benchmark::types::tests::it_should_reject_db_version_when_value_has_invalid_characters ... ok +test persistence_benchmark::types::tests::it_should_reject_db_version_when_value_is_empty ... ok +test persistence_benchmark::types::tests::it_should_reject_ops_count_when_value_is_not_numeric ... ok +test persistence_benchmark::types::tests::it_should_reject_ops_count_when_value_is_zero ... ok +test persistence_benchmark::reporting::tests::it_should_keep_mysql_db_version_in_report_metadata ... ok +test persistence_benchmark::reporting::tests::it_should_keep_postgresql_db_version_in_report_metadata ... ok +test persistence_benchmark::reporting::tests::it_should_normalize_db_version_to_dash_for_sqlite_reports ... ok + +test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 5 tests +test it_should_not_return_the_peer_making_the_announce_request ... ok +test it_should_handle_the_announce_request ... ok +test it_should_handle_the_scrape_request ... ok +test it_should_persist_the_number_of_completed_peers_for_each_torrent_into_the_database ... ok +test it_should_persist_the_global_number_of_completed_peers_into_the_database ... ok + +test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s + + +running 9 tests +test broadcaster::tests::it_should_allow_subscribing_multiple_receivers ... ok +test broadcaster::tests::it_should_allow_sending_an_event_and_received_it ... ok +test broadcaster::tests::it_should_fail_when_trying_tos_send_with_no_subscribers ... ok +test broadcaster::tests::it_should_return_the_number_of_receivers_when_and_event_is_sent ... ok +test bus::tests::it_should_allow_sending_events_that_are_received_by_receivers ... ok +test bus::tests::it_should_provide_an_event_sender_when_enabled ... ok +test bus::tests::it_should_enabled_by_default ... ok +test bus::tests::it_should_not_provide_event_sender_when_disabled ... ok +test bus::tests::it_should_send_a_closed_events_to_receivers_when_sender_is_dropped ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 15 tests +test event::test::events_should_be_comparable ... ok +test statistics::event::handler::tests::should_increase_the_tcp4_scrapes_counter_when_it_receives_a_tcp4_scrape_event ... ok +test statistics::event::handler::tests::should_increase_the_tcp6_announces_counter_when_it_receives_a_tcp6_announce_event ... ok +test statistics::event::handler::tests::should_increase_the_tcp6_scrapes_counter_when_it_receives_a_tcp6_scrape_event ... ok +test statistics::event::handler::tests::should_increase_the_tcp4_announces_counter_when_it_receives_a_tcp4_announce_event ... ok +test services::scrape::tests::with_real_data::it_should_send_the_tcp_4_scrape_event_when_the_peer_uses_ipv4 ... ok +test services::scrape::tests::with_real_data::it_should_send_the_tcp_6_scrape_event_when_the_peer_uses_ipv6 ... ok +test services::scrape::tests::with_zeroed_data::it_should_send_the_tcp_6_scrape_event_when_the_peer_uses_ipv6 ... ok +test services::scrape::tests::with_zeroed_data::it_should_send_the_tcp_4_scrape_event_when_the_peer_uses_ipv4 ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_send_the_tcp_6_announce_event_when_the_peer_uses_ipv6_even_if_the_tracker_changes_the_peer_ip_to_ipv4 ... ok +test services::scrape::tests::with_real_data::it_should_return_the_scrape_data_for_a_torrent ... ok +test services::scrape::tests::with_zeroed_data::it_should_return_the_zeroed_scrape_data_when_the_tracker_is_running_in_private_mode_and_the_peer_is_not_authenticated ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4_even_if_the_tracker_changes_the_peer_ip_to_ipv6 ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4 ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_return_the_announce_data ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + +Testing http_tracker_handle_announce_once/handle_announce_data +Success + + +running 44 tests +test percent_encoding::tests::it_should_decode_a_percent_encoded_info_hash ... ok +test percent_encoding::tests::it_should_fail_decoding_an_invalid_percent_encoded_info_hash ... ok +test percent_encoding::tests::it_should_decode_a_percent_encoded_peer_id ... ok +test percent_encoding::tests::it_should_fail_decoding_an_invalid_percent_encoded_peer_id ... ok +test v1::query::tests::url_query::param_name_value_pair::should_fail_parsing_an_invalid_query_param ... ok +test v1::query::tests::url_query::param_name_value_pair::should_be_displayed ... ok +test v1::query::tests::url_query::should_allow_more_than_one_value_for_the_same_param::instantiated_from_a_vector ... ok +test v1::query::tests::url_query::param_name_value_pair::should_parse_a_single_query_param ... ok +test v1::query::tests::url_query::should_allow_more_than_one_value_for_the_same_param::parsed_from_an_string ... ok +test v1::query::tests::url_query::should_be_displayed::with_multiple_params ... ok +test v1::query::tests::url_query::should_be_displayed::with_multiple_values_for_the_same_param ... ok +test v1::query::tests::url_query::should_be_displayed::with_one_param ... ok +test v1::query::tests::url_query::should_be_instantiated_from_a_string_pair_vector ... ok +test v1::query::tests::url_query::should_fail_parsing_an_invalid_query_string ... ok +test v1::query::tests::url_query::should_ignore_duplicate_param_values_when_asked_to_return_only_one_value ... ok +test v1::query::tests::url_query::should_ignore_the_preceding_question_mark_if_it_exists ... ok +test v1::query::tests::url_query::should_parse_the_query_params_from_an_url_query_string ... ok +test v1::query::tests::url_query::should_trim_whitespaces ... ok +test v1::requests::announce::tests::announce_request::should_be_instantiated_from_the_url_query_params ... ok +test v1::requests::announce::tests::announce_request::should_be_instantiated_from_the_url_query_with_only_the_mandatory_params ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_compact_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_downloaded_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_event_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_info_hash_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_left_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_numwant_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_peer_id_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_port_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_query_does_not_include_all_the_mandatory_params ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_uploaded_param_is_invalid ... ok +test v1::requests::scrape::tests::scrape_request::should_be_instantiated_from_the_url_query_with_only_one_infohash ... ok +test v1::requests::scrape::tests::scrape_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_info_hash_param_is_invalid ... ok +test v1::requests::scrape::tests::scrape_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_query_does_not_include_the_info_hash_param ... ok +test v1::responses::announce::tests::compact_announce_response_can_be_bencoded ... ok +test v1::responses::announce::tests::non_compact_announce_response_can_be_bencoded ... ok +test v1::responses::error::tests::http_tracker_errors_can_be_bencoded ... ok +test v1::responses::error::tests::it_should_map_a_peer_ip_resolution_error_into_an_error_response ... ok +test v1::responses::scrape::tests::scrape_response::should_be_bencoded ... ok +test v1::responses::scrape::tests::scrape_response::should_be_converted_from_scrape_data ... ok +test v1::responses::scrape::tests::scrape_response::should_encode_large_download_counts_as_i64 ... ok +test v1::services::peer_ip_resolver::tests::working_on_reverse_proxy_mode::it_should_get_the_remote_client_ip_from_the_right_most_ip_in_the_x_forwarded_for_header ... ok +test v1::services::peer_ip_resolver::tests::working_on_reverse_proxy_mode::it_should_return_an_error_if_it_cannot_get_the_right_most_ip_from_the_x_forwarded_for_header ... ok +test v1::services::peer_ip_resolver::tests::working_without_reverse_proxy::it_should_get_the_remote_client_address_from_the_connection_info ... ok +test v1::services::peer_ip_resolver::tests::working_without_reverse_proxy::it_should_return_an_error_if_it_cannot_get_the_remote_client_ip_from_the_connection_info ... ok + +test result: ok. 44 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 6 tests +test peer::test::peer::should_be_comparable ... ok +test peer::test::torrent_peer_id::should_be_converted_into_string_type_using_the_hex_string_format ... ok +test peer::test::torrent_peer_id::should_be_converted_to_hex_string ... ok +test peer::test::torrent_peer_id::should_fail_trying_to_convert_from_a_byte_vector_with_less_than_20_bytes - should panic ... ok +test scrape::tests::it_should_be_able_to_build_a_zeroed_scrape_data_for_a_list_of_info_hashes ... ok +test peer::test::torrent_peer_id::should_fail_trying_to_convert_from_a_byte_vector_with_more_than_20_bytes - should panic ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 7 tests +test connection_info::tests::origin::should_be_parsed_from_a_string_representing_a_url ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_add_the_slash_after_the_host ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_fail_when_the_host_is_missing ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_fail_when_the_scheme_is_not_supported ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_fail_when_the_scheme_is_missing ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_ignore_default_ports ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_remove_extra_path_and_query_parameters ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test statistics::services::tests::the_statistics_service_should_return_the_tracker_metrics ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + +running 95 tests +test event::test::events_should_be_comparable ... ok +test statistics::event::handler::tests::for_peer_metrics::it_should_increment_the_number_of_peers_added_when_a_peer_added_event_is_received ... ok +test statistics::event::handler::tests::for_peer_metrics::it_should_increment_the_number_of_peers_updated_when_a_peer_updated_event_is_received ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_adjust_the_number_of_seeders_and_leechers_when_a_peer_updated_event_is_received_and_the_peer_changed_its_role::case_1 ... ok +test statistics::event::handler::tests::for_peer_metrics::it_should_increment_the_number_of_peers_removed_when_a_peer_removed_event_is_received ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_adjust_the_number_of_seeders_and_leechers_when_a_peer_updated_event_is_received_and_the_peer_changed_its_role::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_decrement_the_number_of_peer_connections_when_a_peer_removed_event_is_received::case_1 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_increment_the_number_of_peer_connections_when_a_peer_added_event_is_received::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_increment_the_number_of_peer_connections_when_a_peer_added_event_is_received::case_1 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_decrement_the_number_of_peer_connections_when_a_peer_removed_event_is_received::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::torrent_downloads_total::it_should_increment_the_number_of_downloads_when_a_peer_downloaded_event_is_received::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::torrent_downloads_total::it_should_increment_the_number_of_downloads_when_a_peer_downloaded_event_is_received::case_1 ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_decrement_the_number_of_torrents_when_a_torrent_removed_event_is_received ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_increment_the_number_of_torrents_removed_when_a_torrent_removed_event_is_received ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_increment_the_number_of_torrents_added_when_a_torrent_added_event_is_received ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_disabled::it_should_not_be_removed_even_if_the_swarm_is_empty ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_increment_the_number_of_torrents_when_a_torrent_added_event_is_received ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_enabled::it_should_be_removed_if_the_swarm_is_empty ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_disabled::it_should_not_be_removed_is_the_swarm_is_not_empty ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_enabled::it_should_not_be_removed_even_if_the_swarm_is_empty_if_we_need_to_track_stats_for_downloads_and_there_has_been_downloads ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_enabled::it_should_not_be_removed_is_the_swarm_is_not_empty ... ok +test swarm::coordinator::tests::it_should_allow_getting_all_peers ... ok +test swarm::coordinator::tests::it_should_allow_getting_all_peers_excluding_peers_with_a_given_address ... ok +test swarm::coordinator::tests::it_should_allow_getting_one_peer_by_id ... ok +test swarm::coordinator::tests::it_should_allow_inserting_a_new_peer ... ok +test swarm::coordinator::tests::it_should_allow_inserting_two_identical_peers_except_for_the_socket_address ... ok +test swarm::coordinator::tests::it_should_allow_removing_a_non_existing_peer ... ok +test swarm::coordinator::tests::it_should_allow_removing_an_existing_peer ... ok +test swarm::coordinator::tests::it_should_allow_updating_a_preexisting_peer ... ok +test swarm::coordinator::tests::it_should_be_a_peerless_swarm_when_it_does_not_contain_any_peers ... ok +test swarm::coordinator::tests::it_should_be_empty_when_no_peers_have_been_inserted ... ok +test swarm::coordinator::tests::it_should_count_inactive_peers ... ok +test swarm::coordinator::tests::it_should_decrease_the_number_of_peers_after_removing_one ... ok +test swarm::coordinator::tests::it_should_have_zero_length_when_no_peers_have_been_inserted ... ok +test swarm::coordinator::tests::it_should_increase_the_number_of_peers_after_inserting_a_new_one ... ok +test swarm::coordinator::tests::it_should_not_allow_inserting_two_peers_with_different_peer_id_but_the_same_socket_address ... ok +test swarm::coordinator::tests::it_should_not_remove_active_peers ... ok +test swarm::coordinator::tests::it_should_remove_inactive_peers ... ok +test swarm::coordinator::tests::it_should_return_the_number_of_leechers_in_the_list ... ok +test swarm::coordinator::tests::it_should_return_the_number_of_seeders_in_the_list ... ok +test swarm::coordinator::tests::it_should_return_the_swarm_metadata ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_new_peer_is_added ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_completes_a_download ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_is_directly_removed ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_is_removed_due_to_inactivity ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_is_updated ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_increase_leechers_and_decreasing_seeders_when_the_peer_changes_from_seeder_to_leecher ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_increase_seeders_and_decreasing_leechers_when_the_peer_changes_from_leecher_to_seeder_ ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_increase_the_number_of_downloads_when_the_peer_announces_completed_downloading ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_new_peer_is_added::it_should_increase_the_number_of_leechers_if_the_new_peer_is_a_leecher_ ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_not_increasing_the_number_of_downloads_when_the_peer_announces_completed_downloading_twice_ ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_new_peer_is_added::it_should_increase_the_number_of_seeders_if_the_new_peer_is_a_seeder ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_new_peer_is_added::it_should_not_increasing_the_number_of_downloads_if_the_new_peer_has_completed_downloading_as_it_was_not_previously_known ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed::it_should_decrease_the_number_of_leechers_if_the_removed_peer_was_a_leecher ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed::it_should_decrease_the_number_of_seeders_if_the_removed_peer_was_a_seeder ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed_due_to_inactivity::it_should_decrease_the_number_of_leechers_when_a_removed_peer_is_a_leecher ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed_due_to_inactivity::it_should_decrease_the_number_of_seeders_when_the_removed_peer_is_a_seeder ... ok +test swarm::registry::tests::the_swarm_repository::handling_persistence::it_should_allow_importing_persisted_torrent_entries ... ok +test swarm::registry::tests::the_swarm_repository::handling_persistence::it_should_allow_overwriting_a_previously_imported_persisted_torrent ... ok +test swarm::registry::tests::the_swarm_repository::handling_persistence::it_should_now_allow_importing_a_persisted_torrent_if_it_already_exists ... ok +test swarm::registry::tests::the_swarm_repository::it_should_be_empty_when_it_has_no_swarms ... ok +test swarm::registry::tests::the_swarm_repository::it_should_not_be_empty_when_it_has_at_least_one_swarm ... ok +test swarm::registry::tests::the_swarm_repository::it_should_return_the_length_when_it_has_swarms ... ok +test swarm::registry::tests::the_swarm_repository::it_should_return_zero_length_when_it_has_no_swarms ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_peer_lists::it_should_add_the_first_peer_to_the_torrent_peer_list ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_peer_lists::it_should_allow_adding_the_same_peer_twice_to_the_torrent_peer_list ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_count_inactive_peers ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_remove_a_torrent_entry ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_remove_torrents_without_peers ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_remove_peers_that_have_not_been_updated_after_a_cutoff_time ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peerless_torrents::no_peerless_torrents ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peerless_torrents::one_peerless_torrents ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peers::no_peers ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peers::one_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_get_empty_aggregate_swarm_metadata_when_there_are_no_torrents ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_is_a_completed_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_is_a_leecher ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_is_a_seeder ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::excluding_the_client_peer::it_should_return_an_empty_peer_list_for_a_non_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::excluding_the_client_peer::it_should_return_74_peers_at_the_most_for_a_given_torrent_when_it_filters_out_a_given_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::excluding_the_client_peer::it_should_return_the_peers_for_a_given_torrent_excluding_a_given_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::it_should_return_an_empty_list_or_peers_for_a_non_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::it_should_return_74_peers_at_the_most_for_a_given_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::it_should_return_the_peers_for_a_given_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_swarm_metadata::it_should_get_swarm_metadata_for_an_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_swarm_metadata::it_should_return_zeroed_swarm_metadata_for_a_non_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::with_pagination::it_should_allow_changing_the_page_size ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::with_pagination::it_should_return_the_first_page ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::with_pagination::it_should_return_the_second_page ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::without_pagination ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_one_torrent_entry_by_infohash ... ok +test swarm::registry::tests::triggering_events::it_should_trigger_an_event_when_a_peerless_torrent_is_removed ... ok +test swarm::registry::tests::triggering_events::it_should_trigger_an_event_when_a_torrent_is_directly_removed ... ok +test swarm::registry::tests::triggering_events::it_should_trigger_an_event_when_a_new_torrent_is_added ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_are_multiple_torrents ... ok + +test result: ok. 95 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.78s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 15 tests +test entry::peer_list::tests::it_should::allow_getting_all_peers ... ok +test entry::peer_list::tests::it_should::allow_getting_all_peers_excluding_peers_with_a_given_address ... ok +test entry::peer_list::tests::it_should::allow_getting_one_peer_by_id ... ok +test entry::peer_list::tests::it_should::allow_inserting_two_identical_peers_except_for_the_id ... ok +test entry::peer_list::tests::it_should::allow_inserting_a_new_peer ... ok +test entry::peer_list::tests::it_should::allow_removing_an_existing_peer ... ok +test entry::peer_list::tests::it_should::allow_updating_a_preexisting_peer ... ok +test entry::peer_list::tests::it_should::be_empty_when_no_peers_have_been_inserted ... ok +test entry::peer_list::tests::it_should::decrease_the_number_of_peers_after_removing_one ... ok +test entry::peer_list::tests::it_should::have_zero_length_when_no_peers_have_been_inserted ... ok +test entry::peer_list::tests::it_should::increase_the_number_of_peers_after_inserting_a_new_one ... ok +test entry::peer_list::tests::it_should::not_remove_active_peers ... ok +test entry::peer_list::tests::it_should::remove_inactive_peers ... ok +test entry::peer_list::tests::it_should::return_the_number_of_leechers_in_the_list ... ok +test entry::peer_list::tests::it_should::return_the_number_of_seeders_in_the_list ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1468 tests +test entry::it_should_be_empty_by_default::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_2_started::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_5_three::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_2_standard_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_1_standard__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_3_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_6_tokio_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_4_tokio_std__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_2_standard_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_1_standard__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_5_tokio_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_5_tokio_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_6_tokio_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_4_tokio_std__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok + +test result: ok. 1468 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + +Testing add_one_torrent/RwLockStd +Success +Testing add_one_torrent/RwLockStdMutexStd +Success +Testing add_one_torrent/RwLockStdMutexTokio +Success +Testing add_one_torrent/RwLockTokio +Success +Testing add_one_torrent/RwLockTokioMutexStd +Success +Testing add_one_torrent/RwLockTokioMutexTokio +Success +Testing add_one_torrent/SkipMapMutexStd +Success +Testing add_one_torrent/SkipMapMutexParkingLot +Success +Testing add_one_torrent/SkipMapRwLockParkingLot +Success +Testing add_one_torrent/DashMapMutexStd +Success + +Testing add_multiple_torrents_in_parallel/RwLockStd +Success +Testing add_multiple_torrents_in_parallel/RwLockStdMutexStd +Success +Testing add_multiple_torrents_in_parallel/RwLockStdMutexTokio +Success +Testing add_multiple_torrents_in_parallel/RwLockTokio +Success +Testing add_multiple_torrents_in_parallel/RwLockTokioMutexStd +Success +Testing add_multiple_torrents_in_parallel/RwLockTokioMutexTokio +Success +Testing add_multiple_torrents_in_parallel/SkipMapMutexStd +Success +Testing add_multiple_torrents_in_parallel/SkipMapMutexParkingLot +Success +Testing add_multiple_torrents_in_parallel/SkipMapRwLockParkingLot +Success +Testing add_multiple_torrents_in_parallel/DashMapMutexStd +Success + +Testing update_one_torrent_in_parallel/RwLockStd +Success +Testing update_one_torrent_in_parallel/RwLockStdMutexStd +Success +Testing update_one_torrent_in_parallel/RwLockStdMutexTokio +Success +Testing update_one_torrent_in_parallel/RwLockTokio +Success +Testing update_one_torrent_in_parallel/RwLockTokioMutexStd +Success +Testing update_one_torrent_in_parallel/RwLockTokioMutexTokio +Success +Testing update_one_torrent_in_parallel/SkipMapMutexStd +Success +Testing update_one_torrent_in_parallel/SkipMapMutexParkingLot +Success +Testing update_one_torrent_in_parallel/SkipMapRwLockParkingLot +Success +Testing update_one_torrent_in_parallel/DashMapMutexStd +Success + +Testing update_multiple_torrents_in_parallel/RwLockStd +Success +Testing update_multiple_torrents_in_parallel/RwLockStdMutexStd +Success +Testing update_multiple_torrents_in_parallel/RwLockStdMutexTokio +Success +Testing update_multiple_torrents_in_parallel/RwLockTokio +Success +Testing update_multiple_torrents_in_parallel/RwLockTokioMutexStd +Success +Testing update_multiple_torrents_in_parallel/RwLockTokioMutexTokio +Success +Testing update_multiple_torrents_in_parallel/SkipMapMutexStd +Success +Testing update_multiple_torrents_in_parallel/SkipMapMutexParkingLot +Success +Testing update_multiple_torrents_in_parallel/SkipMapRwLockParkingLot +Success +Testing update_multiple_torrents_in_parallel/DashMapMutexStd +Success + + +running 122 tests +test handlers::scrape::tests::should_saturate_large_download_counts_for_udp_protocol ... ok +test handlers::connect::tests::connect_request::it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ... ok +test handlers::connect::tests::connect_request::it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ... ok +test statistics::event::handler::error::tests::should_increase_the_udp4_errors_counter_when_it_receives_a_udp4_error_event ... ok +test statistics::event::handler::request_aborted::tests::should_increase_the_udp_abort_counter_when_it_receives_a_udp_abort_event ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp6_connect_requests_counter_when_it_receives_a_udp6_request_event_of_connect_kind ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp6_scrape_requests_counter_when_it_receives_a_udp6_request_event_of_scrape_kind ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp6_announce_requests_counter_when_it_receives_a_udp6_request_event_of_announce_kind ... ok +test handlers::connect::tests::connect_request::a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ... ok +test handlers::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id ... ok +test handlers::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id_ipv6 ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_handle_fractional_averages_with_truncation ... ok +test statistics::event::handler::response_sent::tests::should_increase_the_udp4_responses_counter_when_it_receives_a_udp4_response_event ... ok +test statistics::event::handler::response_sent::tests::should_increase_the_udp6_response_counter_when_it_receives_a_udp6_response_event ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_handle_single_server_averaged_metrics ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_only_average_matching_request_kinds ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_averaged_value_for_udp_avg_announce_processing_time_ns_averaged ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_averaged_value_for_udp_avg_connect_processing_time_ns_averaged ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_averaged_value_for_udp_avg_scrape_processing_time_ns_averaged ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_zero_for_udp_avg_announce_processing_time_ns_averaged_when_no_data ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_zero_for_udp_avg_connect_processing_time_ns_averaged_when_no_data ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_zero_for_udp_avg_scrape_processing_time_ns_averaged_when_no_data ... ok +test statistics::metrics::tests::combined_metrics::it_should_distinguish_between_different_request_kinds ... ok +test statistics::metrics::tests::combined_metrics::it_should_distinguish_between_ipv4_and_ipv6_metrics ... ok +test statistics::metrics::tests::combined_metrics::it_should_handle_mixed_ipv4_and_ipv6_for_different_request_kinds ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_empty_label_sets ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_large_gauge_values ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_multiple_labels_on_same_metric ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_zero_gauge_values ... ok +test statistics::metrics::tests::edge_cases::it_should_overwrite_gauge_values_when_set_multiple_times ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_large_counter_values ... ok +test statistics::metrics::tests::error_handling::it_should_handle_unknown_metric_names_gracefully ... ok +test statistics::metrics::tests::error_handling::it_should_return_ok_result_for_valid_counter_operations ... ok +test statistics::metrics::tests::error_handling::it_should_return_ok_result_for_valid_gauge_operations ... ok +test statistics::metrics::tests::it_should_implement_debug ... ok +test statistics::metrics::tests::it_should_implement_default ... ok +test statistics::metrics::tests::it_should_implement_partial_eq ... ok +test statistics::metrics::tests::it_should_increase_counter_metric ... ok +test statistics::metrics::tests::it_should_increase_counter_metric_with_labels ... ok +test statistics::metrics::tests::it_should_increment_processed_requests_total ... ok +test statistics::metrics::tests::it_should_return_zero_for_udp_processed_requests_total_when_no_data ... ok +test statistics::metrics::tests::it_should_set_gauge_metric ... ok +test statistics::metrics::tests::it_should_set_gauge_metric_with_labels ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_gauge_value_for_udp_banned_ips_total ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_sum_of_udp_requests_aborted ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_sum_of_udp_requests_banned ... ok +test statistics::event::handler::request_received::tests::should_increase_the_number_of_incoming_requests_when_it_receives_a_udp4_incoming_request_event ... ok +test statistics::event::handler::request_banned::tests::should_increase_the_udp_ban_counter_when_it_receives_a_udp_banned_event ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp4_connect_requests_counter_when_it_receives_a_udp4_request_event_of_connect_kind ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp4_announce_requests_counter_when_it_receives_a_udp4_request_event_of_announce_kind ... ok +test statistics::event::handler::request_banned::tests::should_increase_the_number_of_banned_requests_when_it_receives_a_udp_request_banned_event ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_zero_for_udp_banned_ips_total_when_no_data ... ok +test statistics::event::handler::request_aborted::tests::should_increase_the_number_of_aborted_requests_when_it_receives_a_udp_request_aborted_event ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp4_scrape_requests_counter_when_it_receives_a_udp4_request_event_of_scrape_kind ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_zero_for_udp_requests_aborted_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_announces_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_connections_handled ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_zero_for_udp_requests_banned_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_errors_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_requests ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_responses ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_connections_handled_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_scrapes_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_announces_handled_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_requests_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_errors_handled_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_responses_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_scrapes_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_announces_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_connections_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_errors_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_responses ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_requests ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_scrapes_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_announces_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_connections_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_errors_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_requests_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_responses_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_scrapes_handled_when_no_data ... ok +test statistics::repository::tests::it_should_allow_increasing_a_counter_metric_successfully ... ok +test statistics::repository::tests::it_should_allow_increasing_a_counter_multiple_times ... ok +test statistics::repository::tests::it_should_allow_increasing_a_counter_with_different_labels ... ok +test statistics::repository::tests::it_should_allow_setting_a_gauge_with_different_labels ... ok +test statistics::repository::tests::it_should_be_cloneable ... ok +test statistics::repository::tests::it_should_be_initialized_with_described_metrics ... ok +test statistics::repository::tests::it_should_handle_concurrent_access ... ok +test statistics::repository::tests::it_should_handle_error_cases_gracefully ... ok +test statistics::repository::tests::it_should_handle_large_processing_times ... ok +test statistics::repository::tests::it_should_implement_default ... ok +test statistics::repository::tests::it_should_maintain_consistency_across_operations ... ok +test statistics::repository::tests::it_should_overwrite_previous_value_when_setting_a_gauge_with_a_previous_value ... ok +test statistics::repository::tests::it_should_recalculate_the_udp_average_announce_processing_time_in_nanoseconds_using_moving_average ... ok +test statistics::repository::tests::it_should_recalculate_the_udp_average_connect_processing_time_in_nanoseconds_using_moving_average ... ok +test statistics::repository::tests::it_should_recalculate_the_udp_average_scrape_processing_time_in_nanoseconds_using_moving_average ... ok +test statistics::repository::tests::it_should_return_a_read_guard_to_metrics ... ok +test statistics::repository::tests::it_should_set_a_gauge_metric_successfully ... ok +test statistics::repository::tests::recalculate_average_methods_should_handle_zero_connections_gracefully ... ok +test statistics::services::tests::the_statistics_service_should_return_the_tracker_metrics ... ok +test statistics::repository::tests::race_conditions::it_should_handle_race_conditions_when_updating_udp_performance_metrics_in_parallel ... ok +test handlers::announce::tests::announce_request::using_ipv6::from_a_loopback_ip::the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration ... ok +test handlers::announce::tests::announce_request::using_ipv6::should_send_the_upd6_announce_event ... ok +test handlers::announce::tests::announce_request::using_ipv4::from_a_loopback_ip::the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration_if_defined ... ok +test handlers::scrape::tests::scrape_request::with_a_whitelisted_tracker::should_return_the_torrent_statistics_when_the_requested_torrent_is_whitelisted ... ok +test handlers::scrape::tests::scrape_request::using_ipv6::should_send_the_upd6_scrape_event ... ok +test handlers::announce::tests::announce_request::using_ipv6::an_announced_peer_should_be_added_to_the_tracker ... ok +test handlers::announce::tests::announce_request::using_ipv4::the_announced_peer_should_not_be_included_in_the_response ... ok +test handlers::scrape::tests::scrape_request::should_return_no_stats_when_the_tracker_does_not_have_any_torrent ... ok +test handlers::announce::tests::announce_request::using_ipv4::the_tracker_should_always_use_the_remote_client_ip_but_not_the_port_in_the_udp_request_header_instead_of_the_peer_address_in_the_announce_request ... ok +test handlers::announce::tests::announce_request::using_ipv4::should_send_the_upd4_announce_event ... ok +test handlers::scrape::tests::scrape_request::with_a_whitelisted_tracker::should_return_zeroed_statistics_when_the_requested_torrent_is_not_whitelisted ... ok +test handlers::scrape::tests::scrape_request::using_ipv4::should_send_the_upd4_scrape_event ... ok +test handlers::announce::tests::announce_request::using_ipv4::an_announced_peer_should_be_added_to_the_tracker ... ok +test handlers::scrape::tests::scrape_request::with_a_public_tracker::should_return_torrent_statistics_when_the_tracker_has_the_requested_torrent ... ok +test handlers::announce::tests::announce_request::using_ipv4::when_the_announce_request_comes_from_a_client_using_ipv4_the_response_should_not_include_peers_using_ipv6 ... ok +test handlers::announce::tests::announce_request::using_ipv6::the_announced_peer_should_not_be_included_in_the_response ... ok +test handlers::announce::tests::announce_request::using_ipv6::the_tracker_should_always_use_the_remote_client_ip_but_not_the_port_in_the_udp_request_header_instead_of_the_peer_address_in_the_announce_request ... ok +test handlers::announce::tests::announce_request::using_ipv6::when_the_announce_request_comes_from_a_client_using_ipv6_the_response_should_not_include_peers_using_ipv4 ... ok +test server::test_tokio::test_barrier_with_aborted_tasks ... ok +test server::tests::it_should_be_able_to_start_and_stop ... ok +test server::tests::it_should_be_able_to_start_and_stop_with_wait ... ok +test environment::tests::it_should_make_and_stop_udp_server ... ok + +test result: ok. 122 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.07s + + +running 6 tests +test server::contract::receiving_an_scrape_request::should_return_a_scrape_response ... ok +test server::contract::receiving_a_connection_request::should_return_a_connect_response ... ok +test server::contract::should_return_a_bad_request_response_when_the_client_sends_an_empty_request ... ok +test server::contract::receiving_an_announce_request::should_return_an_announce_response ... ok +test server::contract::receiving_an_announce_request::should_return_many_announce_response ... ok +test server::contract::receiving_an_announce_request::should_ban_the_client_ip_if_it_sends_more_than_10_requests_with_a_cookie_value_not_normal ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.04s + + +running 29 tests +test connection_cookie::tests::it_should_create_different_cookies_for_different_fingerprints ... ok +test connection_cookie::tests::it_should_create_different_cookies_for_different_issue_times ... ok +test connection_cookie::tests::it_should_make_a_connection_cookie ... ok +test connection_cookie::tests::it_should_create_same_cookie_for_same_input ... ok +test connection_cookie::tests::it_should_validate_a_valid_cookie ... ok +test connection_cookie::tests::it_should_reject_a_cookie_from_the_future ... ok +test crypto::keys::detail_cipher::tests::it_should_default_to_zeroed_seed_when_testing ... ok +test connection_cookie::tests::it_should_reject_an_expired_cookie ... ok +test crypto::keys::detail_seed::tests::it_should_default_to_zeroed_seed_when_testing ... ok +test crypto::keys::detail_seed::tests::it_should_have_a_large_random_seed ... ok +test crypto::keys::detail_seed::tests::it_should_have_a_zero_test_seed ... ok +test crypto::keys::tests::the_default_seed_and_the_instance_seed_should_be_different_when_testing ... ok +test crypto::keys::tests::the_default_seed_and_the_zeroed_seed_should_be_the_same_when_testing ... ok +test services::banning::tests::it_should_allow_resetting_all_the_counters ... ok +test services::banning::tests::it_should_increase_the_errors_counter_for_a_given_ip ... ok +test services::banning::tests::it_should_ban_ips_with_counters_exceeding_a_predefined_limit ... ok +test services::banning::tests::it_should_not_ban_ips_whose_counters_do_not_exceed_the_predefined_limit ... ok +test services::connect::tests::connect_request::it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ... ok +test services::connect::tests::connect_request::it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ... ok +test statistics::event::handler::tests::should_increase_the_udp4_announces_counter_when_it_receives_a_udp4_announce_event ... ok +test statistics::event::handler::tests::should_increase_the_udp4_connections_counter_when_it_receives_a_udp4_connect_event ... ok +test statistics::event::handler::tests::should_increase_the_udp4_scrapes_counter_when_it_receives_a_udp4_scrape_event ... ok +test statistics::event::handler::tests::should_increase_the_udp6_announces_counter_when_it_receives_a_udp6_announce_event ... ok +test statistics::event::handler::tests::should_increase_the_udp6_connections_counter_when_it_receives_a_udp6_connect_event ... ok +test statistics::event::handler::tests::should_increase_the_udp6_scrapes_counter_when_it_receives_a_udp6_scrape_event ... ok +test statistics::services::tests::the_statistics_service_should_return_the_tracker_metrics ... ok +test services::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id ... ok +test services::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id_ipv6 ... ok +test services::connect::tests::connect_request::a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ... ok + +test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + +Testing udp_tracker/connect_once/connect_once +Success + + +running 9 tests +test request::tests::test_connect_request_convert_identity ... ok +test request::tests::test_announce_request_convert_identity ... ok +test request::tests::test_scrape_request_with_no_info_hashes ... ok +test request::tests::test_various_input_lengths ... ok +test response::tests::test_connect_response_convert_identity ... ok +test response::tests::test_announce_response_ipv4_convert_identity ... ok +test response::tests::test_scrape_response_convert_identity ... ok +test response::tests::test_announce_response_ipv6_convert_identity ... ok +test request::tests::test_scrape_request_convert_identity ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +[cold] test_unit_seconds=139 +[cold] test_unit_exit_code=0 +[cold] docker_build_e2e_start +[cold] docker_build_e2e_seconds=312 +[cold] docker_build_e2e_exit_code=0 +[cold] e2e_tracker_start +2026-05-27T21:21:45.899234Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Logging initialized +2026-05-27T21:21:45.899319Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Reading tracker configuration from file: ./share/default/config/tracker.e2e.container.sqlite3.toml ... +2026-05-27T21:21:45.899338Z  INFO torrust_tracker_lib::console::ci::e2e::runner: tracker config: +[metadata] +app = "torrust-tracker" +purpose = "configuration" +schema_version = "2.0.0" + +[logging] +threshold = "info" + +[core] +listed = false +private = false + +[core.database] +path = "/var/lib/torrust/tracker/database/sqlite3.db" + +[[udp_trackers]] +bind_address = "0.0.0.0:6969" + +[[http_trackers]] +bind_address = "0.0.0.0:7070" + +[http_api] +bind_address = "0.0.0.0:1212" + +[http_api.access_tokens] +admin = "MyAccessToken" + +[health_check_api] +# Must be bound to wildcard IP to be accessible from outside the container +bind_address = "0.0.0.0:1313" + +2026-05-27T21:21:45.899363Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Running docker tracker image: tracker_VLVDg6lJgd62arcNqo3h ... +2026-05-27T21:21:46.170220Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Waiting for the container tracker_VLVDg6lJgd62arcNqo3h to be healthy ... +2026-05-27T21:21:46.179537Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up Less than a second (health: starting)\n" +2026-05-27T21:21:47.189547Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 1 second (health: starting)\n" +2026-05-27T21:21:48.209206Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 2 seconds (health: starting)\n" +2026-05-27T21:21:49.218549Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 3 seconds (health: starting)\n" +2026-05-27T21:21:50.228103Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 4 seconds (health: starting)\n" +2026-05-27T21:21:51.237589Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 5 seconds (healthy)\n" +2026-05-27T21:21:51.237599Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Container tracker_VLVDg6lJgd62arcNqo3h is healthy ... +2026-05-27T21:21:51.258430Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Parsing running services from logs. Logs : +Loading extra configuration from environment variable: + [metadata] +app = "torrust-tracker" +purpose = "configuration" +schema_version = "2.0.0" + +[logging] +threshold = "info" + +[core] +listed = false +private = false + +[core.database] +path = "/var/lib/torrust/tracker/database/sqlite3.db" + +[[udp_trackers]] +bind_address = "0.0.0.0:6969" + +[[http_trackers]] +bind_address = "0.0.0.0:7070" + +[http_api] +bind_address = "0.0.0.0:1212" + +[http_api.access_tokens] +admin = "MyAccessToken" + +[health_check_api] +# Must be bound to wildcard IP to be accessible from outside the container +bind_address = "0.0.0.0:1313" + +Loading extra configuration from file: `/etc/torrust/tracker/tracker.toml` ... +\x1b[2m2026-05-27T21:21:46.200449Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[2mtorrust_tracker_configuration::logging\x1b[0m\x1b[2m:\x1b[0m Logging initialized +\x1b[2m2026-05-27T21:21:46.200470Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[2mtorrust_tracker_lib::bootstrap::app\x1b[0m\x1b[2m:\x1b[0m Configuration: +{ + "metadata": { + "app": "torrust-tracker", + "purpose": "configuration", + "schema_version": "2.0.0" + }, + "logging": { + "threshold": "info" + }, + "core": { + "announce_policy": { + "interval": 120, + "interval_min": 120 + }, + "database": { + "driver": "sqlite3", + "path": "/var/lib/torrust/tracker/database/sqlite3.db" + }, + "inactive_peer_cleanup_interval": 600, + "listed": false, + "net": { + "external_ip": "0.0.0.0", + "on_reverse_proxy": false + }, + "private": false, + "private_mode": null, + "tracker_policy": { + "max_peer_timeout": 900, + "persistent_torrent_completed_stat": false, + "remove_peerless_torrents": true + }, + "tracker_usage_statistics": true + }, + "udp_trackers": [ + { + "bind_address": "0.0.0.0:6969", + "cookie_lifetime": { + "secs": 120, + "nanos": 0 + }, + "tracker_usage_statistics": false + } + ], + "http_trackers": [ + { + "bind_address": "0.0.0.0:7070", + "tsl_config": null, + "tracker_usage_statistics": false + } + ], + "http_api": { + "bind_address": "0.0.0.0:1212", + "tsl_config": null, + "access_tokens": { + "admin": "***" + } + }, + "health_check_api": { + "bind_address": "0.0.0.0:1313" + } +} +\x1b[2m2026-05-27T21:21:46.205876Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_added_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrents added.")) +\x1b[2m2026-05-27T21:21:46.205889Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_removed_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrents removed.")) +\x1b[2m2026-05-27T21:21:46.205893Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrents.")) +\x1b[2m2026-05-27T21:21:46.205897Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_downloads_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrent downloads.")) +\x1b[2m2026-05-27T21:21:46.205900Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_inactive_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of inactive torrents.")) +\x1b[2m2026-05-27T21:21:46.205903Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_added_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers added.")) +\x1b[2m2026-05-27T21:21:46.205906Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_removed_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers removed.")) +\x1b[2m2026-05-27T21:21:46.205910Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_updated_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers updated.")) +\x1b[2m2026-05-27T21:21:46.205912Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peer_connections_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peer connections (one connection per torrent).")) +\x1b[2m2026-05-27T21:21:46.205915Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_unique_peers_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of unique peers.")) +\x1b[2m2026-05-27T21:21:46.205917Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_inactive_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of inactive peers.")) +\x1b[2m2026-05-27T21:21:46.205919Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_completed_state_reverted_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers whose completed state was reverted.")) +\x1b[2m2026-05-27T21:21:46.217656Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"tracker_core_persistent_torrents_downloads_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrent downloads (persisted).")) +\x1b[2m2026-05-27T21:21:46.222989Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"http_tracker_core_requests_received_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of HTTP requests received")) +\x1b[2m2026-05-27T21:21:46.228018Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_core_requests_received_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests received")) +\x1b[2m2026-05-27T21:21:46.232745Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_aborted_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests aborted")) +\x1b[2m2026-05-27T21:21:46.232751Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_banned_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests banned")) +\x1b[2m2026-05-27T21:21:46.232753Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_ips_banned_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of IPs banned from UDP requests")) +\x1b[2m2026-05-27T21:21:46.232758Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_connection_id_errors_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of requests with connection ID errors")) +\x1b[2m2026-05-27T21:21:46.232760Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_received_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests received")) +\x1b[2m2026-05-27T21:21:46.232762Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_accepted_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests accepted")) +\x1b[2m2026-05-27T21:21:46.232764Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_responses_sent_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP responses sent")) +\x1b[2m2026-05-27T21:21:46.232766Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_errors_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of errors processing UDP requests")) +\x1b[2m2026-05-27T21:21:46.232768Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_performance_avg_processing_time_ns" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Nanoseconds) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Average time to process a UDP request in nanoseconds")) +\x1b[2m2026-05-27T21:21:46.232771Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_performance_avg_processed_requests_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests processed for the average performance metrics")) +\x1b[2m2026-05-27T21:21:46.232781Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mSWARM_COORDINATION_REGISTRY\x1b[0m\x1b[2m:\x1b[0m Starting swarm coordination registry event listener +\x1b[2m2026-05-27T21:21:46.232792Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mTRACKER_CORE\x1b[0m\x1b[2m:\x1b[0m Starting tracker core event listener +\x1b[2m2026-05-27T21:21:46.232796Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting HTTP tracker core event listener +\x1b[2m2026-05-27T21:21:46.232800Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting UDP tracker core event listener +\x1b[2m2026-05-27T21:21:46.232803Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting UDP tracker server event listener +\x1b[2m2026-05-27T21:21:46.232806Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting UDP tracker server event listener (banning) +\x1b[2m2026-05-27T21:21:46.232844Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrun_with_graceful_shutdown\x1b[0m\x1b[1m{\x1b[0m\x1b[3mcookie_lifetime\x1b[0m\x1b[2m=\x1b[0m120s\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting on: 0.0.0.0:6969 +\x1b[2m2026-05-27T21:21:46.232884Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrun_with_graceful_shutdown\x1b[0m\x1b[1m{\x1b[0m\x1b[3mcookie_lifetime\x1b[0m\x1b[2m=\x1b[0m120s\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Started on: udp://0.0.0.0:6969 +\x1b[2m2026-05-27T21:21:46.232912Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_job\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart\x1b[0m\x1b[1m{\x1b[0m\x1b[3mcookie_lifetime\x1b[0m\x1b[2m=\x1b[0m120s\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mtorrust_tracker_udp_server::server::states\x1b[0m\x1b[2m:\x1b[0m \x1b[3mreturn\x1b[0m\x1b[2m=\x1b[0mRunning (with local address): 0.0.0.0:6969 +\x1b[2m2026-05-27T21:21:46.232969Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting on: http://0.0.0.0:7070 +\x1b[2m2026-05-27T21:21:46.233042Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m Started on: http://0.0.0.0:7070 +\x1b[2m2026-05-27T21:21:46.233167Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m Starting on: http://0.0.0.0:1212 +\x1b[2m2026-05-27T21:21:46.233174Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m Started on: http://0.0.0.0:1212 +\x1b[2m2026-05-27T21:21:46.233183Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_job\x1b[0m\x1b[1m{\x1b[0m\x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mV1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_v1\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mtorrust_tracker_axum_rest_api_server::server\x1b[0m\x1b[2m:\x1b[0m \x1b[3mreturn\x1b[0m\x1b[2m=\x1b[0mRunning (with local address): 0.0.0.0:1212 +\x1b[2m2026-05-27T21:21:46.233207Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m Starting on: http://0.0.0.0:1313 +\x1b[2m2026-05-27T21:21:46.233254Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_job\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m Started on: http://0.0.0.0:1313 +\x1b[2m2026-05-27T21:21:51.225689Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m request \x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0ma4734d46-b995-43f9-86cd-b289ee6ff72e +\x1b[2m2026-05-27T21:21:51.226478Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/api/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m request \x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/api/health_check \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0me76a5337-c6fa-41e8-9660-5efabb1f22b2 +\x1b[2m2026-05-27T21:21:51.226499Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/api/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m response \x1b[3mlatency_ms\x1b[0m\x1b[2m=\x1b[0m0 \x1b[3mstatus_code\x1b[0m\x1b[2m=\x1b[0m200 OK \x1b[3mserver_socket_addr\x1b[0m\x1b[2m=\x1b[0m0.0.0.0:1212 \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0me76a5337-c6fa-41e8-9660-5efabb1f22b2 +\x1b[2m2026-05-27T21:21:51.226601Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m request \x1b[3mserver_socket_addr\x1b[0m\x1b[2m=\x1b[0m0.0.0.0:7070 \x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0m60c6fe0d-e202-43b8-8f6c-2d698acb0562 +\x1b[2m2026-05-27T21:21:51.226614Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m response \x1b[3mserver_socket_addr\x1b[0m\x1b[2m=\x1b[0m0.0.0.0:7070 \x1b[3mlatency_ms\x1b[0m\x1b[2m=\x1b[0m0 \x1b[3mstatus_code\x1b[0m\x1b[2m=\x1b[0m200 OK \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0m60c6fe0d-e202-43b8-8f6c-2d698acb0562 +\x1b[2m2026-05-27T21:21:51.226719Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m response \x1b[3mlatency_ms\x1b[0m\x1b[2m=\x1b[0m1 \x1b[3mstatus_code\x1b[0m\x1b[2m=\x1b[0m200 OK \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0ma4734d46-b995-43f9-86cd-b289ee6ff72e + +2026-05-27T21:21:51.258854Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Running services: + { + "udp_trackers": [ + "127.0.0.1:6969" + ], + "http_trackers": [ + "http://127.0.0.1:7070" + ], + "health_checks": [ + "http://127.0.0.1:1313/health_check" + ] +} +2026-05-27T21:21:51.258860Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_checker: Running Tracker Checker: TORRUST_CHECKER_CONFIG=[config] cargo run -p torrust-tracker-client --bin tracker_checker +2026-05-27T21:21:51.258862Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_checker: Tracker Checker config: +{ + "udp_trackers": [ + "127.0.0.1:6969" + ], + "http_trackers": [ + "http://127.0.0.1:7070" + ], + "health_checks": [ + "http://127.0.0.1:1313/health_check" + ] +} +2026-05-27T21:22:12.286731Z  INFO torrust_tracker_console_client::console::clients::checker::service: Running checks for trackers ... +[ + { + "Udp": { + "Ok": { + "remote_addr": "127.0.0.1:6969", + "results": [ + [ + "Setup", + { + "Ok": null + } + ], + [ + "Connect", + { + "Ok": null + } + ], + [ + "Announce", + { + "Ok": null + } + ], + [ + "Scrape", + { + "Ok": null + } + ] + ] + } + } + }, + { + "Health": { + "Ok": { + "url": "http://127.0.0.1:1313/health_check", + "result": { + "Ok": "200 OK" + } + } + } + }, + { + "Http": { + "Ok": { + "url": "http://127.0.0.1:7070/", + "results": [ + [ + "Announce", + { + "Ok": null + } + ], + [ + "Scrape", + { + "Ok": null + } + ] + ] + } + } + } +] +2026-05-27T21:22:12.308698Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Stopping docker tracker container: tracker_VLVDg6lJgd62arcNqo3h ... +tracker_VLVDg6lJgd62arcNqo3h +2026-05-27T21:22:23.109057Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Dropping running container: tracker_VLVDg6lJgd62arcNqo3h +2026-05-27T21:22:23.117007Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Removing docker tracker container: tracker_VLVDg6lJgd62arcNqo3h ... +tracker_VLVDg6lJgd62arcNqo3h +2026-05-27T21:22:23.128493Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Tracker container final state: +TrackerContainer { + image: "torrust-tracker:e2e-local", + name: "tracker_VLVDg6lJgd62arcNqo3h", + running: None, +} +2026-05-27T21:22:23.128504Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Dropping tracker container: tracker_VLVDg6lJgd62arcNqo3h +[cold] e2e_tracker_seconds=79 +[cold] e2e_tracker_exit_code=0 +[cold] e2e_qbittorrent_sqlite_start +2026-05-27T21:23:01.117971Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Logging initialized +2026-05-27T21:23:01.118064Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Using compose project name: qbt-e2e-uwjtrce8kh +2026-05-27T21:23:01.220969Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "up" "--wait" "--detach" "--no-build" +2026-05-27T21:23:07.083945Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "ps" "-a" +2026-05-27T21:23:07.112627Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "port" "qbittorrent-seeder" "8080" +2026-05-27T21:23:07.139757Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: seeder WebUI host port: 32768 +2026-05-27T21:23:07.144138Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "ps" "-a" +2026-05-27T21:23:07.172343Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "port" "qbittorrent-leecher" "8080" +2026-05-27T21:23:07.199803Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: leecher WebUI host port: 32769 +2026-05-27T21:23:07.203953Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "ps" "-a" +2026-05-27T21:23:07.232798Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "port" "tracker" "1212" +2026-05-27T21:23:07.260394Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: Tracker REST API host port: 32770 +2026-05-27T21:23:07.264765Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:07.296002Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:23:07.296593Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:07.297571Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-http.torrent" +2026-05-27T21:23:07.297838Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=0 +2026-05-27T21:23:07.799105Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:07.799116Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:07.829495Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:23:07.829933Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:07.830289Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-http.torrent" +2026-05-27T21:23:07.830293Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:07.830882Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:23:08.332121Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:08.332431Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=checkingResumeData +2026-05-27T21:23:08.834772Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=checkingResumeData +2026-05-27T21:23:09.335988Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=stalledDL +2026-05-27T21:23:09.837385Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=stalledDL +2026-05-27T21:23:10.339603Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=stalledDL +2026-05-27T21:23:10.840816Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=100.0 state=stalledUP +2026-05-27T21:23:10.840828Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:10.840830Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:10.841726Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:23:10.846800Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=13295a397dcb84e5467765587a2c810425c30622 seeders=2 completed=1 leechers=0 +2026-05-27T21:23:10.846807Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:10.846810Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:10.846813Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:10.877100Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:23:10.877766Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:10.878134Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-udp.torrent" +2026-05-27T21:23:10.878553Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:10.878557Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:10.907995Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:23:10.908564Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:10.908816Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-udp.torrent" +2026-05-27T21:23:10.908819Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:10.909464Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 torrent_count=2 +2026-05-27T21:23:11.411730Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:11.412129Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:23:11.913940Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:23:12.415213Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:23:12.917497Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:23:13.419842Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:23:13.921102Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=100.0 state=stalledUP +2026-05-27T21:23:13.921114Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:13.921117Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:13.922028Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:23:13.926826Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 seeders=2 completed=1 leechers=0 +2026-05-27T21:23:13.926831Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:13.926833Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:13.926907Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpHcyJKl/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpHcyJKl/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpHcyJKl/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpHcyJKl/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpHcyJKl/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpHcyJKl/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-uwjtrce8kh" "down" "--volumes" +[cold] e2e_qbittorrent_sqlite_seconds=61 +[cold] e2e_qbittorrent_sqlite_exit_code=0 +[cold] e2e_qbittorrent_mysql_start +2026-05-27T21:23:24.719486Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Logging initialized +2026-05-27T21:23:24.719591Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Using compose project name: qbt-e2e-c9rt7xavit +2026-05-27T21:23:24.821470Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "up" "--wait" "--detach" "--no-build" +2026-05-27T21:23:36.216506Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "ps" "-a" +2026-05-27T21:23:36.254771Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "port" "qbittorrent-seeder" "8080" +2026-05-27T21:23:36.281515Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: seeder WebUI host port: 32773 +2026-05-27T21:23:36.285946Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "ps" "-a" +2026-05-27T21:23:36.315403Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "port" "qbittorrent-leecher" "8080" +2026-05-27T21:23:36.344036Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: leecher WebUI host port: 32774 +2026-05-27T21:23:36.348872Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "ps" "-a" +2026-05-27T21:23:36.377567Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "port" "tracker" "1212" +2026-05-27T21:23:36.405427Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: Tracker REST API host port: 32775 +2026-05-27T21:23:36.409536Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:36.439970Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:23:36.440312Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:36.440622Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-http.torrent" +2026-05-27T21:23:36.441165Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:23:36.942902Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:36.942914Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:36.973088Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:23:36.973703Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:36.974035Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-http.torrent" +2026-05-27T21:23:36.974041Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:36.974567Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:23:37.475807Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:37.476162Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:23:37.977447Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:23:38.478871Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:23:38.981018Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=100.0 state=stalledUP +2026-05-27T21:23:38.981031Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:38.981033Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:38.981931Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:23:38.986864Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=13295a397dcb84e5467765587a2c810425c30622 seeders=2 completed=1 leechers=0 +2026-05-27T21:23:38.986869Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:38.986871Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:23:38.986875Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.018106Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:23:39.018658Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.018941Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-udp.torrent" +2026-05-27T21:23:39.019349Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.019352Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.050129Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:23:39.050853Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.051138Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-udp.torrent" +2026-05-27T21:23:39.051142Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.051574Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:39.051945Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:23:39.554276Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:23:40.055986Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:23:40.558484Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:23:41.059942Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:23:41.562360Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:23:42.064723Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=100.0 state=stalledUP +2026-05-27T21:23:42.064734Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:42.064736Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:42.065710Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:23:42.070646Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 seeders=2 completed=1 leechers=0 +2026-05-27T21:23:42.070651Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:42.070653Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:23:42.070742Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpjjF4ky/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpjjF4ky/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpjjF4ky/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpjjF4ky/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpjjF4ky/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpjjF4ky/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-c9rt7xavit" "down" "--volumes" +[cold] e2e_qbittorrent_mysql_seconds=29 +[cold] e2e_qbittorrent_mysql_exit_code=0 +[cold] e2e_qbittorrent_postgresql_start +2026-05-27T21:23:54.111866Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Logging initialized +2026-05-27T21:23:54.111954Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Using compose project name: qbt-e2e-epjdkxbaeo +2026-05-27T21:23:54.217312Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "up" "--wait" "--detach" "--no-build" +2026-05-27T21:24:05.592548Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "ps" "-a" +2026-05-27T21:24:05.621961Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "port" "qbittorrent-seeder" "8080" +2026-05-27T21:24:05.651012Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: seeder WebUI host port: 32778 +2026-05-27T21:24:05.657613Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "ps" "-a" +2026-05-27T21:24:05.686703Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "port" "qbittorrent-leecher" "8080" +2026-05-27T21:24:05.715736Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: leecher WebUI host port: 32779 +2026-05-27T21:24:05.720430Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "ps" "-a" +2026-05-27T21:24:05.753098Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "port" "tracker" "1212" +2026-05-27T21:24:05.780731Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: Tracker REST API host port: 32780 +2026-05-27T21:24:05.785339Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:05.815896Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:24:05.816277Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:05.816623Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-http.torrent" +2026-05-27T21:24:05.817245Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:24:06.319456Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:06.319468Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:06.350769Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:24:06.351357Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:06.351659Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-http.torrent" +2026-05-27T21:24:06.351664Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:06.352169Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:24:06.854360Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:06.854675Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:24:07.356691Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:24:07.858549Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:24:08.360528Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=100.0 state=stalledUP +2026-05-27T21:24:08.360538Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:08.360540Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:08.361500Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:24:08.366648Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=13295a397dcb84e5467765587a2c810425c30622 seeders=2 completed=1 leechers=0 +2026-05-27T21:24:08.366658Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:08.366661Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:24:08.366666Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.396686Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:24:08.397340Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.397629Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-udp.torrent" +2026-05-27T21:24:08.397962Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.397967Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.427076Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:24:08.427654Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.427934Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-udp.torrent" +2026-05-27T21:24:08.427939Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.428506Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:08.428808Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:24:08.930210Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:24:09.432560Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:24:09.933779Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:24:10.434994Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:24:10.936447Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:24:11.438907Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=100.0 state=stalledUP +2026-05-27T21:24:11.438920Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:11.438922Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:11.439903Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:24:11.444858Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 seeders=2 completed=1 leechers=0 +2026-05-27T21:24:11.444863Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:11.444867Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:24:11.444956Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpM9HC4M/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpM9HC4M/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpM9HC4M/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpM9HC4M/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpM9HC4M/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpM9HC4M/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-epjdkxbaeo" "down" "--volumes" +[cold] e2e_qbittorrent_postgresql_seconds=29 +[cold] e2e_qbittorrent_postgresql_exit_code=0 +[warm] fetch_start +[warm] fetch_seconds=0 +[warm] fetch_exit_code=0 +[warm] install_linter_start +[warm] install_linter_seconds=0 +[warm] install_linter_exit_code=0 +[warm] format_start +[warm] format_seconds=1 +[warm] format_exit_code=0 +[warm] lint_start +2026-05-27T21:24:23.192626Z  INFO torrust_linting::cli: Running All Linters +2026-05-27T21:24:23.193677Z  INFO markdown: Scanning markdown files... + +2026-05-27T21:24:29.696811Z ERROR markdown: Markdown linting failed. Please fix the issues above. (6.503s) +2026-05-27T21:24:29.697210Z ERROR torrust_linting::cli: Markdown linting failed: Markdown linting failed +2026-05-27T21:24:29.698166Z  INFO yaml: Scanning YAML files... +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/nu-ansi-term-0.50.3/.github/workflows/ci.yml + 1:4 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/log-0.4.30/.github/workflows/main.yml + 37:5 error wrong indentation: expected 6 but found 4 (indentation) + 46:201 error line too long (296 > 200 characters) (line-length) + 54:5 error wrong indentation: expected 6 but found 4 (indentation) + 70:5 error wrong indentation: expected 6 but found 4 (indentation) + 129:201 error line too long (298 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/winapi-util-0.1.11/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 40:9 error wrong indentation: expected 10 but found 8 (indentation) + 62:5 error wrong indentation: expected 6 but found 4 (indentation) + 78:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc-hash-2.1.2/.github/workflows/rust.yml + 35:13 error wrong indentation: expected 10 but found 12 (indentation) + 36:13 error wrong indentation: expected 10 but found 12 (indentation) + 37:13 error wrong indentation: expected 10 but found 12 (indentation) + 38:13 error wrong indentation: expected 10 but found 12 (indentation) + 39:11 error wrong indentation: expected 8 but found 10 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cfg-if-1.0.4/.github/workflows/publish.yaml + 8:10 error too many spaces inside braces (braces) + 8:27 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/local-ip-address-0.6.13/.cirrus.yml + 59:1 error duplication of key "task" in mapping (key-duplicates) + 72:1 error duplication of key "task" in mapping (key-duplicates) + 84:1 error duplication of key "task" in mapping (key-duplicates) + 96:1 error duplication of key "task" in mapping (key-duplicates) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyperlocal-0.9.1/.github/workflows/main.yml + 19:21 error too many spaces after colon (colons) + 81:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/dunce-1.0.5/.appveyor.yml + 5:3 warning comment not indented like content (comments-indentation) + 8:3 warning comment not indented like content (comments-indentation) + 11:3 warning comment not indented like content (comments-indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/dunce-1.0.5/.gitlab-ci.yml + 9:3 error wrong indentation: expected 4 but found 2 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/supports-color-3.0.2/.github/workflows/miri.yml + 14:13 error wrong indentation: expected 10 but found 12 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/shlex-1.3.0/.github/workflows/test.yml + 27:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/h2-0.4.14/.github/workflows/CI.yml + 64:4 warning missing starting space in comment (comments) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bit-vec-0.4.4/.travis.yml + 9:5 error wrong indentation: expected 2 but found 4 (indentation) + 19:5 error wrong indentation: expected 2 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tinytemplate-1.2.1/.github/workflows/ci.yml + 1:25 error wrong new line character: expected \n (new-lines) + 38:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/page_size-0.6.0/.travis.yml + 31:20 error trailing spaces (trailing-spaces) + 94:20 error trailing spaces (trailing-spaces) + 139:19 error trailing spaces (trailing-spaces) + 143:17 error trailing spaces (trailing-spaces) + 147:20 error trailing spaces (trailing-spaces) + 261:16 error trailing spaces (trailing-spaces) + 263:20 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-ext-0.2.1/.github/workflows/ci.yml + 1:52 error wrong new line character: expected \n (new-lines) + 38:4 error wrong indentation: expected 4 but found 3 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/mime_guess-2.0.5/.github/workflows/rust.yml + 1:11 error wrong new line character: expected \n (new-lines) + 11:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cmake-0.1.58/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cmake-0.1.58/.github/workflows/main.yml + 30:5 error wrong indentation: expected 6 but found 4 (indentation) + 42:13 error too many spaces inside brackets (brackets) + 42:18 error too many spaces inside brackets (brackets) + 74:5 error wrong indentation: expected 6 but found 4 (indentation) + 95:13 error too many spaces inside brackets (brackets) + 95:18 error too many spaces inside brackets (brackets) + 103:5 error wrong indentation: expected 6 but found 4 (indentation) + 121:5 error wrong indentation: expected 6 but found 4 (indentation) + 147:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-bidi-0.3.18/.appveyor.yml + 12:5 error wrong indentation: expected 2 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-bidi-0.3.18/.github/workflows/main.yml + 41:14 error too many spaces after colon (colons) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/combine-4.6.7/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 24:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/approx-0.5.1/.travis.yml + 1:15 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/approx-0.5.1/.github/dependabot.yml + 1:11 error wrong new line character: expected \n (new-lines) + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/approx-0.5.1/.github/workflows/ci-build.yml + 1:22 error wrong new line character: expected \n (new-lines) + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.14.0/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.14.0/.github/workflows/coverage.yml + 4:18 error trailing spaces (trailing-spaces) + 5:16 error trailing spaces (trailing-spaces) + 7:18 error trailing spaces (trailing-spaces) + 8:16 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.14.0/.github/workflows/ci.yml + 18:15 error wrong indentation: expected 12 but found 14 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-native-certs-0.8.3/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-native-certs-0.8.3/.github/workflows/smoke-tests.yaml + 25:14 error too many spaces inside brackets (brackets) + 25:28 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustls-native-certs-0.8.3/.github/workflows/rust.yml + 72:7 warning comment not indented like content (comments-indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/filetime-0.2.29/.github/workflows/main.yml + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + 44:5 error wrong indentation: expected 6 but found 4 (indentation) + 53:5 error wrong indentation: expected 6 but found 4 (indentation) + 65:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc_version-0.4.1/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc_version-0.4.1/.github/workflows/rust.yml + 69:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/dashmap-6.2.1/.github/workflows/ci.yml + 9:5 error wrong indentation: expected 6 but found 4 (indentation) + 14:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/plain-0.2.3/.travis.yml + 6:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/android.yml + 20:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/unsupported.yml + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/freebsd.yml + 20:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/linux.yml + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/macos.yml + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/xattr-1.6.1/.github/workflows/netbsd.yml + 19:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ringbuffer-0.15.0/.github/workflows/coverage.yml + 37:27 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/indexmap-1.9.3/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:37 error too many spaces inside brackets (brackets) + 5:16 error too many spaces inside brackets (brackets) + 5:37 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bittorrent-primitives-0.2.0/.github/workflows/testing.yaml + 72:201 error line too long (218 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-properties-0.1.4/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 26:5 error wrong indentation: expected 6 but found 4 (indentation) + 30:11 error wrong indentation: expected 8 but found 10 (indentation) + 60:5 error wrong indentation: expected 6 but found 4 (indentation) + 64:11 error wrong indentation: expected 8 but found 10 (indentation) + 71:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/cast-0.3.0/.github/workflows/ci.yml + 10:7 error too many spaces before colon (colons) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bs58-0.5.1/.github/workflows/staging.yml + 11:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bs58-0.5.1/.github/workflows/pull_request.yml + 9:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bs58-0.5.1/.github/workflows/nightly.yml + 7:3 error wrong indentation: expected 4 but found 2 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/jobserver-0.1.34/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/jobserver-0.1.34/.github/actions/compile-make/action.yml + 33:201 error line too long (223 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rsa-0.9.10/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/log-0.4.29/.github/workflows/main.yml + 37:5 error wrong indentation: expected 6 but found 4 (indentation) + 42:201 error line too long (296 > 200 characters) (line-length) + 50:5 error wrong indentation: expected 6 but found 4 (indentation) + 63:5 error wrong indentation: expected 6 but found 4 (indentation) + 105:201 error line too long (298 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-named-pipe-0.1.0/appveyor.yml + 6:3 warning comment not indented like content (comments-indentation) + 9:3 warning comment not indented like content (comments-indentation) + 13:1 warning comment not indented like content (comments-indentation) + 15:3 warning comment not indented like content (comments-indentation) + 18:3 warning comment not indented like content (comments-indentation) + 31:13 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atomic-0.6.1/.travis.yml + 5:1 error wrong indentation: expected at least 1 (indentation) + 11:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/arc-swap-1.9.1/.github/workflows/benchmarks.yaml + 7:3 warning comment not indented like content (comments-indentation) + 10:4 warning missing starting space in comment (comments) + 65:12 warning missing starting space in comment (comments) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/arc-swap-1.9.1/.github/workflows/test.yaml + 264:5 error wrong indentation: expected 6 but found 4 (indentation) + 277:11 error wrong indentation: expected 8 but found 10 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.4/.github/workflows/ci.yaml + 21:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-util-0.1.20/.github/workflows/CI.yml + 63:16 error too many spaces inside brackets (brackets) + 63:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/forwarded-header-value-0.1.1/.github/workflows/ci.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 16:5 error wrong indentation: expected 6 but found 4 (indentation) + 32:5 error wrong indentation: expected 6 but found 4 (indentation) + 46:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.3.0/.github/workflows/rust-tests.yml + 41:5 error wrong indentation: expected 6 but found 4 (indentation) + 66:9 error wrong indentation: expected 10 but found 8 (indentation) + 73:5 error wrong indentation: expected 6 but found 4 (indentation) + 103:9 error wrong indentation: expected 10 but found 8 (indentation) + 110:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/docker_credential-1.4.0/.github/workflows/ci.yml + 5:16 error too many spaces inside brackets (brackets) + 5:25 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:25 error too many spaces inside brackets (brackets) + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/backtrace-0.3.76/.github/workflows/publish.yml + 8:10 error too many spaces inside braces (braces) + 8:29 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/spin-0.9.8/.travis.yml + 16:3 error wrong indentation: expected 4 but found 2 (indentation) + 25:6 warning missing starting space in comment (comments) + 31:3 error wrong indentation: expected 4 but found 2 (indentation) + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/spin-0.9.8/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 23:5 error wrong indentation: expected 6 but found 4 (indentation) + 44:5 error wrong indentation: expected 6 but found 4 (indentation) + 52:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/pkg-config-0.3.33/.github/workflows/ci.yml + 6:16 error too many spaces inside brackets (brackets) + 6:23 error too many spaces inside brackets (brackets) + 8:16 error too many spaces inside brackets (brackets) + 8:23 error too many spaces inside brackets (brackets) + 26:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atoi-2.0.0/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atoi-2.0.0/.github/workflows/release.yml + 1:14 error wrong new line character: expected \n (new-lines) + 22:49 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/atoi-2.0.0/.github/workflows/test.yml + 1:21 error wrong new line character: expected \n (new-lines) + 24:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/siphasher-1.0.3/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/http-1.4.1/.github/workflows/ci.yml + 42:6 warning missing starting space in comment (comments) + 103:6 warning missing starting space in comment (comments) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.10.5/.github/workflows/ci.yml + 36:18 error too few spaces after comma (commas) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/testcontainers-0.27.3/tests/test-compose.yml + 10:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/.circleci/config.yml + 12:201 error line too long (238 > 200 characters) (line-length) + 15:201 error line too long (228 > 200 characters) (line-length) + 16:201 error line too long (234 > 200 characters) (line-length) + 17:201 error line too long (261 > 200 characters) (line-length) + 18:201 error line too long (267 > 200 characters) (line-length) + 19:201 error line too long (240 > 200 characters) (line-length) + 20:201 error line too long (246 > 200 characters) (line-length) + 138:9 warning comment not indented like content (comments-indentation) + 160:201 error line too long (520 > 200 characters) (line-length) + 162:201 error line too long (298 > 200 characters) (line-length) + 162:298 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/iana-time-zone-0.1.65/.github/workflows/release.yml + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/iana-time-zone-0.1.65/.github/workflows/rust.yml + 268:201 error line too long (210 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/binascii-0.1.4/.travis.yml + 9:3 error wrong indentation: expected 4 but found 2 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.gitlab-ci.yml + 1:31 error wrong new line character: expected \n (new-lines) + 31:71 error trailing spaces (trailing-spaces) + 64:1 error trailing spaces (trailing-spaces) + 66:5 error wrong indentation: expected 2 but found 4 (indentation) + 67:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/rust-1.12.yml + 1:29 error wrong new line character: expected \n (new-lines) + 39:7 warning comment not indented like content (comments-indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/windows.yml + 1:14 error wrong new line character: expected \n (new-lines) + 16:15 error wrong indentation: expected 12 but found 14 (indentation) + 17:15 error wrong indentation: expected 12 but found 14 (indentation) + 18:15 error wrong indentation: expected 12 but found 14 (indentation) + 19:13 error wrong indentation: expected 10 but found 12 (indentation) + 21:15 error wrong indentation: expected 12 but found 14 (indentation) + 22:15 error wrong indentation: expected 12 but found 14 (indentation) + 23:13 error wrong indentation: expected 10 but found 12 (indentation) + 25:15 error wrong indentation: expected 12 but found 14 (indentation) + 26:15 error wrong indentation: expected 12 but found 14 (indentation) + 27:15 error wrong indentation: expected 12 but found 14 (indentation) + 28:13 error wrong indentation: expected 10 but found 12 (indentation) + 30:15 error wrong indentation: expected 12 but found 14 (indentation) + 31:15 error wrong indentation: expected 12 but found 14 (indentation) + 32:15 error wrong indentation: expected 12 but found 14 (indentation) + 33:13 error wrong indentation: expected 10 but found 12 (indentation) + 35:15 error wrong indentation: expected 12 but found 14 (indentation) + 36:15 error wrong indentation: expected 12 but found 14 (indentation) + 37:13 error wrong indentation: expected 10 but found 12 (indentation) + 39:15 error wrong indentation: expected 12 but found 14 (indentation) + 40:15 error wrong indentation: expected 12 but found 14 (indentation) + 41:15 error wrong indentation: expected 12 but found 14 (indentation) + 42:13 error wrong indentation: expected 10 but found 12 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/linux.yml + 1:12 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/.github/workflows/macos.yml + 1:12 error wrong new line character: expected \n (new-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/parking_lot-0.12.5/.github/workflows/rust.yml + 31:5 error wrong indentation: expected 6 but found 4 (indentation) + 50:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-6.0.0/.github/workflows/rust-tests.yml + 41:5 error wrong indentation: expected 6 but found 4 (indentation) + 66:9 error wrong indentation: expected 10 but found 8 (indentation) + 73:5 error wrong indentation: expected 6 but found 4 (indentation) + 103:9 error wrong indentation: expected 10 but found 8 (indentation) + 110:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/auto_ops-0.3.0/.travis.yml + 1:15 error wrong new line character: expected \n (new-lines) + 21:201 error line too long (698 > 200 characters) (line-length) + 30:201 error line too long (698 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.13.0/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.13.0/.github/workflows/coverage.yml + 4:18 error trailing spaces (trailing-spaces) + 5:16 error trailing spaces (trailing-spaces) + 7:18 error trailing spaces (trailing-spaces) + 8:16 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.13.0/.github/workflows/ci.yml + 18:15 error wrong indentation: expected 12 but found 14 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/yansi-1.0.1/.github/workflows/ci.yml + 21:14 error too many spaces inside braces (braces) + 21:49 error too many spaces inside braces (braces) + 22:14 error too many spaces inside braces (braces) + 22:52 error too many spaces inside braces (braces) + 23:14 error too many spaces inside braces (braces) + 23:48 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/httparse-1.10.1/.github/workflows/cifuzz.yml + 7:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/.github/workflows/rust.yaml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/.github/workflows/audit.yml + 4:11 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/version_check-0.9.5/.github/workflows/ci.yml + 15:14 error too many spaces inside braces (braces) + 15:49 error too many spaces inside braces (braces) + 16:14 error too many spaces inside braces (braces) + 16:52 error too many spaces inside braces (braces) + 17:14 error too many spaces inside braces (braces) + 17:48 error too many spaces inside braces (braces) + 20:18 error too many spaces inside braces (braces) + 20:53 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/.github/workflows/ci.yaml + 21:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro-crate-3.5.0/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 24:5 error wrong indentation: expected 6 but found 4 (indentation) + 37:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.11.1+wasi-snapshot-preview1/.github/workflows/main.yml + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + 28:5 error wrong indentation: expected 6 but found 4 (indentation) + 39:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/openssl-probe-0.2.1/.github/workflows/main.yml + 21:9 error wrong indentation: expected 10 but found 8 (indentation) + 25:5 error wrong indentation: expected 6 but found 4 (indentation) + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + 86:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/inlinable_string-0.1.15/.travis.yml + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 15:1 error wrong indentation: expected 2 but found 0 (indentation) + 19:1 error wrong indentation: expected 2 but found 0 (indentation) + 24:1 error wrong indentation: expected 2 but found 0 (indentation) + 30:1 error wrong indentation: expected 2 but found 0 (indentation) + 35:3 error wrong indentation: expected 4 but found 2 (indentation) + 36:201 error line too long (696 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/indexmap-2.14.0/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:21 error too many spaces inside brackets (brackets) + 5:16 error too many spaces inside brackets (brackets) + 5:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/ISSUE_TEMPLATE/bug_report.yml + 12:90 error trailing spaces (trailing-spaces) + 13:60 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/ISSUE_TEMPLATE/feature_request.yml + 37:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/workflows/sqlx.yml + 24:19 error too many spaces inside brackets (brackets) + 24:36 error too many spaces inside brackets (brackets) + 25:15 error too many spaces inside brackets (brackets) + 25:40 error too many spaces inside brackets (brackets) + 82:25 error trailing spaces (trailing-spaces) + 88:25 error trailing spaces (trailing-spaces) + 94:25 error trailing spaces (trailing-spaces) + 100:25 error trailing spaces (trailing-spaces) + 121:19 error too many spaces inside brackets (brackets) + 121:36 error too many spaces inside brackets (brackets) + 122:19 error too many spaces inside brackets (brackets) + 122:44 error too many spaces inside brackets (brackets) + 205:20 error too many spaces inside brackets (brackets) + 205:27 error too many spaces inside brackets (brackets) + 206:19 error too many spaces inside brackets (brackets) + 206:36 error too many spaces inside brackets (brackets) + 207:15 error too many spaces inside brackets (brackets) + 207:63 error too many spaces inside brackets (brackets) + 222:22 error trailing spaces (trailing-spaces) + 322:17 error too many spaces inside brackets (brackets) + 322:19 error too many spaces inside brackets (brackets) + 323:19 error too many spaces inside brackets (brackets) + 323:36 error too many spaces inside brackets (brackets) + 324:15 error too many spaces inside brackets (brackets) + 324:63 error too many spaces inside brackets (brackets) + 422:19 error too many spaces inside brackets (brackets) + 422:49 error too many spaces inside brackets (brackets) + 423:19 error too many spaces inside brackets (brackets) + 423:36 error too many spaces inside brackets (brackets) + 424:15 error too many spaces inside brackets (brackets) + 424:63 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/.github/workflows/sqlx-cli.yml + 91:1 error trailing spaces (trailing-spaces) + 93:1 error trailing spaces (trailing-spaces) + 99:1 error trailing spaces (trailing-spaces) + 101:1 error trailing spaces (trailing-spaces) + 103:1 error trailing spaces (trailing-spaces) + 110:1 error trailing spaces (trailing-spaces) + 112:1 error trailing spaces (trailing-spaces) + 114:1 error trailing spaces (trailing-spaces) + 127:1 error trailing spaces (trailing-spaces) + 129:1 error trailing spaces (trailing-spaces) + 131:1 error trailing spaces (trailing-spaces) + 133:1 error trailing spaces (trailing-spaces) + 170:1 error trailing spaces (trailing-spaces) + 172:1 error trailing spaces (trailing-spaces) + 178:1 error trailing spaces (trailing-spaces) + 180:1 error trailing spaces (trailing-spaces) + 182:1 error trailing spaces (trailing-spaces) + 189:1 error trailing spaces (trailing-spaces) + 191:1 error trailing spaces (trailing-spaces) + 193:1 error trailing spaces (trailing-spaces) + 206:1 error trailing spaces (trailing-spaces) + 208:1 error trailing spaces (trailing-spaces) + 210:1 error trailing spaces (trailing-spaces) + 212:1 error trailing spaces (trailing-spaces) + 241:1 error trailing spaces (trailing-spaces) + 243:1 error trailing spaces (trailing-spaces) + 249:1 error trailing spaces (trailing-spaces) + 251:1 error trailing spaces (trailing-spaces) + 253:1 error trailing spaces (trailing-spaces) + 260:1 error trailing spaces (trailing-spaces) + 262:1 error trailing spaces (trailing-spaces) + 264:1 error trailing spaces (trailing-spaces) + 277:1 error trailing spaces (trailing-spaces) + 279:1 error trailing spaces (trailing-spaces) + 281:1 error trailing spaces (trailing-spaces) + 283:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/tests/docker-compose.yml + 252:201 error line too long (202 > 200 characters) (line-length) + 288:201 error line too long (202 > 200 characters) (line-length) + 324:201 error line too long (202 > 200 characters) (line-length) + 360:201 error line too long (202 > 200 characters) (line-length) + 396:201 error line too long (202 > 200 characters) (line-length) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aho-corasick-1.1.4/.github/workflows/ci.yml + 6:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:3 error wrong indentation: expected 4 but found 2 (indentation) + 50:9 error wrong indentation: expected 10 but found 8 (indentation) + 88:5 error wrong indentation: expected 6 but found 4 (indentation) + 139:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-normalization-0.1.25/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:23 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:23 error too many spaces inside brackets (brackets) + 46:14 error too many spaces inside brackets (brackets) + 46:44 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/quickcheck-1.1.0/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 40:9 error wrong indentation: expected 10 but found 8 (indentation) + 62:5 error wrong indentation: expected 6 but found 4 (indentation) + 77:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/formatjson-0.3.1/.github/workflows/rust.yml + 5:16 error too many spaces inside brackets (brackets) + 5:25 error too many spaces inside brackets (brackets) + 7:16 error too many spaces inside brackets (brackets) + 7:25 error too many spaces inside brackets (brackets) + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bytes-1.11.1/.github/workflows/ci.yml + 28:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/alloc-no-stdlib-2.0.4/.travis.yml + 17:53 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ipnet-2.12.0/.travis.yml + 8:3 error wrong indentation: expected 4 but found 2 (indentation) + 9:1 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/either-1.16.0/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ident_case-1.0.1/.travis.yml + 5:12 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/matchers-0.2.0/.github/workflows/ci.yml + 90:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sharded-slab-0.1.7/.github/workflows/release.yml + 22:52 error no new line character at the end of file (new-line-at-end-of-file) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/ureq-3.3.0/.github/workflows/test.yml + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + 160:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/unicase-2.9.0/.github/workflows/CI.yml + 83:1 error too many blank lines (1 > 0) (empty-lines) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/axum-server-0.8.0/.github/workflows/ci.yml + 54:14 error too many spaces inside braces (braces) + 54:27 error too many spaces inside braces (braces) + 55:14 error too many spaces inside braces (braces) + 55:70 error too many spaces inside braces (braces) + 57:15 error wrong indentation: expected 12 but found 14 (indentation) + 58:15 error wrong indentation: expected 12 but found 14 (indentation) + 59:13 error wrong indentation: expected 10 but found 12 (indentation) + 61:15 error wrong indentation: expected 12 but found 14 (indentation) + 62:15 error wrong indentation: expected 12 but found 14 (indentation) + 63:15 error wrong indentation: expected 12 but found 14 (indentation) + 64:13 error wrong indentation: expected 10 but found 12 (indentation) + 66:15 error wrong indentation: expected 12 but found 14 (indentation) + 67:15 error wrong indentation: expected 12 but found 14 (indentation) + 68:15 error wrong indentation: expected 12 but found 14 (indentation) + 69:13 error wrong indentation: expected 10 but found 12 (indentation) + 90:14 error too many spaces inside braces (braces) + 90:30 error too many spaces inside braces (braces) + 92:15 error wrong indentation: expected 12 but found 14 (indentation) + 93:15 error wrong indentation: expected 12 but found 14 (indentation) + 94:15 error wrong indentation: expected 12 but found 14 (indentation) + 95:13 error wrong indentation: expected 10 but found 12 (indentation) + 119:14 error too many spaces inside braces (braces) + 119:43 error too many spaces inside braces (braces) + 120:14 error too many spaces inside braces (braces) + 120:54 error too many spaces inside braces (braces) + 122:14 error too many spaces inside braces (braces) + 122:27 error too many spaces inside braces (braces) + 123:14 error too many spaces inside braces (braces) + 123:70 error too many spaces inside braces (braces) + 125:15 error wrong indentation: expected 12 but found 14 (indentation) + 126:15 error wrong indentation: expected 12 but found 14 (indentation) + 127:13 error wrong indentation: expected 10 but found 12 (indentation) + 129:15 error wrong indentation: expected 12 but found 14 (indentation) + 130:15 error wrong indentation: expected 12 but found 14 (indentation) + 131:15 error wrong indentation: expected 12 but found 14 (indentation) + 132:13 error wrong indentation: expected 10 but found 12 (indentation) + 134:15 error wrong indentation: expected 12 but found 14 (indentation) + 135:15 error wrong indentation: expected 12 but found 14 (indentation) + 136:15 error wrong indentation: expected 12 but found 14 (indentation) + 137:13 error wrong indentation: expected 10 but found 12 (indentation) + 160:14 error too many spaces inside braces (braces) + 160:27 error too many spaces inside braces (braces) + 161:14 error too many spaces inside braces (braces) + 161:70 error too many spaces inside braces (braces) + 163:15 error wrong indentation: expected 12 but found 14 (indentation) + 164:15 error wrong indentation: expected 12 but found 14 (indentation) + 165:13 error wrong indentation: expected 10 but found 12 (indentation) + 167:15 error wrong indentation: expected 12 but found 14 (indentation) + 168:15 error wrong indentation: expected 12 but found 14 (indentation) + 169:15 error wrong indentation: expected 12 but found 14 (indentation) + 170:13 error wrong indentation: expected 10 but found 12 (indentation) + 172:15 error wrong indentation: expected 12 but found 14 (indentation) + 173:15 error wrong indentation: expected 12 but found 14 (indentation) + 174:15 error wrong indentation: expected 12 but found 14 (indentation) + 175:13 error wrong indentation: expected 10 but found 12 (indentation) + 201:14 error too many spaces inside braces (braces) + 201:27 error too many spaces inside braces (braces) + 202:14 error too many spaces inside braces (braces) + 202:70 error too many spaces inside braces (braces) + 204:15 error wrong indentation: expected 12 but found 14 (indentation) + 205:15 error wrong indentation: expected 12 but found 14 (indentation) + 206:13 error wrong indentation: expected 10 but found 12 (indentation) + 208:15 error wrong indentation: expected 12 but found 14 (indentation) + 209:15 error wrong indentation: expected 12 but found 14 (indentation) + 210:15 error wrong indentation: expected 12 but found 14 (indentation) + 211:13 error wrong indentation: expected 10 but found 12 (indentation) + 213:15 error wrong indentation: expected 12 but found 14 (indentation) + 214:15 error wrong indentation: expected 12 but found 14 (indentation) + 215:15 error wrong indentation: expected 12 but found 14 (indentation) + 216:13 error wrong indentation: expected 10 but found 12 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc-demangle-0.1.27/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/rustc-demangle-0.1.27/.github/workflows/main.yml + 12:5 error wrong indentation: expected 6 but found 4 (indentation) + 24:5 error wrong indentation: expected 6 but found 4 (indentation) + 35:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bytemuck-1.25.0/.github/workflows/rust.yml + 21:9 error wrong indentation: expected 10 but found 8 (indentation) + 21:12 error too many spaces inside braces (braces) + 21:44 error too many spaces inside braces (braces) + 22:12 error too many spaces inside braces (braces) + 22:44 error too many spaces inside braces (braces) + 23:12 error too many spaces inside braces (braces) + 23:44 error too many spaces inside braces (braces) + 24:12 error too many spaces inside braces (braces) + 24:42 error too many spaces inside braces (braces) + 25:12 error too many spaces inside braces (braces) + 25:45 error too many spaces inside braces (braces) + 27:12 error too many spaces inside braces (braces) + 27:43 error too many spaces inside braces (braces) + 28:12 error too many spaces inside braces (braces) + 28:45 error too many spaces inside braces (braces) + 29:12 error too many spaces inside braces (braces) + 29:56 error too many spaces inside braces (braces) + 30:12 error too many spaces inside braces (braces) + 30:55 error too many spaces inside braces (braces) + 31:12 error too many spaces inside braces (braces) + 31:54 error too many spaces inside braces (braces) + 33:5 error wrong indentation: expected 6 but found 4 (indentation) + 56:5 error wrong indentation: expected 6 but found 4 (indentation) + 73:5 error wrong indentation: expected 6 but found 4 (indentation) + 94:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/simd_cesu8-1.1.1/.github/workflows/ci.yml + 3:6 error too many spaces inside brackets (brackets) + 3:25 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hybrid-array-0.4.12/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hybrid-array-0.4.12/.github/workflows/publish.yml + 4:12 error too many spaces inside brackets (brackets) + 4:17 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/byteorder-1.5.0/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 52:9 error wrong indentation: expected 10 but found 8 (indentation) + 90:5 error wrong indentation: expected 6 but found 4 (indentation) + 161:5 error wrong indentation: expected 6 but found 4 (indentation) + 175:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/simd-adler32-0.3.9/.github/workflows/build.yaml + 92:16 error trailing spaces (trailing-spaces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/glob-0.3.3/.github/workflows/rust.yml + 34:5 error wrong indentation: expected 6 but found 4 (indentation) + 48:5 error wrong indentation: expected 6 but found 4 (indentation) + 63:5 error wrong indentation: expected 6 but found 4 (indentation) + 77:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/.github/workflows/ci.yml + 18:14 error too many spaces inside braces (braces) + 18:49 error too many spaces inside braces (braces) + 19:14 error too many spaces inside braces (braces) + 19:52 error too many spaces inside braces (braces) + 20:14 error too many spaces inside braces (braces) + 20:48 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/hyper-timeout-0.5.2/.github/workflows/ci.yml + 4:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/walkdir-2.5.0/.github/workflows/ci.yml + 5:5 error wrong indentation: expected 6 but found 4 (indentation) + 8:5 error wrong indentation: expected 6 but found 4 (indentation) + 10:3 error wrong indentation: expected 4 but found 2 (indentation) + 40:9 error wrong indentation: expected 10 but found 8 (indentation) + 65:5 error wrong indentation: expected 6 but found 4 (indentation) + 85:5 error wrong indentation: expected 6 but found 4 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/castaway-0.2.4/.github/dependabot.yml + 3:1 error wrong indentation: expected at least 1 (indentation) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/equivalent-1.0.2/.github/workflows/ci.yml + 3:16 error too many spaces inside brackets (brackets) + 3:21 error too many spaces inside brackets (brackets) + 5:16 error too many spaces inside brackets (brackets) + 5:21 error too many spaces inside brackets (brackets) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-diagnostics-0.10.1/.github/workflows/ci.yml + 18:14 error too many spaces inside braces (braces) + 18:49 error too many spaces inside braces (braces) + 19:14 error too many spaces inside braces (braces) + 19:52 error too many spaces inside braces (braces) + 20:14 error too many spaces inside braces (braces) + 20:48 error too many spaces inside braces (braces) + +./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/utf8-zero-0.8.1/.github/workflows/ci.yml + 18:5 error wrong indentation: expected 6 but found 4 (indentation) + + + +2026-05-27T21:24:31.438756Z ERROR yaml: YAML linting failed. Please fix the issues above. (1.741s) +2026-05-27T21:24:31.438765Z ERROR torrust_linting::cli: YAML linting failed: YAML linting failed +2026-05-27T21:24:31.439555Z  INFO toml: Scanning TOML files... + +2026-05-27T21:24:34.155201Z ERROR toml: TOML formatting failed. Please fix the issues above. (2.716s) +2026-05-27T21:24:34.155209Z ERROR toml: Run 'taplo fmt **/*.toml' to auto-fix formatting issues. +2026-05-27T21:24:34.155213Z ERROR torrust_linting::cli: TOML linting failed: TOML formatting failed +2026-05-27T21:24:34.156112Z  INFO cspell: Running spell check on all files... +2026-05-27T21:24:36.822018Z  INFO cspell: All files passed spell checking! (2.666s) +2026-05-27T21:24:36.822032Z  INFO clippy: Running Rust Clippy linter... +2026-05-27T21:24:37.242830Z  INFO clippy: Clippy linting completed successfully! (0.421s) +2026-05-27T21:24:37.242844Z  INFO rustfmt: Running Rust formatter check... +2026-05-27T21:24:37.514046Z  INFO rustfmt: Rust formatting check passed! (0.271s) +2026-05-27T21:24:37.514058Z  INFO shellcheck: Running ShellCheck on shell scripts... +2026-05-27T21:24:38.309546Z  INFO shellcheck: Found 77 shell script(s) to check + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/axum-client-ip-0.7.0/.pre-commit.sh line 9: + read -p "Link this script as the git pre-commit hook to avoid further manual running? (y/N): " answer + ^--^ SC2162 (info): read without -r will mangle backslashes. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bit-vec-0.4.4/crusader.sh line 4: +cd cargo-crusader +^---------------^ SC2164 (warning): Use 'cd ... || exit' or 'cd ... || return' in case cd fails. + +Did you mean: +cd cargo-crusader || exit + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bit-vec-0.4.4/crusader.sh line 6: +export PATH=$PATH:`pwd`/target/release/ + ^--^ SC2155 (warning): Declare and assign separately to avoid masking return values. + ^---^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: +export PATH=$PATH:$(pwd)/target/release/ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 8: +for test_file in $(ls tests/); do + ^----------^ SC2045 (error): Iterating over ls output is fragile. Use globs. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 14: + > results/failures-${test_name}.csv + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + > results/failures-"${test_name}".csv + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 16: + cat tests/${test_file} \ + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cat tests/"${test_file}" \ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 18: + > results/result-${test_name}.csv + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + > results/result-"${test_name}".csv + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-0.1.44/test-macros/bin/macro-results.sh line 20: + cat results/result-${test_name}.csv >> results/result.csv + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cat results/result-"${test_name}".csv >> results/result.csv + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/combine-4.6.7/release.sh line 9: +clog --$VERSION && \ + ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +clog --"$VERSION" && \ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/combine-4.6.7/release.sh line 12: + cargo release --execute $VERSION + ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cargo release --execute "$VERSION" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/darling-0.20.11/compiletests.sh line 1: +RUSTFLAGS="--cfg=compiletests" cargo +1.77.0 test --test compiletests +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.6/ci/rustup.sh line 11: + $run $PWD/ci/test_full.sh + ^--^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + $run "$PWD"/ci/test_full.sh + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/num-bigint-dig-0.8.6/ci/test_full.sh line 5: +echo Testing num-bigint on rustc ${TRAVIS_RUST_VERSION} + ^--------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +echo Testing num-bigint on rustc "${TRAVIS_RUST_VERSION}" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-windows-debug-crt-static-test.sh line 20: +case `uname -s` in + ^--------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: +case $(uname -s) in + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-windows-debug-crt-static-test.sh line 24: + *) echo Unknown OS: `uname -s`; exit 1;; + ^--------^ SC2046 (warning): Quote this to prevent word splitting. + ^--------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: + *) echo Unknown OS: $(uname -s); exit 1;; + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-windows-debug-crt-static-test.sh line 27: +TMP_DIR=`mktemp -d` + ^---------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`. + +Did you mean: +TMP_DIR=$(mktemp -d) + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-valgrind.sh line 206: +if eval ${CARGO_CMD}; then + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +if eval "${CARGO_CMD}"; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 10: +git clone https://github.com/aws/s2n-quic.git $S2N_QUIC_TEMP + ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +git clone https://github.com/aws/s2n-quic.git "$S2N_QUIC_TEMP" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 11: +cd $S2N_QUIC_TEMP + ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +cd "$S2N_QUIC_TEMP" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 15: + find ./ -type f -name "Cargo.toml" | xargs sed -i '' -e "s|${QUIC_AWS_LC_RS_STRING}|${QUIC_PATH_STRING}|" + ^-- SC2038 (warning): Use 'find .. -print0 | xargs -0 ..' or 'find .. -exec .. +' to allow non-alphanumeric filenames. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-s2n-quic-integration.sh line 17: + find ./ -type f -name "Cargo.toml" | xargs sed -i -e "s|${QUIC_AWS_LC_RS_STRING}|${QUIC_PATH_STRING}|" + ^-- SC2038 (warning): Use 'find .. -print0 | xargs -0 ..' or 'find .. -exec .. +' to allow non-alphanumeric filenames. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/aws-lc-rs-1.17.0/scripts/run-rustls-integration.sh line 116: + trap "rm -f '$tmp_file'" RETURN + ^-------^ SC2064 (warning): Use single quotes, otherwise this expands now rather than when signalled. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/libsqlite3-sys-0.30.1/upgrade_sqlcipher.sh line 13: +mkdir -p $SCRIPT_DIR/sqlcipher.src + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +mkdir -p "$SCRIPT_DIR"/sqlcipher.src + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/futures-intrusive-0.5.0/benches/bench_mutex.sh line 1: +# This is just a convenience script to filter the important facts out of the criterion report +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/darling-0.23.0/compiletests.sh line 1: +RUSTFLAGS="--cfg=compiletests" cargo +1.88.0 test --test compiletests +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/resources/dockerfiles/bin/run_integration_tests.sh line 7: +export REGISTRY_PASSWORD=$(date | md5sum | cut -f1 -d\ ) + ^---------------^ SC2155 (warning): Declare and assign separately to avoid masking return values. + ^-----------------------------^ SC2046 (warning): Quote this to prevent word splitting. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/resources/dockerfiles/bin/run_integration_tests.sh line 9: +echo -n "${REGISTRY_PASSWORD}" | docker run --rm -i --entrypoint=htpasswd --volumes-from config nimmis/alpine-apache -i -B -c /etc/docker/registry/htpasswd bollard + ^-- SC3037 (warning): In POSIX sh, echo flags are undefined. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/bollard-0.20.2/resources/dockerfiles/bin/run_integration_tests.sh line 24: +docker run -e RUST_LOG=bollard=trace -e REGISTRY_PASSWORD -e REGISTRY_HTTP_ADDR=localhost:5000 -v /var/run/docker.sock:/var/run/docker.sock $DOCKER_PARAMETERS -ti --rm bollard cargo test $@ -- --test-threads 1 + ^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements. + +Did you mean: +docker run -e RUST_LOG=bollard=trace -e REGISTRY_PASSWORD -e REGISTRY_HTTP_ADDR=localhost:5000 -v /var/run/docker.sock:/var/run/docker.sock "$DOCKER_PARAMETERS" -ti --rm bollard cargo test $@ -- --test-threads 1 + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 1: +#!/bin/bash + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 2: +set -ex + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 3: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 4: +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 5: +cd $SCRIPTDIR + ^--------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: +cd "$SCRIPTDIR" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 6: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 7: +export VCPKG_ROOT=$SCRIPTDIR/../vcp + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 8: +export VCPKGRS_TRIPLET=test-triplet + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 9: +export VCPKG_DEFAULT_TRIPLET=test-triplet + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 10: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 11: +cp $VCPKG_ROOT/triplets/x64-linux.cmake $VCPKG_ROOT/triplets/test-triplet.cmake + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: +cp "$VCPKG_ROOT"/triplets/x64-linux.cmake "$VCPKG_ROOT"/triplets/test-triplet.cmake + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 12: +for port in harfbuzz ; do + ^------^ SC2043 (warning): This loop will only ever run once. Bad quoting or missing glob/expansion? + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 13: + # check that the port fails before it is installed + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 14: + $VCPKG_ROOT/vcpkg remove --no-binarycaching $port || true + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg remove --no-binarycaching $port || true + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 15: + cargo clean --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 16: + cargo run --manifest-path $port/Cargo.toml && exit 2 + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 17: + echo THIS FAILURE IS EXPECTED + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 18: + echo This is to ensure that we are not spuriously succeeding because the libraries already exist somewhere on the build machine. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 19: + # disable binary caching because it breaks this build as of vcpkg 53e6588 (since vcpkg 52a9d9a) + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 20: + $VCPKG_ROOT/vcpkg install --no-binarycaching $port + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg install --no-binarycaching $port + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 21: + cargo run --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/vcpkgrs_target.sh line 22: +done + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 1: +#!/bin/bash + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 2: +set -ex + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 3: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 4: +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 5: +cd $SCRIPTDIR + ^--------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: +cd "$SCRIPTDIR" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 6: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 7: +export VCPKG_ROOT=$SCRIPTDIR/../vcp + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 8: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 9: +source ../setup_vcp.sh + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 10: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 11: +for port in harfbuzz ; do + ^------^ SC2043 (warning): This loop will only ever run once. Bad quoting or missing glob/expansion? + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 12: + # check that the port fails before it is installed + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 13: + $VCPKG_ROOT/vcpkg remove $port || true + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg remove $port || true + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 14: + cargo clean --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 15: + cargo run --manifest-path $port/Cargo.toml && exit 2 + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 16: + echo THIS FAILURE IS EXPECTED + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 17: + echo This is to ensure that we are not spuriously succeeding because the libraries already exist somewhere on the build machine. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 18: + $VCPKG_ROOT/vcpkg install $port + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + "$VCPKG_ROOT"/vcpkg install $port + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 19: + cargo run --manifest-path $port/Cargo.toml + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/tests/run.sh line 20: +done + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 1: +#!/bin/bash + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 2: +# + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 3: +# This script can be sourced to ensure VCPKG_ROOT points at a bootstrapped vcpkg repository. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 4: +# It will also modify the environment (if sourced) to reflect any overrides in + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 5: +# vcpkg triplet used neccesary to match the semantics of vcpkg-rs. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 6: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 7: +if [ "$VCPKG_ROOT" == "" ]; then + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 8: + echo "VCPKG_ROOT must be set." + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 9: + exit 1 + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 10: +fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 11: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 12: +# Bootstrap ./vcp if it doesn't already exist. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 13: +if [ ! -d "$VCPKG_ROOT" ]; then + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 14: + echo "Bootstrapping ./vcp for systest" + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 15: + pushd .. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 16: + git clone https://github.com/microsoft/vcpkg.git vcp + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 17: + cd vcp + ^----^ SC2164 (warning): Use 'cd ... || exit' or 'cd ... || return' in case cd fails. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + cd vcp || exit + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 18: + if [ "$OS" == "Windows_NT" ]; then + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 19: + ./bootstrap-vcpkg.bat + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 20: + else + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 21: + ./bootstrap-vcpkg.sh + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 22: + fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 23: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 24: + popd + ^--^ SC2164 (warning): Use 'popd ... || exit' or 'popd ... || return' in case popd fails. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + +Did you mean: + popd || exit + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 25: +fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 26: + +^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 27: +# Override triplet used if we are on Windows, as the default there is 32bit + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 28: +# dynamic, whereas on 64 bit vcpkg-rs will prefer static with dynamic CRT + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 29: +# linking. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 30: +if [ "$OS" == "Windows_NT" -a "$PROCESSOR_ARCHITECTURE" == "AMD64" ] ; then + ^-- SC2166 (warning): Prefer [ p ] && [ q ] as [ p -a q ] is not well defined. + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 31: + export VCPKG_DEFAULT_TRIPLET=x64-windows-static-md + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/vcpkg-0.2.15/setup_vcp.sh line 32: +fi + ^-- SC1017 (error): Literal carriage return. Run script through tr -d '\r' . + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 12: + width=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\1/') + ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + width=$(echo "$line" | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\1/') + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 13: + params=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\2/' | sed 's/ /, /g' | sed 's/=/: /g') + ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + params=$(echo "$line" | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\2/' | sed 's/ /, /g' | sed 's/=/: /g') + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 14: + name=$(echo $line | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\3/' | sed 's/[-\/]/_/g') + ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + name=$(echo "$line" | sed 's/width=\([0-9]*\) \(.*\) name="\(.*\)"/\3/' | sed 's/[-\/]/_/g') + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 18: + echo -n " " + ^-- SC3037 (warning): In POSIX sh, echo flags are undefined. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 19: + if [ $width -le 8 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + if [ "$width" -le 8 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 21: + elif [ $width -le 16 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 16 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 23: + elif [ $width -le 32 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 32 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 25: + elif [ $width -le 64 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 64 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/crc-catalog-2.5.0/generate_tests.sh line 27: + elif [ $width -le 128 ]; then + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + elif [ "$width" -le 128 ]; then + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/ci/script.sh line 1: +set -ex +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/ci/script.sh line 25: + cargo build --features "$FEATURES" $BUILD_ARGS + ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + cargo build --features "$FEATURES" "$BUILD_ARGS" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/criterion-0.5.1/ci/install.sh line 1: +set -ex +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 1: +# Requires Github CLI and `jq` +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 19: + PAGE=$(gh api graphql -f after="$CURSOR" -f query='query($after: String) { + ^-- SC2016 (info): Expressions don't expand in single quotes, use double quotes for that. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 68: +echo "Found $COUNT pull requests merged on or after $1\n" + ^-- SC2028 (info): echo may not expand escape sequences. Use printf. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 70: +if [ -z $COUNT ]; then exit 0; fi; + ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +if [ -z "$COUNT" ]; then exit 0; fi; + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 75: +echo "\nLinks:" + ^--------^ SC2028 (info): echo may not expand escape sequences. Use printf. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 78: +echo "\nNew Authors:" + ^--------------^ SC2028 (info): echo may not expand escape sequences. Use printf. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 82: +echo "$PULLS" | jq -r '.[].author.login' | while read author; do + ^--^ SC2162 (info): read without -r will mangle backslashes. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/gen-changelog.sh line 92: + echo $author_entry + ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$author_entry" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/sqlx-0.8.6/tests/mssql/configure-db.sh line 7: +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -d master -i setup.sql + ^----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -d master -i setup.sql + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/encoding_rs-0.8.35/ci/miri.sh line 1: +set -ex +^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 36: + local tab=$(printf '\t') + ^-^ SC2155 (warning): Declare and assign separately to avoid masking return values. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 37: + local matches=$(git grep -PIn "${tab}" "${PROJECT_ROOT}" | grep -v 'LICENSE') + ^-----^ SC2155 (warning): Declare and assign separately to avoid masking return values. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 47: + local matches=$(git grep -PIn "\s+$" "${PROJECT_ROOT}" | grep -v -F '.stderr:') + ^-----^ SC2155 (warning): Declare and assign separately to avoid masking return values. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/figment-0.10.19/scripts/test.sh line 88: + $CARGO test --all-features --all $@ + ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 31: +for arg in $*; do + ^-- SC2048 (warning): Use "$@" (with quotes) to prevent whitespace problems. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 143: + while read executable; do + ^--^ SC2162 (info): read without -r will mangle backslashes. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 145: + llvm-profdata-$llvm_version merge -sparse ""$coverage_dir"/$basename.profraw" -o "$coverage_dir"/$basename.profdata + ^-----------^ SC2027 (warning): The surrounding quotes actually unquote this. Remove or escape them. + ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. + ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + llvm-profdata-$llvm_version merge -sparse """$coverage_dir""/$basename.profraw" -o "$coverage_dir"/"$basename".profdata + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 148: + --instr-profile "$coverage_dir"/$basename.profdata \ + ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + --instr-profile "$coverage_dir"/"$basename".profdata \ + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/mk/cargo.sh line 151: + > "$coverage_dir"/reports/coverage-$basename.txt + ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + > "$coverage_dir"/reports/coverage-"$basename".txt + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_actions.sh line 43: + echo "$output" | sed "s|^|$script_name: |" >&2 + ^-- SC2001 (style): See if you can use ${variable//search/replace} instead. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_job_dependencies.sh line 15: +for i in $(find .github -iname '*.yaml' -or -iname '*.yml'); do + ^-- SC2044 (warning): For loops over find output are fragile. Use find -exec or a while read loop. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_job_dependencies.sh line 27: + echo "$i: all-jobs-succeed missing dependencies on some jobs: $missing_jobs" | tee -a $GITHUB_STEP_SUMMARY >&2 + ^------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$i: all-jobs-succeed missing dependencies on some jobs: $missing_jobs" | tee -a "$GITHUB_STEP_SUMMARY" >&2 + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_todo.sh line 32: + commit_output=$(echo "$commit_output" | sed "s/^/COMMIT_MESSAGE:/") + ^-- SC2001 (style): See if you can use ${variable//search/replace} instead. + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_versions.sh line 47: + echo "$SUCCESS_MSG" | tee -a $GITHUB_STEP_SUMMARY + ^------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$SUCCESS_MSG" | tee -a "$GITHUB_STEP_SUMMARY" + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/ci/check_versions.sh line 49: + echo "$FAILURE_MSG" | tee -a $GITHUB_STEP_SUMMARY >&2 + ^------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. + +Did you mean: + echo "$FAILURE_MSG" | tee -a "$GITHUB_STEP_SUMMARY" >&2 + + +In ./.tmp/issue-1841/cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.48/cargo.sh line 17: +./tools/target/debug/cargo-zerocopy $@ + ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements. + +For more information: + https://www.shellcheck.net/wiki/SC1017 -- Literal carriage return. Run scri... + https://www.shellcheck.net/wiki/SC2045 -- Iterating over ls output is fragi... + https://www.shellcheck.net/wiki/SC2068 -- Double quote array expansions to ... + + +2026-05-27T21:24:39.049486Z ERROR shellcheck: shellcheck failed (1.535s) +2026-05-27T21:24:39.049505Z ERROR torrust_linting::cli: Shell script linting failed: shellcheck failed +2026-05-27T21:24:39.049508Z ERROR torrust_linting::cli: Some linters failed +[warm] lint_seconds=16 +[warm] lint_exit_code=1 +[warm] test_docs_start + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test packages/located-error/src/lib.rs - (line 4) ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.17s; merged doctests compilation took 1.16s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test packages/net-primitives/src/service_binding.rs - service_binding::ServiceBinding (line 114) ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.57s; merged doctests compilation took 1.57s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 2 tests +test contrib/bencode/src/lib.rs - (line 7) ... ok +test contrib/bencode/src/lib.rs - (line 23) ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.83s + +all doctests ran in 0.86s; merged doctests compilation took 0.02s + +running 15 tests +test packages/tracker-core/src/announce_handler.rs - announce_handler (line 61) - compile ... ok +test packages/tracker-core/src/announce_handler.rs - announce_handler (line 15) - compile ... ok +test packages/tracker-core/src/databases/setup.rs - databases::setup::initialize_database (line 78) - compile ... ok +test packages/tracker-core/src/scrape_handler.rs - scrape_handler (line 12) - compile ... ok +test packages/tracker-core/src/scrape_handler.rs - scrape_handler (line 43) - compile ... ok +test packages/tracker-core/src/torrent/mod.rs - torrent (line 105) - compile ... ok +test packages/tracker-core/src/torrent/mod.rs - torrent (line 86) - compile ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key::verify_key_expiration (line 141) ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key (line 31) ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key (line 19) ... ok +test packages/tracker-core/src/authentication/key/mod.rs - authentication::key::generate_key (line 98) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::ParseKeyError (line 178) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::Key (line 116) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::Key (line 123) ... ok +test packages/tracker-core/src/authentication/key/peer_key.rs - authentication::key::peer_key::PeerKey (line 32) ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 15.32s; merged doctests compilation took 15.31s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 11 tests +test packages/http-protocol/src/percent_encoding.rs - percent_encoding::percent_decode_info_hash (line 35) ... ok +test packages/http-protocol/src/percent_encoding.rs - percent_encoding::percent_decode_peer_id (line 65) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param (line 33) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param_vec (line 75) ... ok +test packages/http-protocol/src/v1/responses/announce.rs - v1::responses::announce::CompactPeer (line 231) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param (line 46) ... ok +test packages/http-protocol/src/v1/query.rs - v1::query::Query::get_param_vec (line 62) ... ok +test packages/http-protocol/src/v1/requests/announce.rs - v1::requests::announce::Announce (line 45) ... ok +test packages/http-protocol/src/v1/responses/announce.rs - v1::responses::announce::NormalPeer (line 181) ... ok +test packages/http-protocol/src/v1/responses/error.rs - v1::responses::error::Error::write (line 30) ... ok +test packages/http-protocol/src/v1/responses/scrape.rs - v1::responses::scrape::Bencoded (line 40) ... ok + +test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 2.87s; merged doctests compilation took 2.87s + +running 2 tests +test packages/primitives/src/peer.rs - peer (line 5) - compile ... ok +test packages/primitives/src/peer.rs - peer::Peer (line 93) - compile ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 3.19s; merged doctests compilation took 3.18s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test packages/udp-server/src/statistics/services.rs - statistics::services (line 32) - compile ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.05s; merged doctests compilation took 1.05s + +running 3 tests +test packages/udp-tracker-core/src/connection_cookie.rs - connection_cookie (line 23) ... ignored +test packages/udp-tracker-core/src/connection_cookie.rs - connection_cookie (line 43) ... ignored +test packages/udp-tracker-core/src/statistics/services.rs - statistics::services (line 32) - compile ... ok + +test result: ok. 1 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s + +all doctests ran in 1.06s; merged doctests compilation took 1.05s + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +[warm] test_docs_seconds=29 +[warm] test_docs_exit_code=0 +[warm] test_unit_start + +running 1 test +test peer_client::tests::test_client_from_peer_id ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 11 tests +test clock::stopped::detail::tests::it_should_get_app_start_time ... ok +test clock::stopped::detail::tests::it_should_get_the_zero_start_time_when_testing ... ok +test clock::stopped::tests::it_should_default_to_zero_when_testing ... ok +test clock::stopped::tests::it_should_possible_to_set_the_time ... ok +test clock::tests::it_should_have_different_times ... ok +test clock::tests::it_should_be_the_stopped_clock_as_default_when_testing ... ok +test clock::stopped::tests::it_should_default_to_zero_on_thread_exit ... ok +test conv::tests::should_be_converted_from_datetime_utc ... ok +test conv::tests::should_be_converted_from_datetime_utc_in_iso_8601 ... ok +test conv::tests::should_be_converted_to_datetime_utc ... ok +test clock::tests::it_should_use_stopped_time_for_testing ... ok + +test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + + +running 1 test +test clock::it_should_use_stopped_time_for_testing ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + + +running 1 test +test tests::error_should_include_location ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 260 tests +test counter::tests::it_could_be_converted_from_i32 ... ok +test counter::tests::it_could_be_converted_from_u64 ... ok +test counter::tests::it_could_be_converted_from_u32 ... ok +test counter::tests::it_could_be_incremented ... ok +test counter::tests::it_could_set_to_an_absolute_value ... ok +test counter::tests::it_could_be_converted_into_u64 ... ok +test counter::tests::it_serializes_to_prometheus ... ok +test counter::tests::it_should_be_cloneable ... ok +test counter::tests::it_should_be_debuggable ... ok +test counter::tests::it_should_be_created_from_integer_values ... ok +test counter::tests::it_should_be_displayable ... ok +test counter::tests::it_should_handle_conversion_roundtrip ... ok +test counter::tests::it_should_handle_i32_conversion_roundtrip ... ok +test counter::tests::it_should_handle_i32_max_conversion ... ok +test counter::tests::it_should_handle_i32_min_conversion ... ok +test counter::tests::it_should_handle_large_increments ... ok +test counter::tests::it_should_handle_large_values ... ok +test counter::tests::it_should_handle_negative_i32_conversion ... ok +test counter::tests::it_should_handle_u32_conversion_roundtrip ... ok +test counter::tests::it_should_handle_u32_max_conversion ... ok +test counter::tests::it_should_handle_zero_value ... ok +test counter::tests::it_should_have_default_value ... ok +test counter::tests::it_should_return_primitive_value ... ok +test counter::tests::it_should_serialize_large_values_to_prometheus ... ok +test counter::tests::it_should_support_equality_comparison ... ok +test counter::tests::it_should_support_multiple_absolute_operations ... ok +test gauge::tests::it_could_be_converted_from_f32 ... ok +test gauge::tests::it_could_be_converted_from_u64 ... ok +test gauge::tests::it_could_be_converted_into_i64 ... ok +test gauge::tests::it_could_be_decremented ... ok +test gauge::tests::it_could_be_incremented ... ok +test gauge::tests::it_could_be_set ... ok +test gauge::tests::it_serializes_to_prometheus ... ok +test gauge::tests::it_should_be_cloneable ... ok +test gauge::tests::it_should_be_created_from_integer_values ... ok +test gauge::tests::it_should_be_debuggable ... ok +test gauge::tests::it_should_be_displayable ... ok +test gauge::tests::it_should_handle_conversion_roundtrip ... ok +test gauge::tests::it_should_handle_f32_conversion_roundtrip ... ok +test gauge::tests::it_should_handle_infinity ... ok +test gauge::tests::it_should_handle_large_values ... ok +test gauge::tests::it_should_handle_multiple_operations ... ok +test gauge::tests::it_should_handle_nan ... ok +test gauge::tests::it_should_handle_negative_values ... ok +test gauge::tests::it_should_handle_zero_value ... ok +test gauge::tests::it_should_have_default_value ... ok +test gauge::tests::it_should_return_primitive_value ... ok +test gauge::tests::it_should_serialize_special_values_to_prometheus ... ok +test gauge::tests::it_should_support_equality_comparison ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_1 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::empty_name - should panic ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_2 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_3 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_starting_with_double_underscore::case_4 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_1 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_2 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_3 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_4 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_5 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_6 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_7 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::names_that_need_changes_in_prometheus::case_8 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_1 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_2 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_3 ... ok +test label::name::tests::serialization_of_label_name_to_prometheus::valid_names_in_prometheus::case_4 ... ok +test label::pair::tests::serialization_of_label_pair_to_prometheus::test_label_pair_serialization_to_prometheus ... ok +test label::set::tests::it_should_allow_deserializing_from_json_as_an_array_of_label_objects ... ok +test label::set::tests::it_should_allow_displaying ... ok +test label::set::tests::it_should_allow_inserting_a_new_label_pair ... ok +test label::set::tests::it_should_allow_instantiation_from_a_b_tree_map ... ok +test label::set::tests::it_should_allow_instantiation_from_a_label_pair ... ok +test label::set::tests::it_should_allow_instantiation_from_an_array_of_label_pairs ... ok +test label::set::tests::it_should_allow_instantiation_from_a_vec_of_label_pairs ... ok +test label::set::tests::it_should_allow_instantiation_from_array_of_str_tuples ... ok +test label::set::tests::it_should_allow_instantiation_from_array_of_string_tuples ... ok +test label::set::tests::it_should_allow_instantiation_from_vec_of_serialized_label ... ok +test label::set::tests::it_should_allow_instantiation_from_vec_of_str_tuples ... ok +test label::set::tests::it_should_allow_instantiation_from_vec_of_string_tuples ... ok +test label::set::tests::it_should_allow_iteration_over_label_pairs ... ok +test label::set::tests::it_should_allow_serializing_to_json_as_an_array_of_label_objects ... ok +test label::set::tests::it_should_allow_serializing_to_prometheus_format ... ok +test label::set::tests::it_should_allow_updating_a_label_value ... ok +test label::set::tests::it_should_alphabetically_order_labels_in_prometheus_format ... ok +test label::set::tests::it_should_be_allow_ordering ... ok +test label::set::tests::it_should_be_comparable ... ok +test label::set::tests::it_should_be_hashable ... ok +test label::set::tests::it_should_check_if_contains_specific_label_pair ... ok +test label::set::tests::it_should_check_if_empty ... ok +test label::set::tests::it_should_check_if_non_empty ... ok +test label::set::tests::it_should_create_an_empty_label_set ... ok +test label::set::tests::it_should_display_empty_label_set ... ok +test label::set::tests::it_should_handle_prometheus_format_with_special_characters ... ok +test label::set::tests::it_should_implement_clone ... ok +test label::set::tests::it_should_maintain_order_in_iteration ... ok +test label::set::tests::it_should_match_against_criteria ... ok +test label::set::tests::it_should_serialize_empty_label_set_to_prometheus_format ... ok +test label::set::tests::try_from_openmetrics_parser_label_set::it_should_convert_empty_label_set ... ok +test label::set::tests::try_from_openmetrics_parser_label_set::it_should_convert_label_set_with_known_labels ... ok +test label::set::tests::try_from_openmetrics_parser_label_set::it_should_return_label_conversion_error_for_empty_label_name ... ok +test label::value::tests::it_could_be_initialized_from_str ... ok +test label::value::tests::it_serializes_to_prometheus ... ok +test label::value::tests::it_should_allow_to_create_an_ignored_label_value ... ok +test label::value::tests::it_should_be_allow_ordering ... ok +test label::value::tests::it_should_be_comparable ... ok +test label::value::tests::it_should_be_converted_from_string ... ok +test label::value::tests::it_should_be_hashable ... ok +test label::value::tests::it_should_implement_clone ... ok +test label::value::tests::it_should_implement_display ... ok +test metric::aggregate::avg::tests::test_counter_cases ... ok +test metric::aggregate::sum::tests::test_counter_cases ... ok +test metric::aggregate::avg::tests::test_gauge_cases ... ok +test metric::aggregate::sum::tests::test_gauge_cases ... ok +test metric::description::tests::it_serializes_to_prometheus ... ok +test metric::description::tests::it_should_be_converted_from_str ... ok +test metric::description::tests::it_should_be_converted_from_string ... ok +test metric::description::tests::it_should_be_created_from_a_string_reference ... ok +test metric::description::tests::it_should_be_displayed ... ok +test metric::name::tests::serialization_of_metric_name_to_prometheus::empty_name - should panic ... ok +test metric::name::tests::serialization_of_metric_name_to_prometheus::names_that_need_changes_in_prometheus ... ok +test metric::name::tests::serialization_of_metric_name_to_prometheus::valid_names_in_prometheus ... ok +test metric::tests::for_counter_metrics::it_should_allow_incrementing_a_sample ... ok +test metric::tests::for_counter_metrics::it_should_allow_setting_to_an_absolute_value ... ok +test metric::tests::for_counter_metrics::it_should_be_created_from_its_name_and_a_collection_of_samples ... ok +test metric::tests::for_gauge_metrics::it_should_allow_decrement_a_sample ... ok +test metric::tests::for_gauge_metrics::it_should_allow_incrementing_a_sample ... ok +test metric::tests::for_gauge_metrics::it_should_allow_setting_a_sample ... ok +test metric::tests::for_gauge_metrics::it_should_be_created_from_its_name_and_a_collection_of_samples ... ok +test metric::tests::for_generic_metrics::it_should_be_empty_when_it_does_not_have_any_sample ... ok +test metric::tests::for_generic_metrics::it_should_return_the_number_of_samples ... ok +test metric::tests::for_generic_metrics::it_should_return_zero_number_of_samples_for_an_empty_metric ... ok +test metric::tests::for_prometheus_serialization::it_should_return_empty_string_for_prometheus_help_line_when_description_is_none ... ok +test metric::tests::for_prometheus_serialization::it_should_return_formatted_help_line_for_prometheus_when_description_is_some ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::nonexistent_metric ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_counter_with_different_values ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_counter_with_two_samples ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_gauge_with_negative_values ... ok +test metric_collection::aggregate::avg::tests::it_should_allow_averaging_all_metric_samples_containing_some_given_labels::type_gauge_with_two_samples ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::nonexistent_counter_metric_returns_none ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::nonexistent_gauge_metric_returns_none ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::type_counter_with_two_samples ... ok +test metric_collection::aggregate::sum::tests::it_should_allow_summing_all_metric_samples_containing_some_given_labels::type_gauge_with_two_samples ... ok +test metric_collection::error::tests::it_should_be_cloneable ... ok +test metric_collection::error::tests::it_should_display_duplicate_metric_name_in_list ... ok +test metric_collection::error::tests::it_should_display_metric_name_collision_adding ... ok +test metric_collection::error::tests::it_should_display_metric_name_collision_in_constructor ... ok +test metric_collection::error::tests::it_should_display_metric_name_collision_in_merge ... ok +test metric_collection::kind_collection::tests::it_should_not_allow_merging_counter_metric_collections_with_name_collisions ... ok +test metric_collection::kind_collection::tests::it_should_not_allow_merging_gauge_metric_collections_with_name_collisions ... ok +test metric_collection::prometheus::tests::helper_functions::description_from_help_returns_none_for_empty_help ... ok +test metric_collection::prometheus::tests::helper_functions::description_from_help_returns_some_for_non_empty_help ... ok +test metric_collection::prometheus::tests::helper_functions::ensure_trailing_newline_returns_borrowed_when_input_has_newline ... ok +test metric_collection::prometheus::tests::helper_functions::ensure_trailing_newline_returns_owned_when_input_missing_newline ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_classify_duplicate_metric_names_as_collection_errors ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_accept_a_counter_value_that_is_a_whole_number_float ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_deserialize_a_counter_metric_from_prometheus_text ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_deserialize_a_gauge_metric_from_prometheus_text ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_reject_a_float_counter_value_equal_to_first_unrepresentable_u64 ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_return_parse_error_for_malformed_input ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_reject_fractional_counter_values ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_return_unknown_type_error_when_no_type_declaration_is_present ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_return_unsupported_type_for_histogram ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_round_trip_serialize_then_deserialize_prometheus_text ... ok +test metric_collection::prometheus::tests::prometheus_deserialization::it_should_use_fallback_timestamp_when_sample_has_no_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_convert_a_fractional_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_convert_a_whole_second_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_convert_zero_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_handle_nanosecond_boundary_overflow ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_nan ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_negative_infinity ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_negative_timestamp ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_for_positive_infinity ... ok +test metric_collection::prometheus::tests::prometheus_timestamp::it_should_use_fallback_when_timestamp_would_overflow_u64_seconds ... ok +test metric_collection::prometheus::tests::stage3_conversion::from_prometheus_and_stage3_try_from_should_produce_same_output ... ok +test metric_collection::prometheus::tests::stage3_conversion::try_from_parsed_exposition_should_convert_counter_family ... ok +test metric_collection::prometheus::tests::stage3_conversion::try_from_parsed_exposition_should_reject_unsupported_histogram ... ok +test metric_collection::serde::tests::it_should_allow_deserializing_an_empty_json_array ... ok +test metric_collection::serde::tests::it_should_allow_serializing_an_empty_collection_to_json ... ok +test metric_collection::serde::tests::it_should_allow_deserializing_from_json ... ok +test metric_collection::serde::tests::it_should_fail_deserializing_json_with_cross_type_name_collision ... ok +test metric_collection::serde::tests::it_should_fail_deserializing_json_with_duplicate_counter_names ... ok +test metric_collection::serde::tests::it_should_allow_serializing_to_json ... ok +test metric_collection::serde::tests::it_should_fail_deserializing_json_with_unknown_metric_type ... ok +test metric_collection::serde::tests::it_should_use_a_correct_sequence_length_hint_when_serializing ... ok +test metric_collection::tests::for_counters::it_should_allow_describing_a_counter_before_using_it ... ok +test metric_collection::tests::for_counters::it_should_allow_setting_to_an_absolute_value ... ok +test metric_collection::tests::for_counters::it_should_automatically_create_a_counter_when_increasing_if_it_does_not_exist ... ok +test metric_collection::tests::for_counters::it_should_fail_setting_to_an_absolute_value_if_a_gauge_with_the_same_name_exists ... ok +test metric_collection::tests::for_counters::it_should_increase_a_preexistent_counter ... ok +test metric_collection::tests::for_counters::it_should_not_allow_duplicate_metric_names_when_instantiating ... ok +test metric_collection::tests::for_gauges::it_should_allow_decrementing_a_gauge ... ok +test metric_collection::tests::for_gauges::it_should_allow_describing_a_gauge_before_using_it ... ok +test metric_collection::tests::for_gauges::it_should_allow_incrementing_a_gauge ... ok +test metric_collection::tests::for_gauges::it_should_automatically_create_a_gauge_when_setting_if_it_does_not_exist ... ok +test metric_collection::tests::for_gauges::it_should_fail_decrementing_a_gauge_if_it_exists_a_counter_with_the_same_name ... ok +test metric_collection::tests::for_gauges::it_should_not_allow_duplicate_metric_names_when_instantiating ... ok +test metric_collection::tests::for_gauges::it_should_fail_incrementing_a_gauge_if_it_exists_a_counter_with_the_same_name ... ok +test metric_collection::tests::for_gauges::it_should_set_a_preexistent_gauge ... ok +test metric_collection::tests::it_should_allow_merging_metric_collections ... ok +test metric_collection::tests::it_should_allow_serializing_to_prometheus_format ... ok +test metric_collection::tests::it_should_allow_serializing_to_prometheus_format_with_multiple_samples_per_metric ... ok +test metric_collection::tests::it_should_exclude_metrics_without_samples_from_prometheus_format ... ok +test metric_collection::tests::it_should_not_allow_creating_a_counter_with_the_same_name_as_a_gauge ... ok +test metric_collection::tests::it_should_not_allow_creating_a_gauge_with_the_same_name_as_a_counter ... ok +test metric_collection::tests::it_should_not_allow_duplicate_names_across_types ... ok +test metric_collection::tests::it_should_not_allow_merging_metric_collections_with_name_collisions_for_different_metric_types ... ok +test metric_collection::tests::it_should_not_allow_merging_metric_collections_with_name_collisions_for_the_same_metric_types ... ok +test sample::tests::for_counter_type_sample::it_should_allow_a_counter_type_value ... ok +test sample::tests::for_counter_type_sample::it_should_allow_exporting_to_prometheus_format ... ok +test sample::tests::for_counter_type_sample::it_should_allow_exporting_to_prometheus_format_with_empty_label_set ... ok +test sample::tests::for_counter_type_sample::it_should_allow_incrementing_the_counter ... ok +test sample::tests::for_counter_type_sample::it_should_record_the_latest_update_time_when_the_counter_is_incremented ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_a_counter_type_value ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_decrementing_the_value ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_exporting_to_prometheus_format ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_exporting_to_prometheus_format_with_empty_label_set ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_incrementing_the_value ... ok +test sample::tests::for_gauge_type_sample::it_should_allow_setting_a_value ... ok +test sample::tests::for_gauge_type_sample::it_should_record_the_latest_update_time_when_the_counter_is_incremented ... ok +test sample::tests::it_should_allow_converting_sample_into_label_set_and_measurement ... ok +test sample::tests::it_should_allow_creating_measurement_directly ... ok +test sample::tests::it_should_expose_measurement ... ok +test sample::tests::it_should_have_a_value ... ok +test sample::tests::it_should_include_a_label_set ... ok +test sample::tests::it_should_record_the_latest_update_time ... ok +test sample::tests::serialization_to_json::test_invalid_update_datetime_deserialization ... ok +test sample::tests::serialization_to_json::test_invalid_update_timestamp_serialization ... ok +test sample::tests::serialization_to_json::test_rfc3339_serialization_format_for_update_time ... ok +test sample::tests::serialization_to_json::test_serialization_round_trip ... ok +test sample::tests::serialization_to_json::test_serialization_round_trip_with_pretty_formatter ... ok +test sample::tests::serialization_to_json::test_update_datetime_high_precision_nanoseconds ... ok +test sample_collection::tests::for_counters::it_should_allow_increment_the_counter_for_a_non_existent_label_set ... ok +test sample_collection::tests::for_counters::it_should_allow_setting_absolute_value_for_a_counter ... ok +test sample_collection::tests::for_counters::it_should_allow_setting_absolute_value_for_existing_counter ... ok +test sample_collection::tests::for_counters::it_should_increment_the_counter_for_a_preexisting_label_set ... ok +test sample_collection::tests::for_counters::it_should_increment_the_counter_for_multiple_labels ... ok +test sample_collection::tests::for_counters::it_should_update_the_latest_update_time_when_incremented ... ok +test sample_collection::tests::for_counters::it_should_update_time_when_setting_absolute_value ... ok +test sample_collection::tests::for_gauges::it_should_allow_decrementing_the_gauge ... ok +test sample_collection::tests::for_gauges::it_should_allow_incrementing_the_gauge ... ok +test sample_collection::tests::for_gauges::it_should_allow_setting_the_gauge_for_a_non_existent_label_set ... ok +test sample_collection::tests::for_gauges::it_should_allow_setting_the_gauge_for_a_preexisting_label_set ... ok +test sample_collection::tests::for_gauges::it_should_allow_setting_the_gauge_for_multiple_labels ... ok +test sample_collection::tests::for_gauges::it_should_create_a_default_gauge_when_decrementing_a_nonexistent_label_set ... ok +test sample_collection::tests::for_gauges::it_should_update_the_latest_update_time_when_setting ... ok +test sample_collection::tests::it_should_allow_iterating_samples ... ok +test sample_collection::tests::it_should_fail_trying_to_create_a_sample_collection_with_duplicate_label_sets ... ok +test sample_collection::tests::it_should_indicate_is_it_is_empty ... ok +test sample_collection::tests::it_should_return_a_sample_searching_by_label_set_with_one_empty_label_set ... ok +test sample_collection::tests::it_should_return_a_sample_searching_by_label_set_with_two_label_sets ... ok +test sample_collection::tests::it_should_return_the_number_of_samples_in_the_collection ... ok +test sample_collection::tests::it_should_return_zero_number_of_samples_when_empty ... ok +test sample_collection::tests::json_serialization::it_should_be_serializable_and_deserializable_for_json_format ... ok +test sample_collection::tests::json_serialization::it_should_fail_deserializing_from_json_with_duplicate_label_sets ... ok +test sample_collection::tests::prometheus_serialization::it_should_be_exportable_to_prometheus_format ... ok +test sample_collection::tests::prometheus_serialization::it_should_be_exportable_to_prometheus_format_when_empty ... ok +test unit::tests::it_should_deserialize_count_from_snake_case ... ok +test unit::tests::it_should_implement_clone_copy_eq_hash_debug ... ok +test unit::tests::it_should_round_trip_all_variants ... ok +test unit::tests::it_should_serialize_count_to_snake_case ... ok + +test result: ok. 260 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + +running 14 tests +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_1 ... ok +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_4 ... ok +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_2 ... ok +test service_binding::tests::the_service_binding::should_allow_a_subset_of_urls::case_3 ... ok +test service_binding::tests::the_service_binding::should_always_have_a_corresponding_unique_url::case_1 ... ok +test service_binding::tests::the_service_binding::should_always_have_a_corresponding_unique_url::case_2 ... ok +test service_binding::tests::the_service_binding::should_always_have_a_corresponding_unique_url::case_3 ... ok +test service_binding::tests::the_service_binding::should_be_converted_into_an_url ... ok +test service_binding::tests::the_service_binding::should_not_allow_undefined_port_zero ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address_plain_type_for_ipv4_ips ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address_plain_type_for_ipv6_ips ... ok +test service_binding::tests::the_service_binding::should_return_the_bind_address_v4_mapped_v7_type_for_ipv4_ips_mapped_to_ipv6 ... ok +test service_binding::tests::the_service_binding::should_return_the_corresponding_url ... ok + +test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 53 tests +test bootstrap::jobs::manager::tests::it_should_wait_for_all_jobs_to_finish ... ok +test bootstrap::jobs::manager::tests::it_should_log_when_a_job_panics ... ok +test bootstrap::config::tests::it_should_load_with_default_config ... ok +test console::ci::e2e::logs_parser::tests::it_should_ignore_logs_with_no_matching_lines ... ok +test console::ci::e2e::logs_parser::tests::it_should_parse_multiple_services ... ok +test console::ci::e2e::logs_parser::tests::it_should_support_colored_output ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_embed_raw_bytes_verbatim ... ok +test console::ci::e2e::logs_parser::tests::it_should_parse_from_logs_with_valid_logs ... ok +test console::ci::e2e::logs_parser::tests::it_should_replace_wildcard_ip_with_localhost ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_embed_raw_inner_dict_inside_outer_dict ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_byte_string ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_dictionary_with_keys_sorted_lexicographically ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_negative_integer ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_a_positive_integer ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_an_empty_byte_string ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_an_empty_dictionary ... ok +test console::ci::qbittorrent_e2e::bencode::tests::it_should_encode_zero ... ok +test console::ci::qbittorrent_e2e::qbittorrent::client::tests::it_should_return_none_when_sid_cookie_is_missing ... ok +test console::ci::qbittorrent_e2e::qbittorrent::client::tests::it_should_extract_sid_cookie_when_present ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_deserialize_torrent_state_known_variant ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_deserialize_unknown_torrent_state_preserving_raw_value ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_display_known_and_unknown_torrent_state_values ... ok +test console::ci::qbittorrent_e2e::qbittorrent::torrent::tests::it_should_report_torrent_progress_completion_threshold ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_payload_bytes_with_a_repeating_pattern ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_payload_bytes_with_the_right_length ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_payload_bytes_wrapping_around_the_pattern ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_build_torrent_bytes_as_a_valid_bencode_dictionary ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_embed_the_announce_url_verbatim_in_the_torrent_bytes ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_embed_the_info_dict_raw_so_it_appears_as_a_nested_bencode_dict ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_a_40_character_lowercase_hex_info_hash ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_a_different_info_hash_when_only_the_payload_changes ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_deterministic_torrent_bytes_for_identical_inputs ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_different_torrent_bytes_for_different_payloads ... ok +test console::ci::qbittorrent_e2e::torrent_artifacts::tests::it_should_produce_the_same_info_hash_regardless_of_the_announce_url ... ok +test console::ci::qbittorrent_e2e::types::compose_project_name::tests::it_should_generate_expected_shape ... ok +test console::ci::qbittorrent_e2e::types::container_path::tests::it_should_build_from_new_and_format_as_string ... ok +test console::ci::qbittorrent_e2e::types::container_path::tests::it_should_convert_from_string_and_str ... ok +test console::ci::qbittorrent_e2e::types::deadline::tests::it_should_round_trip_duration ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_build_from_new_and_format_as_string ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_convert_from_string_and_str ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_implement_as_ref_path ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_reject_backslash ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_reject_double_dot ... ok +test console::ci::qbittorrent_e2e::types::file_name::tests::it_should_reject_forward_slash ... ok +test console::ci::qbittorrent_e2e::types::info_hash::tests::it_should_construct_info_hash_and_expose_accessors ... ok +test console::ci::qbittorrent_e2e::types::info_hash::tests::it_should_deserialize_info_hash_from_json_string ... ok +test console::ci::qbittorrent_e2e::types::payload_size::tests::it_should_round_trip_payload_size ... ok +test console::ci::qbittorrent_e2e::types::piece_length::tests::it_should_round_trip_piece_length ... ok +test console::ci::qbittorrent_e2e::types::poll_interval::tests::it_should_round_trip_duration ... ok +test console::ci::qbittorrent_e2e::types::qbittorrent_image::tests::it_should_round_trip_image_string ... ok +test console::ci::qbittorrent_e2e::types::tracker_image::tests::it_should_round_trip_image_string ... ok +test bootstrap::jobs::http_tracker::tests::it_should_start_http_tracker ... ok +test bootstrap::jobs::tracker_apis::tests::it_should_start_http_tracker ... ok + +test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test servers::api::contract::stats::the_stats_api_endpoint_should_return_the_global_stats ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 7 tests +test server::contract::health_check_endpoint_should_return_status_ok_when_there_is_no_services_registered ... ok +test server::contract::http::it_should_return_good_health_for_http_service ... ok +test server::contract::udp::it_should_return_good_health_for_udp_service ... ok +test server::contract::api::it_should_return_error_when_api_service_was_stopped_after_registration ... ok +test server::contract::api::it_should_return_good_health_for_api_service ... ok +test server::contract::http::it_should_return_error_when_http_service_was_stopped_after_registration ... ok +test server::contract::udp::it_should_return_error_when_udp_service_was_stopped_after_registration ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.04s + + +running 21 tests +test v1::extractors::announce_request::tests::it_should_extract_the_announce_request_from_the_url_query_params ... ok +test v1::extractors::announce_request::tests::it_should_reject_a_request_without_query_params ... ok +test v1::extractors::announce_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed ... ok +test v1::extractors::announce_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed_into_an_announce_request ... ok +test v1::extractors::scrape_request::tests::it_should_extract_the_scrape_request_from_the_url_query_params ... ok +test v1::extractors::authentication_key::tests::it_should_return_an_authentication_error_if_the_key_cannot_be_parsed ... ok +test v1::extractors::scrape_request::tests::it_should_extract_the_scrape_request_from_the_url_query_params_with_more_than_one_info_hash ... ok +test v1::extractors::scrape_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed ... ok +test v1::extractors::scrape_request::tests::it_should_reject_a_request_with_a_query_that_cannot_be_parsed_into_a_scrape_request ... ok +test v1::extractors::scrape_request::tests::it_should_reject_a_request_without_query_params ... ok +test v1::handlers::scrape::tests::with_tracker_in_private_mode::it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_invalid ... ok +test v1::handlers::scrape::tests::with_tracker_not_on_reverse_proxy::it_should_fail_when_the_client_ip_from_the_connection_info_is_not_available ... ok +test v1::handlers::scrape::tests::with_tracker_on_reverse_proxy::it_should_fail_when_the_right_most_x_forwarded_for_header_ip_is_not_available ... ok +test v1::handlers::scrape::tests::with_tracker_in_private_mode::it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing ... ok +test v1::handlers::scrape::tests::with_tracker_in_listed_mode::it_should_return_zeroed_swarm_metadata_when_the_torrent_is_not_whitelisted ... ok +test v1::handlers::announce::tests::with_tracker_in_listed_mode::it_should_fail_when_the_announced_torrent_is_not_whitelisted ... ok +test v1::handlers::announce::tests::with_tracker_not_on_reverse_proxy::it_should_fail_when_the_client_ip_from_the_connection_info_is_not_available ... ok +test v1::handlers::announce::tests::with_tracker_in_private_mode::it_should_fail_when_the_authentication_key_is_invalid ... ok +test v1::handlers::announce::tests::with_tracker_in_private_mode::it_should_fail_when_the_authentication_key_is_missing ... ok +test v1::handlers::announce::tests::with_tracker_on_reverse_proxy::it_should_fail_when_the_right_most_x_forwarded_for_header_ip_is_not_available ... ok +test server::tests::it_should_be_able_to_start_and_stop ... ok + +test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + +running 52 tests +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::it_should_start_and_stop ... ok +test server::v1::contract::environment_should_be_started_and_stopped ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_url_query_component_is_empty ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_fail_if_the_key_query_param_cannot_be_parsed ... ok +test server::v1::contract::configured_as_whitelisted::receiving_an_scrape_request::should_return_the_zeroed_file_when_the_requested_file_is_not_whitelisted ... ok +test server::v1::contract::configured_as_whitelisted::and_receiving_an_announce_request::should_fail_if_the_torrent_is_not_in_the_whitelist ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_fail_if_the_peer_has_not_provided_the_authentication_key ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_fail_if_the_peer_cannot_be_authenticated_with_the_provided_key ... ok +test server::v1::contract::for_all_config_modes::and_running_on_reverse_proxy::should_fail_when_the_http_request_does_not_include_the_xff_http_request_header ... ok +test server::v1::contract::configured_as_whitelisted::receiving_an_scrape_request::should_return_the_file_stats_when_the_requested_file_is_whitelisted ... ok +test server::v1::contract::configured_as_private::and_receiving_an_announce_request::should_respond_to_authenticated_peers ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_return_the_zeroed_file_when_the_authentication_key_provided_by_the_client_is_invalid ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_return_the_zeroed_file_when_the_client_is_not_authenticated ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_fail_if_the_key_query_param_cannot_be_parsed ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_assign_to_the_peer_ip_the_remote_client_ip_instead_of_the_peer_address_in_the_request_param ... ok +test server::v1::contract::configured_as_whitelisted::and_receiving_an_announce_request::should_allow_announcing_a_whitelisted_torrent ... ok +test server::v1::contract::for_all_config_modes::health_check_endpoint_should_return_ok_if_the_http_tracker_is_running ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_numwant_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_url_query_parameters_are_invalid ... ok +test server::v1::contract::for_all_config_modes::and_running_on_reverse_proxy::should_fail_when_the_xff_http_request_header_contains_an_invalid_ip ... ok +test server::v1::contract::configured_as_private::receiving_an_scrape_request::should_return_the_real_file_stats_when_the_client_is_authenticated ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_a_mandatory_field_is_missing ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_consider_two_peers_to_be_the_same_when_they_have_the_same_socket_address_even_if_the_peer_id_is_different ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_increase_the_number_of_tcp4_announce_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_compact_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_not_increase_the_number_of_tcp6_announce_requests_handled_if_the_client_is_not_using_an_ipv6_ip ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_left_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_uploaded_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_downloaded_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_respond_if_only_the_mandatory_fields_are_provided ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_increase_the_number_of_tcp6_announce_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_not_return_the_compact_response_by_default ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_not_fail_when_the_peer_address_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_port_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_info_hash_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_peer_id_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_fail_when_the_event_param_is_invalid ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_the_list_of_previously_announced_peers_including_peers_using_ipv4_and_ipv6 ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_the_compact_response ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_fail_when_the_request_is_empty ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_no_peers_if_the_announced_peer_is_the_first_one ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_increase_the_number_ot_tcp4_scrape_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::when_the_client_ip_is_a_loopback_ipv4_it_should_assign_to_the_peer_ip_the_external_ip_in_the_tracker_configuration ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::when_the_tracker_is_behind_a_reverse_proxy_it_should_assign_to_the_peer_ip_the_ip_in_the_x_forwarded_for_http_header ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_return_a_file_with_zeroed_values_when_there_are_no_peers ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_return_the_file_with_the_incomplete_peer_when_there_is_one_peer_with_bytes_pending_to_download ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_accept_multiple_infohashes ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::when_the_client_ip_is_a_loopback_ipv6_it_should_assign_to_the_peer_ip_the_external_ip_in_the_tracker_configuration ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_increase_the_number_ot_tcp6_scrape_requests_handled_in_statistics ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_return_the_file_with_the_complete_peer_when_there_is_one_peer_with_no_bytes_pending_to_download ... ok +test server::v1::contract::for_all_config_modes::receiving_an_announce_request::should_return_the_list_of_previously_announced_peers ... ok +test server::v1::contract::for_all_config_modes::receiving_an_scrape_request::should_fail_when_the_info_hash_param_is_invalid ... ok + +test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s + + +running 7 tests +test v1::context::auth_key::resources::tests::it_should_be_convertible_from_an_auth_key ... ok +test v1::context::auth_key::resources::tests::it_should_be_convertible_into_json ... ok +test v1::context::stats::resources::tests::stats_resource_should_be_converted_from_tracker_metrics ... ok +test v1::context::torrent::resources::torrent::tests::torrent_resource_list_item_should_be_converted_from_the_basic_torrent_info ... ok +test v1::context::auth_key::resources::tests::it_should_be_convertible_into_an_auth_key ... ok +test v1::context::torrent::resources::torrent::tests::torrent_resource_should_be_converted_from_torrent_info ... ok +test server::tests::it_should_be_able_to_start_and_stop ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + +running 53 tests +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_authentication_header::it_should_not_authenticate_requests_when_the_token_is_empty ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_authentication_header::it_should_not_authenticate_requests_when_the_token_is_invalid ... ok +test server::v1::contract::context::auth_key::should_allow_reloading_keys ... ok +test server::v1::contract::authentication::given_that_token_is_provided_via_get_param_and_authentication_header::it_should_authenticate_requests_using_the_token_provided_in_the_authentication_header ... ok +test server::v1::contract::context::health_check::health_check_endpoint_should_return_status_ok_if_api_is_running ... ok +test server::v1::contract::context::torrent::should_allow_getting_a_list_of_torrents_providing_infohashes ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_not_authenticate_requests_when_the_token_is_invalid ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_not_allow_generating_a_new_auth_key_for_unauthenticated_users ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_allow_the_token_query_param_to_be_at_any_position_in_the_url_query ... ok +test server::v1::contract::authentication::given_that_not_token_is_provided::it_should_not_authenticate_requests_when_the_token_is_missing ... ok +test server::v1::contract::context::torrent::should_allow_getting_all_torrents ... ok +test server::v1::contract::context::auth_key::should_fail_generating_a_new_auth_key_when_the_provided_key_is_invalid ... ok +test server::v1::contract::context::auth_key::should_allow_deleting_an_auth_key ... ok +test server::v1::contract::context::auth_key::should_allow_generating_a_new_random_auth_key ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_allow_generating_a_new_auth_key ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_fail_generating_a_new_auth_key_when_the_key_duration_is_invalid ... ok +test server::v1::contract::context::auth_key::should_not_allow_deleting_an_auth_key_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_allow_getting_a_torrent_info ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_authenticate_requests_when_the_token_is_provided_as_a_query_param ... ok +test server::v1::contract::context::auth_key::should_fail_generating_a_new_auth_key_when_the_key_duration_is_invalid ... ok +test server::v1::contract::context::auth_key::should_not_allow_generating_a_new_auth_key_for_unauthenticated_users ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_query_param::it_should_not_authenticate_requests_when_the_token_is_empty ... ok +test server::v1::contract::authentication::given_that_the_token_is_only_provided_in_the_authentication_header::it_should_authenticate_requests_when_the_token_is_provided_in_the_authentication_header ... ok +test server::v1::contract::context::auth_key::should_allow_uploading_a_preexisting_auth_key ... ok +test server::v1::contract::context::auth_key::should_fail_deleting_an_auth_key_when_the_key_id_is_invalid ... ok +test server::v1::contract::context::stats::should_allow_getting_tracker_statistics ... ok +test server::v1::contract::context::auth_key::should_fail_when_the_auth_key_cannot_be_generated ... ok +test server::v1::contract::context::auth_key::should_fail_when_the_auth_key_cannot_be_deleted ... ok +test server::v1::contract::context::auth_key::deprecated_generate_key_endpoint::should_fail_when_the_auth_key_cannot_be_generated ... ok +test server::v1::contract::context::stats::should_not_allow_getting_tracker_statistics_for_unauthenticated_users ... ok +test server::v1::contract::context::auth_key::should_not_allow_reloading_keys_for_unauthenticated_users ... ok +test server::v1::contract::context::auth_key::should_fail_when_keys_cannot_be_reloaded ... ok +test server::v1::contract::context::whitelist::should_allow_reload_the_whitelist_from_the_database ... ok +test server::v1::contract::context::torrent::should_allow_limiting_the_torrents_in_the_result ... ok +test server::v1::contract::context::whitelist::should_allow_whitelisting_a_torrent_that_has_been_already_whitelisted ... ok +test server::v1::contract::context::whitelist::should_not_fail_trying_to_remove_a_non_whitelisted_torrent_from_the_whitelist ... ok +test server::v1::contract::context::torrent::should_not_allow_getting_a_torrent_info_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_fail_while_getting_a_torrent_info_when_the_torrent_does_not_exist ... ok +test server::v1::contract::context::whitelist::should_allow_removing_a_torrent_from_the_whitelist ... ok +test server::v1::contract::context::whitelist::should_allow_whitelisting_a_torrent ... ok +test server::v1::contract::context::torrent::should_not_allow_getting_torrents_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_allow_the_torrents_result_pagination ... ok +test server::v1::contract::context::whitelist::should_fail_when_the_torrent_cannot_be_whitelisted ... ok +test server::v1::contract::context::whitelist::should_fail_when_the_torrent_cannot_be_removed_from_the_whitelist ... ok +test server::v1::contract::context::torrent::should_fail_getting_torrents_when_the_info_hash_parameter_is_invalid ... ok +test server::v1::contract::context::whitelist::should_not_allow_whitelisting_a_torrent_for_unauthenticated_users ... ok +test server::v1::contract::context::torrent::should_fail_getting_torrents_when_the_limit_query_parameter_cannot_be_parsed ... ok +test server::v1::contract::context::whitelist::should_not_allow_removing_a_torrent_from_the_whitelist_for_unauthenticated_users ... ok +test server::v1::contract::context::whitelist::should_fail_when_the_whitelist_cannot_be_reloaded_from_the_database ... ok +test server::v1::contract::context::torrent::should_fail_getting_torrents_when_the_offset_query_parameter_cannot_be_parsed ... ok +test server::v1::contract::context::whitelist::should_fail_removing_a_torrent_from_the_whitelist_when_the_provided_infohash_is_invalid ... ok +test server::v1::contract::context::whitelist::should_fail_whitelisting_a_torrent_when_the_provided_infohash_is_invalid ... ok +test server::v1::contract::context::torrent::should_fail_getting_a_torrent_info_when_the_provided_infohash_is_invalid ... ok + +test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s + + +running 2 tests +test tsl::tests::it_should_error_on_missing_cert_or_key_paths ... ok +test tsl::tests::it_should_error_on_bad_tls_config ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 46 tests +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::health_checks::it_should_fail_when_a_health_check_http_url_is_invalid ... ok +test console::clients::checker::checks::udp::tests::it_should_resolve_the_socket_address_for_udp_scheme_urls_containing_a_domain ... ok +test console::clients::checker::checks::udp::tests::it_should_resolve_the_socket_address_for_udp_scheme_urls_containing_an_ip ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::http_trackers::it_should_allow_the_url_to_contain_a_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::http_trackers::it_should_allow_the_url_to_contain_an_empty_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_add_the_udp_scheme_to_the_udp_url_when_it_is_missing ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::http_trackers::it_should_fail_when_a_tracker_http_url_is_invalid ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_allow_the_url_to_contain_a_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_allow_the_url_to_have_an_empty_path ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_allow_using_domains ... ok +test console::clients::checker::config::tests::building_configuration_from_plain_configuration_for::udp_trackers::it_should_fail_when_a_tracker_udp_url_is_invalid ... ok +test console::clients::checker::config::tests::configuration_should_be_build_from_plain_serializable_configuration ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_invalid_url_and_include_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_malformed_json_and_include_serde_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_missing_field_and_include_serde_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_fail_with_trailing_comma_and_include_serde_detail_in_error ... ok +test console::clients::checker::config::tests::parsing_from_json::it_should_succeed_with_valid_json ... ok +test console::clients::checker::error::tests::config_source_env_var_displays_as_variable_name ... ok +test console::clients::checker::error::tests::config_source_file_displays_as_path ... ok +test console::clients::checker::error::tests::invalid_config_error_from_file_includes_path_in_json ... ok +test console::clients::checker::error::tests::invalid_config_error_json_contains_expected_fields ... ok +test console::clients::checker::error::tests::invalid_config_error_produces_exit_code_2 ... ok +test console::clients::checker::error::tests::invalid_config_error_json_escapes_special_characters ... ok +test console::clients::checker::error::tests::runtime_error_json_contains_expected_fields ... ok +test console::clients::checker::error::tests::runtime_error_produces_exit_code_1 ... ok +test console::clients::checker::logger::tests::should_capture_the_clear_screen_command ... ok +test console::clients::checker::logger::tests::should_capture_the_print_command_output ... ok +test console::clients::checker::monitor::udp::tests::it_should_compute_integer_average_for_successful_probes ... ok +test console::clients::checker::monitor::udp::tests::it_should_compute_timeout_percent_as_integer ... ok +test console::clients::checker::monitor::udp::tests::it_should_return_all_null_latency_fields_when_every_probe_times_out ... ok +test console::clients::checker::monitor::udp::tests::it_should_return_none_average_when_there_are_no_successful_probes ... ok +test console::clients::http::app::tests::it_accepts_direct_validation_for_plain_base_url ... ok +test console::clients::http::app::tests::it_accepts_tracker_url_with_path_and_without_query_or_fragment ... ok +test console::clients::http::app::tests::it_rejects_tracker_url_with_fragment ... ok +test console::clients::http::app::tests::it_rejects_tracker_url_with_query ... ok +test console::clients::http::app::tests::it_should_serialize_compact_json ... ok +test console::clients::http::app::tests::it_should_serialize_pretty_json ... ok +test console::clients::udp::responses::json::tests::it_should_serialize_compact_json_when_pretty_is_false ... ok +test console::clients::udp::responses::json::tests::it_should_serialize_pretty_json_when_pretty_is_true ... ok +test console::clients::udp::tests::it_should_display_the_inner_udp_parse_error_for_announce_responses ... ok +test console::clients::unified::http::tests::it_accepts_direct_validation_for_plain_base_url ... ok +test console::clients::unified::http::tests::it_accepts_tracker_url_with_path_and_without_query_or_fragment ... ok +test console::clients::unified::http::tests::it_rejects_tracker_url_with_fragment ... ok +test console::clients::unified::http::tests::it_rejects_tracker_url_with_query ... ok +test console::clients::unified::http::tests::it_should_serialize_json_output ... ok +test console::clients::unified::http::tests::it_should_serialize_text_output_as_pretty_json ... ok + +test result: ok. 46 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 10 tests +test configuration::invalid_configuration_from_env_var::it_should_produce_no_output_on_stdout_on_config_error ... ok +test configuration::invalid_configuration_from_env_var::it_should_exit_with_code_2_on_invalid_json ... ok +test configuration::invalid_configuration_from_env_var::it_should_write_json_error_to_stderr_on_invalid_json ... ok +test configuration::no_configuration_provided::it_should_write_json_error_to_stderr_when_no_config_is_provided ... ok +test configuration::invalid_configuration_from_file::it_should_exit_with_code_2_when_config_file_does_not_exist ... ok +test configuration::no_configuration_provided::it_should_exit_with_code_2_when_no_config_is_provided ... ok +test configuration::invalid_configuration_from_file::it_should_include_file_path_in_stderr_source_field ... ok +test configuration::invalid_configuration_from_env_var::it_should_include_parse_detail_in_stderr_error_message_on_trailing_comma ... ok +test configuration::invalid_configuration_from_file::it_should_exit_with_code_2_on_invalid_json_in_file ... ok +test monitor::it_should_emit_monitor_probe_events_to_stderr_and_summary_to_stdout ... ok + +test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.08s + + +running 3 tests +test it_should_fail_http_announce_for_invalid_infohash ... ok +test it_should_show_unified_subcommands_in_help ... ok +test it_should_fail_udp_scrape_for_invalid_infohash ... ok + +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 12 tests +test http::tests::it_should_encode_a_20_byte_array ... ok +test peer_id::tests::default_production_peer_id_should_be_stable_within_a_process ... ok +test peer_id::tests::default_test_peer_id_should_use_rc_prefix_and_3000_version ... ok +test udp::tests::it_should_display_unrecognized_udp_tracker_response_without_debug_noise ... ok +test http::client::tests::it_keeps_custom_path_unchanged_for_announce ... ok +test http::client::tests::it_uses_announce_for_base_url_without_trailing_slash ... ok +test http::client::tests::it_appends_auth_key_to_existing_announce_path ... ok +test http::client::tests::it_keeps_existing_scrape_path_unchanged ... ok +test http::client::tests::it_uses_announce_for_base_url_with_trailing_slash ... ok +test http::client::tests::it_keeps_existing_announce_path_unchanged ... ok +test http::client::tests::it_uses_scrape_for_base_url_without_trailing_slash ... ok +test http::client::tests::it_does_not_append_auth_key_when_path_already_ends_with_same_key ... ok + +test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + +running 12 tests +test v2_0_0::database::tests::it_should_allow_masking_the_mysql_user_password ... ok +test v2_0_0::database::tests::it_should_allow_masking_the_postgresql_user_password ... ok +test v2_0_0::tests::configuration_should_contain_the_external_ip ... ok +test v2_0_0::tests::configuration_should_have_default_values ... ok +test v2_0_0::tests::configuration_should_be_saved_in_a_toml_config_file ... ok +test v2_0_0::tracker_api::tests::default_http_api_configuration_should_not_contains_any_token ... ok +test v2_0_0::tracker_api::tests::http_api_configuration_should_allow_adding_tokens ... ok +test v2_0_0::tests::configuration_should_allow_to_overwrite_the_default_tracker_api_token_for_admin_with_an_env_var ... ok +test v2_0_0::tests::configuration_should_use_the_default_values_when_only_the_mandatory_options_are_provided_by_the_user_via_toml_content ... ok +test v2_0_0::tests::configuration_should_use_the_default_values_when_only_the_mandatory_options_are_provided_by_the_user_via_toml_file ... ok +test v2_0_0::tests::default_configuration_could_be_overwritten_from_a_toml_config_file ... ok +test v2_0_0::tests::default_configuration_could_be_overwritten_from_a_single_env_var_with_toml_contents ... ok + +test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 41 tests +test mutable::bencode_mut::test::positive_bytes_encode ... ok +test mutable::bencode_mut::test::positive_empty_dict_encode ... ok +test mutable::bencode_mut::test::positive_empty_list_encode ... ok +test mutable::bencode_mut::test::positive_int_encode ... ok +test mutable::bencode_mut::test::positive_nonempty_dict_encode ... ok +test mutable::bencode_mut::test::positive_nonempty_list_encode ... ok +test reference::bencode_ref::tests::positive_bytes_buffer ... ok +test reference::bencode_ref::tests::positive_dict_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_bytes_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_dict_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_int_buffer ... ok +test reference::bencode_ref::tests::positive_dict_nested_list_buffer ... ok +test reference::bencode_ref::tests::positive_int_buffer ... ok +test reference::bencode_ref::tests::positive_list_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_bytes_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_dict_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_int_buffer ... ok +test reference::bencode_ref::tests::positive_list_nested_list_buffer ... ok +test reference::decode::tests::negative_decode_bytes_extra - should panic ... ok +test reference::decode::tests::negative_decode_bytes_neg_len - should panic ... ok +test reference::decode::tests::negative_decode_bytes_not_utf8 ... ok +test reference::decode::tests::negative_decode_dict_dup_keys_diff_data - should panic ... ok +test reference::decode::tests::negative_decode_dict_dup_keys_same_data - should panic ... ok +test reference::decode::tests::negative_decode_dict_unordered_keys - should panic ... ok +test reference::decode::tests::negative_decode_int_double_negative - should panic ... ok +test reference::decode::tests::negative_decode_int_double_zero - should panic ... ok +test reference::decode::tests::negative_decode_int_leading_zero - should panic ... ok +test reference::decode::tests::negative_decode_int_nan - should panic ... ok +test reference::decode::tests::negative_decode_int_negative_zero - should panic ... ok +test reference::decode::tests::positive_decode_bytes ... ok +test reference::decode::tests::positive_decode_bytes_utf8 ... ok +test reference::decode::tests::positive_decode_bytes_zero_len ... ok +test reference::decode::tests::positive_decode_dict ... ok +test reference::decode::tests::positive_decode_dict_unordered_keys ... ok +test reference::decode::tests::positive_decode_general ... ok +test reference::decode::tests::positive_decode_int ... ok +test reference::decode::tests::positive_decode_int_negative ... ok +test reference::decode::tests::positive_decode_int_zero ... ok +test reference::decode::tests::positive_decode_list ... ok +test reference::decode::tests::positive_decode_partial ... ok +test reference::decode::tests::positive_decode_recursion ... ok + +test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 2 tests +test positive_ben_list_macro ... ok +test positive_ben_map_macro ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +Testing bencode nested lists +Success + +Testing bencode multi kb +Success + + +running 124 tests +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_client_ip_is_a_ipv6_loopback_ip::it_should_use_the_external_ip_in_the_tracker_configuration_if_it_is_defined_even_if_the_external_ip_is_an_ipv4_ip ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_client_ip_is_a_ipv6_loopback_ip::it_should_use_the_external_ip_in_tracker_configuration_if_it_is_defined ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_the_client_ip_is_a_ipv4_loopback_ip::it_should_use_the_loopback_ip_if_the_tracker_does_not_have_the_external_ip_configuration ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_the_client_ip_is_a_ipv4_loopback_ip::it_should_use_the_external_tracker_ip_in_tracker_configuration_if_it_is_defined ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_client_ip_is_a_ipv6_loopback_ip::it_should_use_the_loopback_ip_if_the_tracker_does_not_have_the_external_ip_configuration ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::and_when_the_client_ip_is_a_ipv4_loopback_ip::it_should_use_the_external_ip_in_the_tracker_configuration_if_it_is_defined_even_if_the_external_ip_is_an_ipv6_ip ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_allow_limiting_the_peer_list ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::should_assign_the_ip_to_the_peer::using_the_source_ip_instead_of_the_ip_in_the_announce_request ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_convert_the_peers_wanted_number_from_u32 ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_the_maximin_number_of_peers_by_default ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_convert_the_peers_wanted_number_from_i32 ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_the_maximum_when_wanting_only_zero ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_74_at_the_most_if_the_client_wants_them_all ... ok +test announce_handler::tests::the_announce_handler::should_allow_the_client_peers_to_specified_the_number_of_peers_wanted::it_should_return_the_maximum_when_wanting_more_than_the_maximum ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_fail_adding_a_pre_generated_key_when_there_is_a_database_error ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::randomly_generated::it_should_fail_adding_a_randomly_generated_key_when_there_is_a_database_error ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::pre_generated_keys::it_should_fail_adding_a_pre_generated_key_when_there_is_a_database_error ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::randomly_generated::it_should_fail_adding_a_randomly_generated_key_when_there_is_a_database_error ... ok +test authentication::key::peer_key::tests::key::length_should_be_32 ... ok +test authentication::key::peer_key::tests::key::should_be_parsed_from_an_string ... ok +test authentication::key::peer_key::tests::key::should_be_generated_randomly ... ok +test authentication::key::peer_key::tests::key::should_only_include_alphanumeric_chars ... ok +test authentication::key::peer_key::tests::key::should_return_a_reference_to_the_inner_string ... ok +test authentication::key::peer_key::tests::peer_key::could_be_permanent ... ok +test authentication::key::peer_key::tests::peer_key::could_have_an_expiration_time ... ok +test authentication::key::peer_key::tests::peer_key::expiring::should_be_displayed_when_it_is_expiring ... ok +test authentication::key::peer_key::tests::peer_key::permanent::should_be_displayed_when_it_is_permanent ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::clear_all_peer_keys ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::get_a_new_peer_key_by_its_internal_key ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::insert_a_new_peer_key ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::remove_a_new_peer_key ... ok +test authentication::key::repository::in_memory::tests::the_in_memory_key_repository_should::reset_the_peer_keys_with_a_new_list_of_keys ... ok +test authentication::key::tests::the_expiring_peer_key::expiration_verification_should_fail_when_the_key_has_expired ... ok +test authentication::key::tests::the_expiring_peer_key::should_be_displayed ... ok +test authentication::key::tests::the_expiring_peer_key::should_be_generated_with_a_expiration_time ... ok +test authentication::key::tests::the_permanent_peer_key::should_be_displayed ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::but_the_key_expiration_check_is_disabled_by_configuration::it_should_authenticate_an_expired_registered_key ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_authenticate_a_registered_key ... ok +test authentication::key::tests::the_permanent_peer_key::expiration_verification_should_always_succeed ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_not_authenticate_a_registered_but_expired_key_by_default ... ok +test authentication::key::tests::the_key_verification_error::could_be_a_database_error ... ok +test authentication::key::tests::the_permanent_peer_key::should_be_generated_without_expiration_time ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_not_authenticate_a_registered_but_expired_key_when_the_tracker_is_explicitly_configured_to_check_keys_expiration ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_private::it_should_not_authenticate_an_unregistered_key ... ok +test authentication::service::tests::the_authentication_service::when_the_tracker_is_public::it_should_always_authenticate_when_the_tracker_is_public ... ok +test databases::driver::postgres::tests::run_postgres_driver_tests ... ok +test databases::driver::mysql::tests::run_mysql_driver_tests ... ok +test databases::error::tests::it_should_build_a_database_error_from_a_sqlx_io_error ... ok +test databases::error::tests::it_should_build_a_database_error_from_a_sqlx_row_not_found_error ... ok +test databases::driver::sqlite::schema_migrator::tests::bootstrap_legacy_schema_should_be_a_noop_on_a_fresh_database ... ok +test error::tests::peer_key_error::duration_overflow ... ok +test error::tests::peer_key_error::parsing_from_string ... ok +test error::tests::peer_key_error::persisting_into_database ... ok +test error::tests::whitelist_error::torrent_not_whitelisted ... ok +test peer_tests::it_should_be_serializable ... ok +test scrape_handler::tests::it_should_allow_scraping_for_multiple_torrents ... ok +test scrape_handler::tests::it_should_return_a_zeroed_swarm_metadata_for_the_requested_file_if_the_tracker_does_not_have_that_torrent ... ok +test databases::driver::sqlite::schema_migrator::tests::bootstrap_legacy_schema_should_reject_partial_legacy_state ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_allow_peers_to_get_only_a_subset_of_the_peers_in_the_swarm ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_update_the_swarm_stats_for_the_torrent::when_a_previously_announced_started_peer_has_completed_downloading ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_return_the_announce_data_with_the_previously_announced_peers ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_return_the_announce_data_with_an_empty_peer_list_when_it_is_the_first_announced_peer ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_update_the_swarm_stats_for_the_torrent::when_the_peer_is_a_leecher ... ok +test announce_handler::tests::the_announce_handler::for_all_tracker_config_modes::handling_an_announce_request::it_should_update_the_swarm_stats_for_the_torrent::when_the_peer_is_a_seeder ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_fail_adding_a_pre_generated_key_when_the_key_duration_exceeds_the_maximum_duration ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::pre_generated_keys::it_should_fail_adding_a_pre_generated_key_when_the_key_is_invalid ... ok +test torrent::services::tests::getting_a_torrent_info::it_should_return_none_if_the_tracker_does_not_have_the_torrent ... ok +test torrent::services::tests::getting_a_torrent_info::it_should_return_the_torrent_info_if_the_tracker_has_the_torrent ... ok +test torrent::services::tests::getting_basic_torrent_info_for_multiple_torrents_at_once::it_should_return_a_list_with_basic_info_about_the_requested_torrents ... ok +test torrent::services::tests::getting_basic_torrent_info_for_multiple_torrents_at_once::it_should_return_an_empty_list_if_none_of_the_requested_torrents_is_found ... ok +test torrent::services::tests::searching_for_torrents::it_should_allow_limiting_the_number_of_torrents_in_the_result ... ok +test torrent::services::tests::searching_for_torrents::it_should_allow_using_pagination_in_the_result ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_fail_adding_a_pre_generated_key_when_the_key_is_invalid ... ok +test torrent::services::tests::searching_for_torrents::it_should_return_a_summarized_info_for_all_torrents ... ok +test torrent::services::tests::searching_for_torrents::it_should_return_an_empty_result_if_the_tracker_does_not_have_any_torrent ... ok +test torrent::services::tests::searching_for_torrents::it_should_return_torrents_ordered_by_info_hash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_configured_as_listed::should_authorize_a_whitelisted_infohash ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::randomly_generated::it_should_add_a_randomly_generated_key ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_configured_as_listed::should_not_authorize_a_non_whitelisted_infohash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_not_configured_as_listed::should_also_authorize_a_non_whitelisted_infohash ... ok +test whitelist::authorization::tests::the_whitelist_authorization_for_announce_and_scrape_actions::when_the_tacker_is_not_configured_as_listed::should_authorize_a_whitelisted_infohash ... ok +test authentication::key::repository::persisted::tests::the_persisted_key_repository_should::load_all_persisted_peer_keys ... ok +test whitelist::repository::in_memory::tests::should_allow_adding_a_new_torrent_to_the_whitelist ... ok +test whitelist::repository::in_memory::tests::should_allow_checking_if_an_infohash_is_whitelisted ... ok +test whitelist::repository::in_memory::tests::should_allow_clearing_the_whitelist ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::pre_generated_keys::it_should_add_a_pre_generated_key ... ok +test whitelist::repository::in_memory::tests::should_allow_removing_a_new_torrent_to_the_whitelist ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::pre_generated::it_should_add_a_pre_generated_key ... ok +test databases::setup::tests::it_should_initialize_the_sqlite_database ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::randomly_generated::it_should_add_a_randomly_generated_key ... ok +test authentication::tests::the_tracker_configured_as_private::it_should_load_authentication_keys_from_the_database ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_expiring_peer_keys::it_should_generate_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_permanent_and::pre_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::pre_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::key::repository::persisted::tests::the_persisted_key_repository_should::remove_a_persisted_peer_key ... ok +test authentication::key::repository::persisted::tests::the_persisted_key_repository_should::persist_a_new_peer_key ... ok +test authentication::handler::tests::the_keys_handler_when_the_tracker_is_configured_as_private::handling_permanent_peer_keys::randomly_generated::it_should_generate_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::randomly_generated_keys::it_should_accept_an_expired_key_when_checking_expiration_is_disabled_in_configuration ... ok +test authentication::tests::the_tracker_configured_as_private::it_should_remove_an_authentication_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::pre_generated_keys::it_should_accept_an_expired_key_when_checking_expiration_is_disabled_in_configuration ... ok +test authentication::tests::the_tracker_configured_as_private::with_permanent_and::randomly_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test authentication::tests::the_tracker_configured_as_private::with_expiring_and::randomly_generated_keys::it_should_authenticate_a_peer_with_the_key ... ok +test databases::driver::sqlite::tests::create_database_tables_should_be_idempotent_on_a_fresh_database ... ok +test databases::driver::sqlite::schema_migrator::tests::bootstrap_legacy_schema_should_seed_history_when_all_legacy_tables_exist ... ok +test statistics::persisted::downloads::tests::it_increases_the_numbers_of_downloads_for_a_torrent_into_the_database ... ok +test statistics::persisted::downloads::tests::it_loads_the_numbers_of_downloads_for_all_torrents_from_the_database ... ok +test torrent::manager::tests::cleaning_torrents::it_should_remove_torrents_that_have_no_peers_when_it_is_configured_to_do_so ... ok +test tests::the_tracker::for_all_config_modes::handling_a_scrape_request::it_should_return_the_swarm_metadata_for_the_requested_file_if_the_tracker_has_that_torrent ... ok +test tests::the_tracker::configured_as_whitelisted::handling_a_scrape_request::it_should_return_the_zeroed_swarm_metadata_for_the_requested_file_if_it_is_not_whitelisted ... ok +test torrent::manager::tests::cleaning_torrents::it_should_remove_peers_that_have_not_been_updated_after_a_cutoff_time ... ok +test statistics::persisted::downloads::tests::it_saves_the_numbers_of_downloads_for_a_torrent_into_the_database ... ok +test torrent::manager::tests::cleaning_torrents::it_should_retain_peerless_torrents_when_it_is_configured_to_do_so ... ok +test whitelist::tests::configured_as_whitelisted::handling_authorization::it_should_not_authorize_the_announce_and_scrape_actions_on_not_whitelisted_torrents ... ok +test torrent::manager::tests::it_should_load_the_numbers_of_downloads_for_all_torrents_from_the_database ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_not_fail_removing_an_infohash_that_is_not_in_the_list ... ok +test whitelist::manager::tests::configured_as_whitelisted::handling_the_torrent_whitelist::persistence::it_should_load_the_whitelist_from_the_database ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_add_a_new_infohash_to_the_list ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_load_all_infohashes_from_the_database ... ok +test whitelist::manager::tests::configured_as_whitelisted::handling_the_torrent_whitelist::it_should_add_a_torrent_to_the_whitelist ... ok +test whitelist::manager::tests::configured_as_whitelisted::handling_the_torrent_whitelist::it_should_remove_a_torrent_from_the_whitelist ... ok +test whitelist::tests::configured_as_whitelisted::handling_authorization::it_should_authorize_the_announce_and_scrape_actions_on_whitelisted_torrents ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_remove_a_infohash_from_the_list ... ok +test whitelist::repository::persisted::tests::the_persisted_whitelist_repository::should_not_add_the_same_infohash_to_the_list_twice ... ok +test databases::driver::sqlite::tests::run_sqlite_driver_tests ... ok + +test result: ok. 124 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s + + +running 13 tests +test persistence_benchmark::metrics::tests::it_should_compute_sorted_best_median_and_worst_for_each_operation ... ok +test persistence_benchmark::metrics::tests::it_should_fail_when_operation_has_no_samples ... ok +test persistence_benchmark::report::tests::it_should_convert_operation_durations_to_microseconds_in_report ... ok +test persistence_benchmark::report::tests::it_should_serialize_report_as_valid_pretty_json ... ok +test persistence_benchmark::types::tests::it_should_parse_db_version_when_value_has_allowed_characters ... ok +test persistence_benchmark::types::tests::it_should_parse_ops_count_when_value_is_positive ... ok +test persistence_benchmark::types::tests::it_should_reject_ops_count_when_value_is_not_numeric ... ok +test persistence_benchmark::types::tests::it_should_reject_db_version_when_value_has_invalid_characters ... ok +test persistence_benchmark::types::tests::it_should_reject_db_version_when_value_is_empty ... ok +test persistence_benchmark::types::tests::it_should_reject_ops_count_when_value_is_zero ... ok +test persistence_benchmark::reporting::tests::it_should_keep_postgresql_db_version_in_report_metadata ... ok +test persistence_benchmark::reporting::tests::it_should_keep_mysql_db_version_in_report_metadata ... ok +test persistence_benchmark::reporting::tests::it_should_normalize_db_version_to_dash_for_sqlite_reports ... ok + +test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 5 tests +test it_should_not_return_the_peer_making_the_announce_request ... ok +test it_should_handle_the_scrape_request ... ok +test it_should_handle_the_announce_request ... ok +test it_should_persist_the_number_of_completed_peers_for_each_torrent_into_the_database ... ok +test it_should_persist_the_global_number_of_completed_peers_into_the_database ... ok + +test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s + + +running 9 tests +test broadcaster::tests::it_should_allow_subscribing_multiple_receivers ... ok +test bus::tests::it_should_send_a_closed_events_to_receivers_when_sender_is_dropped ... ok +test broadcaster::tests::it_should_return_the_number_of_receivers_when_and_event_is_sent ... ok +test broadcaster::tests::it_should_fail_when_trying_tos_send_with_no_subscribers ... ok +test bus::tests::it_should_enabled_by_default ... ok +test bus::tests::it_should_provide_an_event_sender_when_enabled ... ok +test bus::tests::it_should_not_provide_event_sender_when_disabled ... ok +test bus::tests::it_should_allow_sending_events_that_are_received_by_receivers ... ok +test broadcaster::tests::it_should_allow_sending_an_event_and_received_it ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 15 tests +test event::test::events_should_be_comparable ... ok +test statistics::event::handler::tests::should_increase_the_tcp6_announces_counter_when_it_receives_a_tcp6_announce_event ... ok +test statistics::event::handler::tests::should_increase_the_tcp4_scrapes_counter_when_it_receives_a_tcp4_scrape_event ... ok +test statistics::event::handler::tests::should_increase_the_tcp6_scrapes_counter_when_it_receives_a_tcp6_scrape_event ... ok +test statistics::event::handler::tests::should_increase_the_tcp4_announces_counter_when_it_receives_a_tcp4_announce_event ... ok +test services::scrape::tests::with_real_data::it_should_send_the_tcp_6_scrape_event_when_the_peer_uses_ipv6 ... ok +test services::scrape::tests::with_zeroed_data::it_should_send_the_tcp_6_scrape_event_when_the_peer_uses_ipv6 ... ok +test services::scrape::tests::with_real_data::it_should_send_the_tcp_4_scrape_event_when_the_peer_uses_ipv4 ... ok +test services::scrape::tests::with_zeroed_data::it_should_send_the_tcp_4_scrape_event_when_the_peer_uses_ipv4 ... ok +test services::scrape::tests::with_real_data::it_should_return_the_scrape_data_for_a_torrent ... ok +test services::scrape::tests::with_zeroed_data::it_should_return_the_zeroed_scrape_data_when_the_tracker_is_running_in_private_mode_and_the_peer_is_not_authenticated ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4_even_if_the_tracker_changes_the_peer_ip_to_ipv6 ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4 ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_return_the_announce_data ... ok +test services::announce::tests::with_tracker_in_any_mode::it_should_send_the_tcp_6_announce_event_when_the_peer_uses_ipv6_even_if_the_tracker_changes_the_peer_ip_to_ipv4 ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + +Testing http_tracker_handle_announce_once/handle_announce_data +Success + + +running 44 tests +test percent_encoding::tests::it_should_decode_a_percent_encoded_info_hash ... ok +test percent_encoding::tests::it_should_decode_a_percent_encoded_peer_id ... ok +test percent_encoding::tests::it_should_fail_decoding_an_invalid_percent_encoded_info_hash ... ok +test percent_encoding::tests::it_should_fail_decoding_an_invalid_percent_encoded_peer_id ... ok +test v1::query::tests::url_query::param_name_value_pair::should_be_displayed ... ok +test v1::query::tests::url_query::param_name_value_pair::should_fail_parsing_an_invalid_query_param ... ok +test v1::query::tests::url_query::param_name_value_pair::should_parse_a_single_query_param ... ok +test v1::query::tests::url_query::should_allow_more_than_one_value_for_the_same_param::instantiated_from_a_vector ... ok +test v1::query::tests::url_query::should_allow_more_than_one_value_for_the_same_param::parsed_from_an_string ... ok +test v1::query::tests::url_query::should_be_displayed::with_multiple_params ... ok +test v1::query::tests::url_query::should_be_displayed::with_multiple_values_for_the_same_param ... ok +test v1::query::tests::url_query::should_be_displayed::with_one_param ... ok +test v1::query::tests::url_query::should_be_instantiated_from_a_string_pair_vector ... ok +test v1::query::tests::url_query::should_fail_parsing_an_invalid_query_string ... ok +test v1::query::tests::url_query::should_ignore_duplicate_param_values_when_asked_to_return_only_one_value ... ok +test v1::query::tests::url_query::should_ignore_the_preceding_question_mark_if_it_exists ... ok +test v1::query::tests::url_query::should_parse_the_query_params_from_an_url_query_string ... ok +test v1::query::tests::url_query::should_trim_whitespaces ... ok +test v1::requests::announce::tests::announce_request::should_be_instantiated_from_the_url_query_params ... ok +test v1::requests::announce::tests::announce_request::should_be_instantiated_from_the_url_query_with_only_the_mandatory_params ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_compact_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_downloaded_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_event_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_info_hash_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_left_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_numwant_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_peer_id_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_port_param_is_invalid ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_query_does_not_include_all_the_mandatory_params ... ok +test v1::requests::announce::tests::announce_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_uploaded_param_is_invalid ... ok +test v1::requests::scrape::tests::scrape_request::should_be_instantiated_from_the_url_query_with_only_one_infohash ... ok +test v1::requests::scrape::tests::scrape_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_info_hash_param_is_invalid ... ok +test v1::requests::scrape::tests::scrape_request::when_it_is_instantiated_from_the_url_query_params::it_should_fail_if_the_query_does_not_include_the_info_hash_param ... ok +test v1::responses::announce::tests::compact_announce_response_can_be_bencoded ... ok +test v1::responses::announce::tests::non_compact_announce_response_can_be_bencoded ... ok +test v1::responses::error::tests::http_tracker_errors_can_be_bencoded ... ok +test v1::responses::error::tests::it_should_map_a_peer_ip_resolution_error_into_an_error_response ... ok +test v1::responses::scrape::tests::scrape_response::should_be_bencoded ... ok +test v1::responses::scrape::tests::scrape_response::should_be_converted_from_scrape_data ... ok +test v1::responses::scrape::tests::scrape_response::should_encode_large_download_counts_as_i64 ... ok +test v1::services::peer_ip_resolver::tests::working_on_reverse_proxy_mode::it_should_get_the_remote_client_ip_from_the_right_most_ip_in_the_x_forwarded_for_header ... ok +test v1::services::peer_ip_resolver::tests::working_on_reverse_proxy_mode::it_should_return_an_error_if_it_cannot_get_the_right_most_ip_from_the_x_forwarded_for_header ... ok +test v1::services::peer_ip_resolver::tests::working_without_reverse_proxy::it_should_get_the_remote_client_address_from_the_connection_info ... ok +test v1::services::peer_ip_resolver::tests::working_without_reverse_proxy::it_should_return_an_error_if_it_cannot_get_the_remote_client_ip_from_the_connection_info ... ok + +test result: ok. 44 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 6 tests +test peer::test::peer::should_be_comparable ... ok +test peer::test::torrent_peer_id::should_be_converted_into_string_type_using_the_hex_string_format ... ok +test peer::test::torrent_peer_id::should_be_converted_to_hex_string ... ok +test peer::test::torrent_peer_id::should_fail_trying_to_convert_from_a_byte_vector_with_less_than_20_bytes - should panic ... ok +test peer::test::torrent_peer_id::should_fail_trying_to_convert_from_a_byte_vector_with_more_than_20_bytes - should panic ... ok +test scrape::tests::it_should_be_able_to_build_a_zeroed_scrape_data_for_a_list_of_info_hashes ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 7 tests +test connection_info::tests::origin::should_be_parsed_from_a_string_representing_a_url ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_fail_when_the_host_is_missing ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_add_the_slash_after_the_host ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_fail_when_the_scheme_is_not_supported ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_fail_when_the_scheme_is_missing ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_ignore_default_ports ... ok +test connection_info::tests::origin::when_parsing_from_url_string::should_remove_extra_path_and_query_parameters ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1 test +test statistics::services::tests::the_statistics_service_should_return_the_tracker_metrics ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + +running 95 tests +test event::test::events_should_be_comparable ... ok +test statistics::event::handler::tests::for_peer_metrics::it_should_increment_the_number_of_peers_removed_when_a_peer_removed_event_is_received ... ok +test statistics::event::handler::tests::for_peer_metrics::it_should_increment_the_number_of_peers_updated_when_a_peer_updated_event_is_received ... ok +test statistics::event::handler::tests::for_peer_metrics::it_should_increment_the_number_of_peers_added_when_a_peer_added_event_is_received ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_adjust_the_number_of_seeders_and_leechers_when_a_peer_updated_event_is_received_and_the_peer_changed_its_role::case_1 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_adjust_the_number_of_seeders_and_leechers_when_a_peer_updated_event_is_received_and_the_peer_changed_its_role::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_decrement_the_number_of_peer_connections_when_a_peer_removed_event_is_received::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_increment_the_number_of_peer_connections_when_a_peer_added_event_is_received::case_1 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_increment_the_number_of_peer_connections_when_a_peer_added_event_is_received::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::torrent_downloads_total::it_should_increment_the_number_of_downloads_when_a_peer_downloaded_event_is_received::case_1 ... ok +test statistics::event::handler::tests::for_peer_metrics::torrent_downloads_total::it_should_increment_the_number_of_downloads_when_a_peer_downloaded_event_is_received::case_2 ... ok +test statistics::event::handler::tests::for_peer_metrics::peer_connections_total::it_should_decrement_the_number_of_peer_connections_when_a_peer_removed_event_is_received::case_1 ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_decrement_the_number_of_torrents_when_a_torrent_removed_event_is_received ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_increment_the_number_of_torrents_added_when_a_torrent_added_event_is_received ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_increment_the_number_of_torrents_removed_when_a_torrent_removed_event_is_received ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_disabled::it_should_not_be_removed_even_if_the_swarm_is_empty ... ok +test statistics::event::handler::tests::for_torrent_metrics::it_should_increment_the_number_of_torrents_when_a_torrent_added_event_is_received ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_disabled::it_should_not_be_removed_is_the_swarm_is_not_empty ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_enabled::it_should_be_removed_if_the_swarm_is_empty ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_enabled::it_should_not_be_removed_even_if_the_swarm_is_empty_if_we_need_to_track_stats_for_downloads_and_there_has_been_downloads ... ok +test swarm::coordinator::tests::for_retaining_policy::when_removing_peerless_torrents_is_enabled::it_should_not_be_removed_is_the_swarm_is_not_empty ... ok +test swarm::coordinator::tests::it_should_allow_getting_all_peers ... ok +test swarm::coordinator::tests::it_should_allow_getting_all_peers_excluding_peers_with_a_given_address ... ok +test swarm::coordinator::tests::it_should_allow_getting_one_peer_by_id ... ok +test swarm::coordinator::tests::it_should_allow_inserting_a_new_peer ... ok +test swarm::coordinator::tests::it_should_allow_inserting_two_identical_peers_except_for_the_socket_address ... ok +test swarm::coordinator::tests::it_should_allow_removing_a_non_existing_peer ... ok +test swarm::coordinator::tests::it_should_allow_removing_an_existing_peer ... ok +test swarm::coordinator::tests::it_should_allow_updating_a_preexisting_peer ... ok +test swarm::coordinator::tests::it_should_be_empty_when_no_peers_have_been_inserted ... ok +test swarm::coordinator::tests::it_should_be_a_peerless_swarm_when_it_does_not_contain_any_peers ... ok +test swarm::coordinator::tests::it_should_count_inactive_peers ... ok +test swarm::coordinator::tests::it_should_decrease_the_number_of_peers_after_removing_one ... ok +test swarm::coordinator::tests::it_should_have_zero_length_when_no_peers_have_been_inserted ... ok +test swarm::coordinator::tests::it_should_increase_the_number_of_peers_after_inserting_a_new_one ... ok +test swarm::coordinator::tests::it_should_not_allow_inserting_two_peers_with_different_peer_id_but_the_same_socket_address ... ok +test swarm::coordinator::tests::it_should_not_remove_active_peers ... ok +test swarm::coordinator::tests::it_should_remove_inactive_peers ... ok +test swarm::coordinator::tests::it_should_return_the_number_of_leechers_in_the_list ... ok +test swarm::coordinator::tests::it_should_return_the_number_of_seeders_in_the_list ... ok +test swarm::coordinator::tests::it_should_return_the_swarm_metadata ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_new_peer_is_added ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_is_directly_removed ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_completes_a_download ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_is_removed_due_to_inactivity ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_increase_leechers_and_decreasing_seeders_when_the_peer_changes_from_seeder_to_leecher ... ok +test swarm::coordinator::tests::triggering_events::it_should_trigger_an_event_when_a_peer_is_updated ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_increase_seeders_and_decreasing_leechers_when_the_peer_changes_from_leecher_to_seeder_ ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_increase_the_number_of_downloads_when_the_peer_announces_completed_downloading ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::for_changes_in_existing_peers::it_should_not_increasing_the_number_of_downloads_when_the_peer_announces_completed_downloading_twice_ ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_new_peer_is_added::it_should_increase_the_number_of_leechers_if_the_new_peer_is_a_leecher_ ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_new_peer_is_added::it_should_increase_the_number_of_seeders_if_the_new_peer_is_a_seeder ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_new_peer_is_added::it_should_not_increasing_the_number_of_downloads_if_the_new_peer_has_completed_downloading_as_it_was_not_previously_known ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed::it_should_decrease_the_number_of_leechers_if_the_removed_peer_was_a_leecher ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed::it_should_decrease_the_number_of_seeders_if_the_removed_peer_was_a_seeder ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed_due_to_inactivity::it_should_decrease_the_number_of_leechers_when_a_removed_peer_is_a_leecher ... ok +test swarm::coordinator::tests::updating_the_swarm_metadata::when_a_peer_is_removed_due_to_inactivity::it_should_decrease_the_number_of_seeders_when_the_removed_peer_is_a_seeder ... ok +test swarm::registry::tests::the_swarm_repository::handling_persistence::it_should_allow_overwriting_a_previously_imported_persisted_torrent ... ok +test swarm::registry::tests::the_swarm_repository::handling_persistence::it_should_allow_importing_persisted_torrent_entries ... ok +test swarm::registry::tests::the_swarm_repository::handling_persistence::it_should_now_allow_importing_a_persisted_torrent_if_it_already_exists ... ok +test swarm::registry::tests::the_swarm_repository::it_should_be_empty_when_it_has_no_swarms ... ok +test swarm::registry::tests::the_swarm_repository::it_should_not_be_empty_when_it_has_at_least_one_swarm ... ok +test swarm::registry::tests::the_swarm_repository::it_should_return_the_length_when_it_has_swarms ... ok +test swarm::registry::tests::the_swarm_repository::it_should_return_zero_length_when_it_has_no_swarms ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_peer_lists::it_should_add_the_first_peer_to_the_torrent_peer_list ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_peer_lists::it_should_allow_adding_the_same_peer_twice_to_the_torrent_peer_list ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_count_inactive_peers ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_remove_a_torrent_entry ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_remove_peers_that_have_not_been_updated_after_a_cutoff_time ... ok +test swarm::registry::tests::the_swarm_repository::maintaining_the_torrent_entries::it_should_remove_torrents_without_peers ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peerless_torrents::no_peerless_torrents ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peerless_torrents::one_peerless_torrents ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peers::no_peers ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_count_peers::one_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_get_empty_aggregate_swarm_metadata_when_there_are_no_torrents ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_is_a_completed_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_is_a_leecher ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_is_a_seeder ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::excluding_the_client_peer::it_should_return_an_empty_peer_list_for_a_non_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::excluding_the_client_peer::it_should_return_74_peers_at_the_most_for_a_given_torrent_when_it_filters_out_a_given_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::excluding_the_client_peer::it_should_return_the_peers_for_a_given_torrent_excluding_a_given_peer ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::it_should_return_an_empty_list_or_peers_for_a_non_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::it_should_return_the_peers_for_a_given_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_peer_lists_for_a_torrent::it_should_return_74_peers_at_the_most_for_a_given_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_swarm_metadata::it_should_get_swarm_metadata_for_an_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_swarm_metadata::it_should_return_zeroed_swarm_metadata_for_a_non_existing_torrent ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::with_pagination::it_should_allow_changing_the_page_size ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::with_pagination::it_should_return_the_first_page ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::without_pagination ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_many_torrent_entries::with_pagination::it_should_return_the_second_page ... ok +test swarm::registry::tests::the_swarm_repository::returning_torrent_entries::it_should_return_one_torrent_entry_by_infohash ... ok +test swarm::registry::tests::triggering_events::it_should_trigger_an_event_when_a_peerless_torrent_is_removed ... ok +test swarm::registry::tests::triggering_events::it_should_trigger_an_event_when_a_new_torrent_is_added ... ok +test swarm::registry::tests::triggering_events::it_should_trigger_an_event_when_a_torrent_is_directly_removed ... ok +test swarm::registry::tests::the_swarm_repository::returning_aggregate_swarm_metadata::it_should_return_the_aggregate_swarm_metadata_when_there_are_multiple_torrents ... ok + +test result: ok. 95 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.82s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 15 tests +test entry::peer_list::tests::it_should::allow_getting_all_peers_excluding_peers_with_a_given_address ... ok +test entry::peer_list::tests::it_should::allow_getting_all_peers ... ok +test entry::peer_list::tests::it_should::allow_getting_one_peer_by_id ... ok +test entry::peer_list::tests::it_should::allow_inserting_a_new_peer ... ok +test entry::peer_list::tests::it_should::allow_inserting_two_identical_peers_except_for_the_id ... ok +test entry::peer_list::tests::it_should::allow_removing_an_existing_peer ... ok +test entry::peer_list::tests::it_should::allow_updating_a_preexisting_peer ... ok +test entry::peer_list::tests::it_should::be_empty_when_no_peers_have_been_inserted ... ok +test entry::peer_list::tests::it_should::decrease_the_number_of_peers_after_removing_one ... ok +test entry::peer_list::tests::it_should::have_zero_length_when_no_peers_have_been_inserted ... ok +test entry::peer_list::tests::it_should::increase_the_number_of_peers_after_inserting_a_new_one ... ok +test entry::peer_list::tests::it_should::not_remove_active_peers ... ok +test entry::peer_list::tests::it_should::remove_inactive_peers ... ok +test entry::peer_list::tests::it_should::return_the_number_of_leechers_in_the_list ... ok +test entry::peer_list::tests::it_should::return_the_number_of_seeders_in_the_list ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 1468 tests +test entry::it_should_be_empty_by_default::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_be_empty_by_default::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_1_empty::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_2_started::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_3_completed::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_4_downloaded::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_1_single__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_2_mutex_std__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_3_mutex_tokio__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_4_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test entry::it_should_check_if_entry_should_be_retained_based_on_the_tracker_policy::case_5_three::torrent_5_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_1_single__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_excluding_the_client_socket::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_1_single__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_get_peers_for_torrent_entry::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_1_single__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_handle_a_peer_completed_announcement_and_update_the_downloaded_statistic::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_1_single__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_limit_the_number_of_peers_returned::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_1_single__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_a_peer_upon_stopped_announcement::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_1_empty::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_2_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_3_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_4_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_1_single__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_remove_inactive_peers_beyond_cutoff::case_5_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer::case_1_empty::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_1_empty::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_1_empty::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_2_started::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_2_started::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_2_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_3_completed::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_3_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_3_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_4_downloaded::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_4_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_4_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer::case_5_three::torrent_1_single__ ... ok +test entry::it_should_update_a_peer::case_5_three::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer::case_5_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_a_seeder::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_1_started::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_2_completed::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_3_downloaded::torrent_5_rw_lock_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_1_single__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_2_mutex_std__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_3_mutex_tokio__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_4_mutex_parking_lot__ ... ok +test entry::it_should_update_a_peer_as_incomplete::case_4_three::torrent_5_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_01_standard__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_get_a_torrent_entry::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_metrics::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_a_torrent_entry::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_metrics::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_metrics::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_2_default::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_3_started::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_6_three::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_2_standard_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_3_standard_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_3_standard_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_4_tokio_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_4_tokio_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_4_tokio_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_5_tokio_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_6_tokio_tokio__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_6_tokio_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_5_tokio_mutex__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_7_skip_list_mutex_std__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_6_tokio_tokio__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_7_skip_list_mutex_std__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_8_skip_list_mutex_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_1_standard__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_3_standard_tokio__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_1_standard__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_5_tokio_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_7_skip_list_mutex_std__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_1_standard__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_1_empty::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_1_standard__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_1_standard__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_2_default::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_4_completed::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_3_standard_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_5_downloaded::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_6_tokio_tokio__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_4_tokio_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_1_standard__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_3_started::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_6_three::repo_3_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_2_standard_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_3_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_1_standard__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_1_empty::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_4_tokio_std__ ... ok +test repository::it_should_import_persistent_torrents::case_2_default::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_6_tokio_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_3_started::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_4_completed::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_2_standard_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_7_skip_list_mutex_std__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_9_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_4_tokio_std__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_8_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_7_out_of_order::repo_5_tokio_mutex__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_6_tokio_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_3_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_01_standard__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_02_standard_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_02_standard_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_get_paginated_entries_in_a_stable_or_sorted_order::case_8_in_order::repo_1_standard__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_01_standard__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_02_standard_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_03_standard_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_04_tokio_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_03_standard_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_04_tokio_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_01_standard__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_7_out_of_order::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_04_tokio_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_05_tokio_mutex__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_05_tokio_mutex__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_05_tokio_mutex__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_10_dash_map_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_03_standard_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_06_tokio_tokio__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_10_dash_map_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_remove_an_entry::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_01_standard__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_06_tokio_tokio__::persistent_torrents_1_persistent_empty__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::persistent_torrents_2_persistent_single__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_06_tokio_tokio__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_import_persistent_torrents::case_8_in_order::repo_10_dash_map_std__::persistent_torrents_3_persistent_three__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_01_standard__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_2_standard_mutex__::paginated_1_paginated_limit_zero__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_1_standard__::paginated_3_paginated_limit_one_offset_one__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_1_empty::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_2_default::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_04_tokio_std__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_3_started::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_06_tokio_tokio__ ... ok +test repository::it_should_get_paginated::case_8_in_order::repo_2_standard_mutex__::paginated_2_paginated_limit_one__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_4_completed::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_01_standard__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_an_entry::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_04_tokio_std__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_inactive_peers::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_an_entry::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_6_three::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_01_standard__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_04_tokio_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_02_standard_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_01_standard__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_10_dash_map_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_05_tokio_mutex__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_03_standard_tokio__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_06_tokio_tokio__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_08_skip_list_mutex_parking_lot__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_1_empty::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_inactive_peers::case_8_in_order::repo_07_skip_list_mutex_std__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_2_default::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_3_started::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_4_completed::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_5_downloaded::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_6_three::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_01_standard__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_7_out_of_order::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_02_standard_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_04_tokio_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_05_tokio_mutex__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_03_standard_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_08_skip_list_mutex_parking_lot__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_06_tokio_tokio__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_07_skip_list_mutex_std__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_2_policy_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_1_policy_none__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_3_policy_remove__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_10_dash_map_std__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_4_policy_remove_persist__ ... ok +test repository::it_should_remove_peerless_torrents::case_8_in_order::repo_09_skip_list_rw_lock_parking_lot__::policy_1_policy_none__ ... ok + +test result: ok. 1468 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s + +Testing add_one_torrent/RwLockStd +Success +Testing add_one_torrent/RwLockStdMutexStd +Success +Testing add_one_torrent/RwLockStdMutexTokio +Success +Testing add_one_torrent/RwLockTokio +Success +Testing add_one_torrent/RwLockTokioMutexStd +Success +Testing add_one_torrent/RwLockTokioMutexTokio +Success +Testing add_one_torrent/SkipMapMutexStd +Success +Testing add_one_torrent/SkipMapMutexParkingLot +Success +Testing add_one_torrent/SkipMapRwLockParkingLot +Success +Testing add_one_torrent/DashMapMutexStd +Success + +Testing add_multiple_torrents_in_parallel/RwLockStd +Success +Testing add_multiple_torrents_in_parallel/RwLockStdMutexStd +Success +Testing add_multiple_torrents_in_parallel/RwLockStdMutexTokio +Success +Testing add_multiple_torrents_in_parallel/RwLockTokio +Success +Testing add_multiple_torrents_in_parallel/RwLockTokioMutexStd +Success +Testing add_multiple_torrents_in_parallel/RwLockTokioMutexTokio +Success +Testing add_multiple_torrents_in_parallel/SkipMapMutexStd +Success +Testing add_multiple_torrents_in_parallel/SkipMapMutexParkingLot +Success +Testing add_multiple_torrents_in_parallel/SkipMapRwLockParkingLot +Success +Testing add_multiple_torrents_in_parallel/DashMapMutexStd +Success + +Testing update_one_torrent_in_parallel/RwLockStd +Success +Testing update_one_torrent_in_parallel/RwLockStdMutexStd +Success +Testing update_one_torrent_in_parallel/RwLockStdMutexTokio +Success +Testing update_one_torrent_in_parallel/RwLockTokio +Success +Testing update_one_torrent_in_parallel/RwLockTokioMutexStd +Success +Testing update_one_torrent_in_parallel/RwLockTokioMutexTokio +Success +Testing update_one_torrent_in_parallel/SkipMapMutexStd +Success +Testing update_one_torrent_in_parallel/SkipMapMutexParkingLot +Success +Testing update_one_torrent_in_parallel/SkipMapRwLockParkingLot +Success +Testing update_one_torrent_in_parallel/DashMapMutexStd +Success + +Testing update_multiple_torrents_in_parallel/RwLockStd +Success +Testing update_multiple_torrents_in_parallel/RwLockStdMutexStd +Success +Testing update_multiple_torrents_in_parallel/RwLockStdMutexTokio +Success +Testing update_multiple_torrents_in_parallel/RwLockTokio +Success +Testing update_multiple_torrents_in_parallel/RwLockTokioMutexStd +Success +Testing update_multiple_torrents_in_parallel/RwLockTokioMutexTokio +Success +Testing update_multiple_torrents_in_parallel/SkipMapMutexStd +Success +Testing update_multiple_torrents_in_parallel/SkipMapMutexParkingLot +Success +Testing update_multiple_torrents_in_parallel/SkipMapRwLockParkingLot +Success +Testing update_multiple_torrents_in_parallel/DashMapMutexStd +Success + + +running 122 tests +test handlers::connect::tests::connect_request::it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ... ok +test handlers::connect::tests::connect_request::it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ... ok +test handlers::scrape::tests::should_saturate_large_download_counts_for_udp_protocol ... ok +test handlers::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id_ipv6 ... ok +test handlers::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp6_announce_requests_counter_when_it_receives_a_udp6_request_event_of_announce_kind ... ok +test statistics::event::handler::request_aborted::tests::should_increase_the_udp_abort_counter_when_it_receives_a_udp_abort_event ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp4_scrape_requests_counter_when_it_receives_a_udp4_request_event_of_scrape_kind ... ok +test statistics::event::handler::error::tests::should_increase_the_udp4_errors_counter_when_it_receives_a_udp4_error_event ... ok +test statistics::event::handler::request_aborted::tests::should_increase_the_number_of_aborted_requests_when_it_receives_a_udp_request_aborted_event ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp4_connect_requests_counter_when_it_receives_a_udp4_request_event_of_connect_kind ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp4_announce_requests_counter_when_it_receives_a_udp4_request_event_of_announce_kind ... ok +test handlers::connect::tests::connect_request::a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp6_connect_requests_counter_when_it_receives_a_udp6_request_event_of_connect_kind ... ok +test statistics::event::handler::request_accepted::tests::should_increase_the_udp6_scrape_requests_counter_when_it_receives_a_udp6_request_event_of_scrape_kind ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_handle_fractional_averages_with_truncation ... ok +test statistics::event::handler::request_banned::tests::should_increase_the_number_of_banned_requests_when_it_receives_a_udp_request_banned_event ... ok +test statistics::event::handler::response_sent::tests::should_increase_the_udp6_response_counter_when_it_receives_a_udp6_response_event ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_handle_single_server_averaged_metrics ... ok +test statistics::event::handler::request_banned::tests::should_increase_the_udp_ban_counter_when_it_receives_a_udp_banned_event ... ok +test statistics::event::handler::request_received::tests::should_increase_the_number_of_incoming_requests_when_it_receives_a_udp4_incoming_request_event ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_only_average_matching_request_kinds ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_averaged_value_for_udp_avg_announce_processing_time_ns_averaged ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_averaged_value_for_udp_avg_scrape_processing_time_ns_averaged ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_zero_for_udp_avg_announce_processing_time_ns_averaged_when_no_data ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_zero_for_udp_avg_connect_processing_time_ns_averaged_when_no_data ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_zero_for_udp_avg_scrape_processing_time_ns_averaged_when_no_data ... ok +test statistics::metrics::tests::combined_metrics::it_should_distinguish_between_different_request_kinds ... ok +test statistics::metrics::tests::combined_metrics::it_should_distinguish_between_ipv4_and_ipv6_metrics ... ok +test statistics::event::handler::response_sent::tests::should_increase_the_udp4_responses_counter_when_it_receives_a_udp4_response_event ... ok +test statistics::metrics::tests::averaged_processing_time_metrics::it_should_return_averaged_value_for_udp_avg_connect_processing_time_ns_averaged ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_empty_label_sets ... ok +test statistics::metrics::tests::combined_metrics::it_should_handle_mixed_ipv4_and_ipv6_for_different_request_kinds ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_large_gauge_values ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_multiple_labels_on_same_metric ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_zero_gauge_values ... ok +test statistics::metrics::tests::edge_cases::it_should_overwrite_gauge_values_when_set_multiple_times ... ok +test statistics::metrics::tests::error_handling::it_should_handle_unknown_metric_names_gracefully ... ok +test statistics::metrics::tests::edge_cases::it_should_handle_large_counter_values ... ok +test statistics::metrics::tests::error_handling::it_should_return_ok_result_for_valid_counter_operations ... ok +test statistics::metrics::tests::error_handling::it_should_return_ok_result_for_valid_gauge_operations ... ok +test statistics::metrics::tests::it_should_implement_debug ... ok +test statistics::metrics::tests::it_should_implement_default ... ok +test statistics::metrics::tests::it_should_implement_partial_eq ... ok +test statistics::metrics::tests::it_should_increase_counter_metric ... ok +test statistics::metrics::tests::it_should_increase_counter_metric_with_labels ... ok +test statistics::metrics::tests::it_should_increment_processed_requests_total ... ok +test statistics::metrics::tests::it_should_return_zero_for_udp_processed_requests_total_when_no_data ... ok +test statistics::metrics::tests::it_should_set_gauge_metric ... ok +test statistics::metrics::tests::it_should_set_gauge_metric_with_labels ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_gauge_value_for_udp_banned_ips_total ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_sum_of_udp_requests_aborted ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_sum_of_udp_requests_banned ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_zero_for_udp_banned_ips_total_when_no_data ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_zero_for_udp_requests_aborted_when_no_data ... ok +test statistics::metrics::tests::udp_general_metrics::it_should_return_zero_for_udp_requests_banned_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_announces_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_connections_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_errors_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_requests ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_responses ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_sum_of_udp4_scrapes_handled ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_announces_handled_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_connections_handled_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_errors_handled_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_requests_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_responses_when_no_data ... ok +test statistics::metrics::tests::udpv4_metrics::it_should_return_zero_for_udp4_scrapes_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_announces_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_connections_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_errors_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_requests ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_responses ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_sum_of_udp6_scrapes_handled ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_announces_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_connections_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_requests_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_scrapes_handled_when_no_data ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_responses_when_no_data ... ok +test statistics::repository::tests::it_should_allow_increasing_a_counter_metric_successfully ... ok +test statistics::repository::tests::it_should_allow_increasing_a_counter_multiple_times ... ok +test statistics::metrics::tests::udpv6_metrics::it_should_return_zero_for_udp6_errors_handled_when_no_data ... ok +test statistics::repository::tests::it_should_allow_increasing_a_counter_with_different_labels ... ok +test statistics::repository::tests::it_should_be_cloneable ... ok +test statistics::repository::tests::it_should_allow_setting_a_gauge_with_different_labels ... ok +test statistics::repository::tests::it_should_be_initialized_with_described_metrics ... ok +test statistics::repository::tests::it_should_handle_error_cases_gracefully ... ok +test statistics::repository::tests::it_should_handle_concurrent_access ... ok +test statistics::repository::tests::it_should_handle_large_processing_times ... ok +test statistics::repository::tests::it_should_implement_default ... ok +test statistics::repository::tests::it_should_maintain_consistency_across_operations ... ok +test statistics::repository::tests::it_should_overwrite_previous_value_when_setting_a_gauge_with_a_previous_value ... ok +test statistics::repository::tests::it_should_recalculate_the_udp_average_announce_processing_time_in_nanoseconds_using_moving_average ... ok +test statistics::repository::tests::it_should_recalculate_the_udp_average_connect_processing_time_in_nanoseconds_using_moving_average ... ok +test statistics::repository::tests::it_should_recalculate_the_udp_average_scrape_processing_time_in_nanoseconds_using_moving_average ... ok +test statistics::repository::tests::it_should_set_a_gauge_metric_successfully ... ok +test statistics::repository::tests::it_should_return_a_read_guard_to_metrics ... ok +test statistics::repository::tests::recalculate_average_methods_should_handle_zero_connections_gracefully ... ok +test statistics::services::tests::the_statistics_service_should_return_the_tracker_metrics ... ok +test statistics::repository::tests::race_conditions::it_should_handle_race_conditions_when_updating_udp_performance_metrics_in_parallel ... ok +test handlers::announce::tests::announce_request::using_ipv6::from_a_loopback_ip::the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration ... ok +test handlers::announce::tests::announce_request::using_ipv6::the_announced_peer_should_not_be_included_in_the_response ... ok +test handlers::announce::tests::announce_request::using_ipv4::from_a_loopback_ip::the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration_if_defined ... ok +test handlers::announce::tests::announce_request::using_ipv6::the_tracker_should_always_use_the_remote_client_ip_but_not_the_port_in_the_udp_request_header_instead_of_the_peer_address_in_the_announce_request ... ok +test handlers::scrape::tests::scrape_request::using_ipv4::should_send_the_upd4_scrape_event ... ok +test handlers::scrape::tests::scrape_request::with_a_whitelisted_tracker::should_return_zeroed_statistics_when_the_requested_torrent_is_not_whitelisted ... ok +test handlers::announce::tests::announce_request::using_ipv4::when_the_announce_request_comes_from_a_client_using_ipv4_the_response_should_not_include_peers_using_ipv6 ... ok +test handlers::announce::tests::announce_request::using_ipv6::an_announced_peer_should_be_added_to_the_tracker ... ok +test handlers::announce::tests::announce_request::using_ipv4::should_send_the_upd4_announce_event ... ok +test handlers::announce::tests::announce_request::using_ipv4::an_announced_peer_should_be_added_to_the_tracker ... ok +test handlers::scrape::tests::scrape_request::using_ipv6::should_send_the_upd6_scrape_event ... ok +test handlers::scrape::tests::scrape_request::should_return_no_stats_when_the_tracker_does_not_have_any_torrent ... ok +test handlers::announce::tests::announce_request::using_ipv4::the_tracker_should_always_use_the_remote_client_ip_but_not_the_port_in_the_udp_request_header_instead_of_the_peer_address_in_the_announce_request ... ok +test handlers::announce::tests::announce_request::using_ipv6::should_send_the_upd6_announce_event ... ok +test handlers::scrape::tests::scrape_request::with_a_whitelisted_tracker::should_return_the_torrent_statistics_when_the_requested_torrent_is_whitelisted ... ok +test handlers::scrape::tests::scrape_request::with_a_public_tracker::should_return_torrent_statistics_when_the_tracker_has_the_requested_torrent ... ok +test handlers::announce::tests::announce_request::using_ipv4::the_announced_peer_should_not_be_included_in_the_response ... ok +test handlers::announce::tests::announce_request::using_ipv6::when_the_announce_request_comes_from_a_client_using_ipv6_the_response_should_not_include_peers_using_ipv4 ... ok +test server::test_tokio::test_barrier_with_aborted_tasks ... ok +test server::tests::it_should_be_able_to_start_and_stop ... ok +test environment::tests::it_should_make_and_stop_udp_server ... ok +test server::tests::it_should_be_able_to_start_and_stop_with_wait ... ok + +test result: ok. 122 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.07s + + +running 6 tests +test server::contract::receiving_an_scrape_request::should_return_a_scrape_response ... ok +test server::contract::receiving_an_announce_request::should_return_an_announce_response ... ok +test server::contract::should_return_a_bad_request_response_when_the_client_sends_an_empty_request ... ok +test server::contract::receiving_a_connection_request::should_return_a_connect_response ... ok +test server::contract::receiving_an_announce_request::should_return_many_announce_response ... ok +test server::contract::receiving_an_announce_request::should_ban_the_client_ip_if_it_sends_more_than_10_requests_with_a_cookie_value_not_normal ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.04s + + +running 29 tests +test connection_cookie::tests::it_should_create_different_cookies_for_different_fingerprints ... ok +test connection_cookie::tests::it_should_create_same_cookie_for_same_input ... ok +test connection_cookie::tests::it_should_create_different_cookies_for_different_issue_times ... ok +test connection_cookie::tests::it_should_make_a_connection_cookie ... ok +test connection_cookie::tests::it_should_reject_an_expired_cookie ... ok +test connection_cookie::tests::it_should_reject_a_cookie_from_the_future ... ok +test connection_cookie::tests::it_should_validate_a_valid_cookie ... ok +test crypto::keys::detail_cipher::tests::it_should_default_to_zeroed_seed_when_testing ... ok +test crypto::keys::detail_seed::tests::it_should_default_to_zeroed_seed_when_testing ... ok +test crypto::keys::detail_seed::tests::it_should_have_a_large_random_seed ... ok +test crypto::keys::detail_seed::tests::it_should_have_a_zero_test_seed ... ok +test crypto::keys::tests::the_default_seed_and_the_instance_seed_should_be_different_when_testing ... ok +test crypto::keys::tests::the_default_seed_and_the_zeroed_seed_should_be_the_same_when_testing ... ok +test services::banning::tests::it_should_allow_resetting_all_the_counters ... ok +test services::banning::tests::it_should_ban_ips_with_counters_exceeding_a_predefined_limit ... ok +test services::banning::tests::it_should_increase_the_errors_counter_for_a_given_ip ... ok +test services::banning::tests::it_should_not_ban_ips_whose_counters_do_not_exceed_the_predefined_limit ... ok +test services::connect::tests::connect_request::it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ... ok +test services::connect::tests::connect_request::it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ... ok +test statistics::event::handler::tests::should_increase_the_udp4_connections_counter_when_it_receives_a_udp4_connect_event ... ok +test statistics::event::handler::tests::should_increase_the_udp4_announces_counter_when_it_receives_a_udp4_announce_event ... ok +test statistics::event::handler::tests::should_increase_the_udp6_connections_counter_when_it_receives_a_udp6_connect_event ... ok +test statistics::event::handler::tests::should_increase_the_udp4_scrapes_counter_when_it_receives_a_udp4_scrape_event ... ok +test statistics::event::handler::tests::should_increase_the_udp6_announces_counter_when_it_receives_a_udp6_announce_event ... ok +test statistics::event::handler::tests::should_increase_the_udp6_scrapes_counter_when_it_receives_a_udp6_scrape_event ... ok +test statistics::services::tests::the_statistics_service_should_return_the_tracker_metrics ... ok +test services::connect::tests::connect_request::a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ... ok +test services::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id ... ok +test services::connect::tests::connect_request::a_connect_response_should_contain_a_new_connection_id_ipv6 ... ok + +test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + +Testing udp_tracker/connect_once/connect_once +Success + + +running 9 tests +test request::tests::test_connect_request_convert_identity ... ok +test request::tests::test_announce_request_convert_identity ... ok +test request::tests::test_scrape_request_with_no_info_hashes ... ok +test request::tests::test_various_input_lengths ... ok +test response::tests::test_connect_response_convert_identity ... ok +test response::tests::test_announce_response_ipv4_convert_identity ... ok +test response::tests::test_scrape_response_convert_identity ... ok +test request::tests::test_scrape_request_convert_identity ... ok +test response::tests::test_announce_response_ipv6_convert_identity ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +[warm] test_unit_seconds=16 +[warm] test_unit_exit_code=0 +[warm] docker_build_e2e_start +[warm] docker_build_e2e_seconds=234 +[warm] docker_build_e2e_exit_code=0 +[warm] e2e_tracker_start +2026-05-27T21:29:18.831744Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Logging initialized +2026-05-27T21:29:18.831818Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Reading tracker configuration from file: ./share/default/config/tracker.e2e.container.sqlite3.toml ... +2026-05-27T21:29:18.831832Z  INFO torrust_tracker_lib::console::ci::e2e::runner: tracker config: +[metadata] +app = "torrust-tracker" +purpose = "configuration" +schema_version = "2.0.0" + +[logging] +threshold = "info" + +[core] +listed = false +private = false + +[core.database] +path = "/var/lib/torrust/tracker/database/sqlite3.db" + +[[udp_trackers]] +bind_address = "0.0.0.0:6969" + +[[http_trackers]] +bind_address = "0.0.0.0:7070" + +[http_api] +bind_address = "0.0.0.0:1212" + +[http_api.access_tokens] +admin = "MyAccessToken" + +[health_check_api] +# Must be bound to wildcard IP to be accessible from outside the container +bind_address = "0.0.0.0:1313" + +2026-05-27T21:29:18.831857Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Running docker tracker image: tracker_EH0ZAqNRTQP1Z4uwI9De ... +2026-05-27T21:29:19.009760Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Waiting for the container tracker_EH0ZAqNRTQP1Z4uwI9De to be healthy ... +2026-05-27T21:29:19.018616Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up Less than a second (health: starting)\n" +2026-05-27T21:29:20.037795Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 1 second (health: starting)\n" +2026-05-27T21:29:21.047345Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 2 seconds (health: starting)\n" +2026-05-27T21:29:22.056813Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 3 seconds (health: starting)\n" +2026-05-27T21:29:23.066086Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 4 seconds (health: starting)\n" +2026-05-27T21:29:24.075498Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Waiting until container is healthy: "Up 5 seconds (healthy)\n" +2026-05-27T21:29:24.075507Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Container tracker_EH0ZAqNRTQP1Z4uwI9De is healthy ... +2026-05-27T21:29:24.095578Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Parsing running services from logs. Logs : +Loading extra configuration from environment variable: + [metadata] +app = "torrust-tracker" +purpose = "configuration" +schema_version = "2.0.0" + +[logging] +threshold = "info" + +[core] +listed = false +private = false + +[core.database] +path = "/var/lib/torrust/tracker/database/sqlite3.db" + +[[udp_trackers]] +bind_address = "0.0.0.0:6969" + +[[http_trackers]] +bind_address = "0.0.0.0:7070" + +[http_api] +bind_address = "0.0.0.0:1212" + +[http_api.access_tokens] +admin = "MyAccessToken" + +[health_check_api] +# Must be bound to wildcard IP to be accessible from outside the container +bind_address = "0.0.0.0:1313" + +Loading extra configuration from file: `/etc/torrust/tracker/tracker.toml` ... +\x1b[2m2026-05-27T21:29:19.040814Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[2mtorrust_tracker_configuration::logging\x1b[0m\x1b[2m:\x1b[0m Logging initialized +\x1b[2m2026-05-27T21:29:19.040831Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[2mtorrust_tracker_lib::bootstrap::app\x1b[0m\x1b[2m:\x1b[0m Configuration: +{ + "metadata": { + "app": "torrust-tracker", + "purpose": "configuration", + "schema_version": "2.0.0" + }, + "logging": { + "threshold": "info" + }, + "core": { + "announce_policy": { + "interval": 120, + "interval_min": 120 + }, + "database": { + "driver": "sqlite3", + "path": "/var/lib/torrust/tracker/database/sqlite3.db" + }, + "inactive_peer_cleanup_interval": 600, + "listed": false, + "net": { + "external_ip": "0.0.0.0", + "on_reverse_proxy": false + }, + "private": false, + "private_mode": null, + "tracker_policy": { + "max_peer_timeout": 900, + "persistent_torrent_completed_stat": false, + "remove_peerless_torrents": true + }, + "tracker_usage_statistics": true + }, + "udp_trackers": [ + { + "bind_address": "0.0.0.0:6969", + "cookie_lifetime": { + "secs": 120, + "nanos": 0 + }, + "tracker_usage_statistics": false + } + ], + "http_trackers": [ + { + "bind_address": "0.0.0.0:7070", + "tsl_config": null, + "tracker_usage_statistics": false + } + ], + "http_api": { + "bind_address": "0.0.0.0:1212", + "tsl_config": null, + "access_tokens": { + "admin": "***" + } + }, + "health_check_api": { + "bind_address": "0.0.0.0:1313" + } +} +\x1b[2m2026-05-27T21:29:19.045460Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_added_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrents added.")) +\x1b[2m2026-05-27T21:29:19.045471Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_removed_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrents removed.")) +\x1b[2m2026-05-27T21:29:19.045474Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrents.")) +\x1b[2m2026-05-27T21:29:19.045477Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_downloads_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrent downloads.")) +\x1b[2m2026-05-27T21:29:19.045479Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_torrents_inactive_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of inactive torrents.")) +\x1b[2m2026-05-27T21:29:19.045481Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_added_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers added.")) +\x1b[2m2026-05-27T21:29:19.045483Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_removed_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers removed.")) +\x1b[2m2026-05-27T21:29:19.045485Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_updated_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers updated.")) +\x1b[2m2026-05-27T21:29:19.045488Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peer_connections_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peer connections (one connection per torrent).")) +\x1b[2m2026-05-27T21:29:19.045490Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_unique_peers_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of unique peers.")) +\x1b[2m2026-05-27T21:29:19.045492Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_inactive_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of inactive peers.")) +\x1b[2m2026-05-27T21:29:19.045494Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"swarm_coordination_registry_peers_completed_state_reverted_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of peers whose completed state was reverted.")) +\x1b[2m2026-05-27T21:29:19.060758Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"tracker_core_persistent_torrents_downloads_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("The total number of torrent downloads (persisted).")) +\x1b[2m2026-05-27T21:29:19.064773Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"http_tracker_core_requests_received_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of HTTP requests received")) +\x1b[2m2026-05-27T21:29:19.068876Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_core_requests_received_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests received")) +\x1b[2m2026-05-27T21:29:19.073382Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_aborted_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests aborted")) +\x1b[2m2026-05-27T21:29:19.073385Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_banned_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests banned")) +\x1b[2m2026-05-27T21:29:19.073388Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_ips_banned_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of IPs banned from UDP requests")) +\x1b[2m2026-05-27T21:29:19.073392Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_connection_id_errors_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of requests with connection ID errors")) +\x1b[2m2026-05-27T21:29:19.073395Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_received_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests received")) +\x1b[2m2026-05-27T21:29:19.073397Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_requests_accepted_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests accepted")) +\x1b[2m2026-05-27T21:29:19.073399Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_responses_sent_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP responses sent")) +\x1b[2m2026-05-27T21:29:19.073401Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_errors_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of errors processing UDP requests")) +\x1b[2m2026-05-27T21:29:19.073403Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"gauge" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_performance_avg_processing_time_ns" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Nanoseconds) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Average time to process a UDP request in nanoseconds")) +\x1b[2m2026-05-27T21:29:19.073406Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1minitialize\x1b[0m\x1b[2m:\x1b[0m \x1b[2mMETRICS\x1b[0m\x1b[2m:\x1b[0m \x1b[3mtype\x1b[0m\x1b[2m=\x1b[0m"counter" \x1b[3mname\x1b[0m\x1b[2m=\x1b[0m"udp_tracker_server_performance_avg_processed_requests_total" \x1b[3munit\x1b[0m\x1b[2m=\x1b[0mSome(Count) \x1b[3mdescription\x1b[0m\x1b[2m=\x1b[0mSome(MetricDescription("Total number of UDP requests processed for the average performance metrics")) +\x1b[2m2026-05-27T21:29:19.073421Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mSWARM_COORDINATION_REGISTRY\x1b[0m\x1b[2m:\x1b[0m Starting swarm coordination registry event listener +\x1b[2m2026-05-27T21:29:19.073428Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mTRACKER_CORE\x1b[0m\x1b[2m:\x1b[0m Starting tracker core event listener +\x1b[2m2026-05-27T21:29:19.073433Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting HTTP tracker core event listener +\x1b[2m2026-05-27T21:29:19.073440Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting UDP tracker core event listener +\x1b[2m2026-05-27T21:29:19.073444Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting UDP tracker server event listener +\x1b[2m2026-05-27T21:29:19.073449Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting UDP tracker server event listener (banning) +\x1b[2m2026-05-27T21:29:19.073484Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrun_with_graceful_shutdown\x1b[0m\x1b[1m{\x1b[0m\x1b[3mcookie_lifetime\x1b[0m\x1b[2m=\x1b[0m120s\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting on: 0.0.0.0:6969 +\x1b[2m2026-05-27T21:29:19.073520Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrun_with_graceful_shutdown\x1b[0m\x1b[1m{\x1b[0m\x1b[3mcookie_lifetime\x1b[0m\x1b[2m=\x1b[0m120s\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mUDP TRACKER\x1b[0m\x1b[2m:\x1b[0m Started on: udp://0.0.0.0:6969 +\x1b[2m2026-05-27T21:29:19.073546Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_job\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart\x1b[0m\x1b[1m{\x1b[0m\x1b[3mcookie_lifetime\x1b[0m\x1b[2m=\x1b[0m120s\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mtorrust_tracker_udp_server::server::states\x1b[0m\x1b[2m:\x1b[0m \x1b[3mreturn\x1b[0m\x1b[2m=\x1b[0mRunning (with local address): 0.0.0.0:6969 +\x1b[2m2026-05-27T21:29:19.073604Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m Starting on: http://0.0.0.0:7070 +\x1b[2m2026-05-27T21:29:19.073674Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m Started on: http://0.0.0.0:7070 +\x1b[2m2026-05-27T21:29:19.073777Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m Starting on: http://0.0.0.0:1212 +\x1b[2m2026-05-27T21:29:19.073779Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m Started on: http://0.0.0.0:1212 +\x1b[2m2026-05-27T21:29:19.073788Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_job\x1b[0m\x1b[1m{\x1b[0m\x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mV1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_v1\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m \x1b[2mtorrust_tracker_axum_rest_api_server::server\x1b[0m\x1b[2m:\x1b[0m \x1b[3mreturn\x1b[0m\x1b[2m=\x1b[0mRunning (with local address): 0.0.0.0:1212 +\x1b[2m2026-05-27T21:29:19.073815Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m Starting on: http://0.0.0.0:1313 +\x1b[2m2026-05-27T21:29:19.073879Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mstart\x1b[0m\x1b[2m:\x1b[0m\x1b[1mstart_job\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m Started on: http://0.0.0.0:1313 +\x1b[2m2026-05-27T21:29:24.057120Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m request \x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0m274cce36-e2b8-4690-874c-7733bde3b322 +\x1b[2m2026-05-27T21:29:24.057867Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m request \x1b[3mserver_socket_addr\x1b[0m\x1b[2m=\x1b[0m0.0.0.0:7070 \x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0mbec054df-2a5c-46b3-98a8-20a1b3097666 +\x1b[2m2026-05-27T21:29:24.057873Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/api/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m request \x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/api/health_check \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0mcee54cf3-09f4-49a3-8d56-faeaa0b91a41 +\x1b[2m2026-05-27T21:29:24.057890Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHTTP TRACKER\x1b[0m\x1b[2m:\x1b[0m response \x1b[3mserver_socket_addr\x1b[0m\x1b[2m=\x1b[0m0.0.0.0:7070 \x1b[3mlatency_ms\x1b[0m\x1b[2m=\x1b[0m0 \x1b[3mstatus_code\x1b[0m\x1b[2m=\x1b[0m200 OK \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0mbec054df-2a5c-46b3-98a8-20a1b3097666 +\x1b[2m2026-05-27T21:29:24.057902Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/api/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mAPI\x1b[0m\x1b[2m:\x1b[0m response \x1b[3mlatency_ms\x1b[0m\x1b[2m=\x1b[0m0 \x1b[3mstatus_code\x1b[0m\x1b[2m=\x1b[0m200 OK \x1b[3mserver_socket_addr\x1b[0m\x1b[2m=\x1b[0m0.0.0.0:1212 \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0mcee54cf3-09f4-49a3-8d56-faeaa0b91a41 +\x1b[2m2026-05-27T21:29:24.057976Z\x1b[0m \x1b[32m INFO\x1b[0m \x1b[1mrequest\x1b[0m\x1b[1m{\x1b[0m\x1b[3mmethod\x1b[0m\x1b[2m=\x1b[0mGET \x1b[3muri\x1b[0m\x1b[2m=\x1b[0m/health_check \x1b[3mversion\x1b[0m\x1b[2m=\x1b[0mHTTP/1.1\x1b[1m}\x1b[0m\x1b[2m:\x1b[0m \x1b[2mHEALTH CHECK API\x1b[0m\x1b[2m:\x1b[0m response \x1b[3mlatency_ms\x1b[0m\x1b[2m=\x1b[0m0 \x1b[3mstatus_code\x1b[0m\x1b[2m=\x1b[0m200 OK \x1b[3mrequest_id\x1b[0m\x1b[2m=\x1b[0m274cce36-e2b8-4690-874c-7733bde3b322 + +2026-05-27T21:29:24.096007Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Running services: + { + "udp_trackers": [ + "127.0.0.1:6969" + ], + "http_trackers": [ + "http://127.0.0.1:7070" + ], + "health_checks": [ + "http://127.0.0.1:1313/health_check" + ] +} +2026-05-27T21:29:24.096012Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_checker: Running Tracker Checker: TORRUST_CHECKER_CONFIG=[config] cargo run -p torrust-tracker-client --bin tracker_checker +2026-05-27T21:29:24.096013Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_checker: Tracker Checker config: +{ + "udp_trackers": [ + "127.0.0.1:6969" + ], + "http_trackers": [ + "http://127.0.0.1:7070" + ], + "health_checks": [ + "http://127.0.0.1:1313/health_check" + ] +} +2026-05-27T21:29:24.255415Z  INFO torrust_tracker_console_client::console::clients::checker::service: Running checks for trackers ... +[ + { + "Udp": { + "Ok": { + "remote_addr": "127.0.0.1:6969", + "results": [ + [ + "Setup", + { + "Ok": null + } + ], + [ + "Connect", + { + "Ok": null + } + ], + [ + "Announce", + { + "Ok": null + } + ], + [ + "Scrape", + { + "Ok": null + } + ] + ] + } + } + }, + { + "Health": { + "Ok": { + "url": "http://127.0.0.1:1313/health_check", + "result": { + "Ok": "200 OK" + } + } + } + }, + { + "Http": { + "Ok": { + "url": "http://127.0.0.1:7070/", + "results": [ + [ + "Announce", + { + "Ok": null + } + ], + [ + "Scrape", + { + "Ok": null + } + ] + ] + } + } + } +] +2026-05-27T21:29:24.267577Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Stopping docker tracker container: tracker_EH0ZAqNRTQP1Z4uwI9De ... +tracker_EH0ZAqNRTQP1Z4uwI9De +2026-05-27T21:29:34.563660Z  INFO torrust_tracker_lib::console::ci::e2e::docker: Dropping running container: tracker_EH0ZAqNRTQP1Z4uwI9De +2026-05-27T21:29:34.572355Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Removing docker tracker container: tracker_EH0ZAqNRTQP1Z4uwI9De ... +tracker_EH0ZAqNRTQP1Z4uwI9De +2026-05-27T21:29:34.584012Z  INFO torrust_tracker_lib::console::ci::e2e::runner: Tracker container final state: +TrackerContainer { + image: "torrust-tracker:e2e-local", + name: "tracker_EH0ZAqNRTQP1Z4uwI9De", + running: None, +} +2026-05-27T21:29:34.584021Z  INFO torrust_tracker_lib::console::ci::e2e::tracker_container: Dropping tracker container: tracker_EH0ZAqNRTQP1Z4uwI9De +[warm] e2e_tracker_seconds=16 +[warm] e2e_tracker_exit_code=0 +[warm] e2e_qbittorrent_sqlite_start +2026-05-27T21:29:34.838818Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Logging initialized +2026-05-27T21:29:34.838912Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Using compose project name: qbt-e2e-sod8im5t4i +2026-05-27T21:29:34.943535Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "up" "--wait" "--detach" "--no-build" +2026-05-27T21:29:40.721590Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "ps" "-a" +2026-05-27T21:29:40.749531Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "port" "qbittorrent-seeder" "8080" +2026-05-27T21:29:40.787293Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: seeder WebUI host port: 32787 +2026-05-27T21:29:40.791611Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "ps" "-a" +2026-05-27T21:29:40.821031Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "port" "qbittorrent-leecher" "8080" +2026-05-27T21:29:40.849367Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: leecher WebUI host port: 32783 +2026-05-27T21:29:40.853476Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "ps" "-a" +2026-05-27T21:29:40.887091Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "port" "tracker" "1212" +2026-05-27T21:29:40.920499Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: Tracker REST API host port: 32784 +2026-05-27T21:29:40.924887Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:40.957142Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:29:40.957726Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:40.958790Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-http.torrent" +2026-05-27T21:29:40.959119Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=0 +2026-05-27T21:29:41.461349Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:41.461362Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:41.494273Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:29:41.494728Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:41.495069Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-http.torrent" +2026-05-27T21:29:41.495074Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:41.495616Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:29:41.996709Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:41.996981Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=checkingResumeData +2026-05-27T21:29:42.499121Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=checkingResumeData +2026-05-27T21:29:43.001088Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=stalledDL +2026-05-27T21:29:43.503241Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=stalledDL +2026-05-27T21:29:44.005588Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=stalledDL +2026-05-27T21:29:44.507003Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=100.0 state=stalledUP +2026-05-27T21:29:44.507021Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:44.507024Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:44.508137Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:29:44.513028Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=13295a397dcb84e5467765587a2c810425c30622 seeders=2 completed=1 leechers=0 +2026-05-27T21:29:44.513034Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:44.513036Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:29:44.513040Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:44.542525Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:29:44.543208Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:44.543568Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-udp.torrent" +2026-05-27T21:29:44.543888Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:44.543893Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:44.573464Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:29:44.574100Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:44.574414Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-udp.torrent" +2026-05-27T21:29:44.574418Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:44.575095Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 torrent_count=2 +2026-05-27T21:29:45.077600Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:45.077904Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:29:45.579176Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:29:46.081492Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:29:46.582834Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:29:47.084145Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:29:47.586511Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=100.0 state=stalledUP +2026-05-27T21:29:47.586522Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:47.586524Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:47.587465Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:29:47.592961Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 seeders=2 completed=1 leechers=0 +2026-05-27T21:29:47.592968Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:47.592970Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:29:47.593041Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpNJygam/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpNJygam/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpNJygam/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpNJygam/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpNJygam/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpNJygam/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpNJygam/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.sqlite3.yaml" "-p" "qbt-e2e-sod8im5t4i" "down" "--volumes" +[warm] e2e_qbittorrent_sqlite_seconds=24 +[warm] e2e_qbittorrent_sqlite_exit_code=0 +[warm] e2e_qbittorrent_mysql_start +2026-05-27T21:29:58.424497Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Logging initialized +2026-05-27T21:29:58.424606Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Using compose project name: qbt-e2e-wtitxcfcye +2026-05-27T21:29:58.528405Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "up" "--wait" "--detach" "--no-build" +2026-05-27T21:30:09.892043Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "ps" "-a" +2026-05-27T21:30:09.919980Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "port" "qbittorrent-seeder" "8080" +2026-05-27T21:30:09.947989Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: seeder WebUI host port: 32788 +2026-05-27T21:30:09.952426Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "ps" "-a" +2026-05-27T21:30:09.981289Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "port" "qbittorrent-leecher" "8080" +2026-05-27T21:30:10.009808Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: leecher WebUI host port: 32789 +2026-05-27T21:30:10.014239Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "ps" "-a" +2026-05-27T21:30:10.043361Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "port" "tracker" "1212" +2026-05-27T21:30:10.071563Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: Tracker REST API host port: 32790 +2026-05-27T21:30:10.075725Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:10.105935Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:30:10.106323Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:10.106632Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-http.torrent" +2026-05-27T21:30:10.107154Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:30:10.608670Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:10.608679Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:10.638709Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:30:10.639134Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:10.639468Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-http.torrent" +2026-05-27T21:30:10.639472Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:10.640003Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:30:11.142108Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:11.142373Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:30:11.643697Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:30:12.146007Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:30:12.648257Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=100.0 state=stalledUP +2026-05-27T21:30:12.648271Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:12.648274Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:12.649260Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:30:12.654365Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=13295a397dcb84e5467765587a2c810425c30622 seeders=2 completed=1 leechers=0 +2026-05-27T21:30:12.654372Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:12.654374Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:12.654377Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.684088Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:30:12.684740Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.685064Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-udp.torrent" +2026-05-27T21:30:12.685613Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.685617Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.715123Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:30:12.715719Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.716027Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-udp.torrent" +2026-05-27T21:30:12.716032Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.716595Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:12.716864Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:30:13.219160Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:30:13.721386Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:30:14.222638Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:30:14.724930Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:30:15.227321Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:30:15.729344Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=100.0 state=stalledUP +2026-05-27T21:30:15.729356Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:15.729358Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:15.730354Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:30:15.735103Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 seeders=2 completed=1 leechers=0 +2026-05-27T21:30:15.735110Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:15.735112Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:15.735173Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpXDxq7Y/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpXDxq7Y/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpXDxq7Y/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpXDxq7Y/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpXDxq7Y/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpXDxq7Y/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.mysql.yaml" "-p" "qbt-e2e-wtitxcfcye" "down" "--volumes" +[warm] e2e_qbittorrent_mysql_seconds=29 +[warm] e2e_qbittorrent_mysql_exit_code=0 +[warm] e2e_qbittorrent_postgresql_start +2026-05-27T21:30:27.892642Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Logging initialized +2026-05-27T21:30:27.892744Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::runner: Using compose project name: qbt-e2e-wzrzu8o7ul +2026-05-27T21:30:27.999768Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "up" "--wait" "--detach" "--no-build" +2026-05-27T21:30:39.359579Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "ps" "-a" +2026-05-27T21:30:39.388824Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "port" "qbittorrent-seeder" "8080" +2026-05-27T21:30:39.414627Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: seeder WebUI host port: 32794 +2026-05-27T21:30:39.419266Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "ps" "-a" +2026-05-27T21:30:39.448950Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "port" "qbittorrent-leecher" "8080" +2026-05-27T21:30:39.477785Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: leecher WebUI host port: 32793 +2026-05-27T21:30:39.482223Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "ps" "-a" +2026-05-27T21:30:39.511333Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "port" "tracker" "1212" +2026-05-27T21:30:39.541219Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::services_setup: Tracker REST API host port: 32795 +2026-05-27T21:30:39.545493Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:39.577358Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:30:39.577706Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:39.578000Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-http.torrent" +2026-05-27T21:30:39.578398Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:30:40.079552Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:40.079562Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:40.111320Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:30:40.111730Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:40.112052Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-http.torrent" +2026-05-27T21:30:40.112056Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:40.112474Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 torrent_count=1 +2026-05-27T21:30:40.614735Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:40.615082Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:30:41.117283Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:30:41.618578Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=0.0 state=queuedDL +2026-05-27T21:30:42.119761Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 progress=100.0 state=stalledUP +2026-05-27T21:30:42.119773Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:42.119775Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:42.120684Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:30:42.125675Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=13295a397dcb84e5467765587a2c810425c30622 seeders=2 completed=1 leechers=0 +2026-05-27T21:30:42.125680Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:42.125682Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="http" torrent=13295a397dcb84e5467765587a2c810425c30622 +2026-05-27T21:30:42.125686Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario start: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:42.154802Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="seeder" +2026-05-27T21:30:42.155453Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:42.155724Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="seeder" torrent_file="payload-udp.torrent" +2026-05-27T21:30:42.156325Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 torrent_count=2 +2026-05-27T21:30:42.657653Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="seeder" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:42.657663Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: seeder is ready case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:42.687299Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::login_client: qBittorrent WebUI login succeeded client="leecher" +2026-05-27T21:30:42.687900Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::ensure_torrent_is_absent: torrent is absent client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:42.688167Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::add_torrent_file_to_client: torrent file submitted to client client="leecher" torrent_file="payload-udp.torrent" +2026-05-27T21:30:42.688172Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download started: leecher is fetching from seeder case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:42.688909Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: waiting for torrent to appear client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 torrent_count=2 +2026-05-27T21:30:43.191141Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_torrent_appears_in_client: torrent has appeared in client list client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:43.191464Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=checkingResumeData +2026-05-27T21:30:43.692780Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:30:44.195135Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:30:44.697591Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=0.0 state=stalledDL +2026-05-27T21:30:45.198848Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download progress client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 progress=100.0 state=stalledUP +2026-05-27T21:30:45.198860Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::qbittorrent::wait_until_download_completes: download complete client="leecher" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:45.198862Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: download finished case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:45.199770Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::verify_payload_integrity: payload integrity verified bytes=1048576 +2026-05-27T21:30:45.204568Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm stats torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 seeders=2 completed=1 leechers=0 +2026-05-27T21:30:45.204574Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenario_steps::tracker::verify_tracker_swarm: tracker swarm verification passed torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:45.204577Z  INFO torrust_tracker_lib::console::ci::qbittorrent_e2e::scenarios::seeder_to_leecher_transfer: scenario passed: seeder-to-leecher transfer case="udp" torrent=aabae1cf08d67a6a071ffcaddfa9680910e53596 +2026-05-27T21:30:45.204642Z  INFO torrust_tracker_lib::console::ci::compose: Running docker compose command: QBT_E2E_LEECHER_CONFIG_PATH="/tmp/.tmpQCzDFw/leecher-config" QBT_E2E_LEECHER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/leecher-downloads" QBT_E2E_QBITTORRENT_IMAGE="lscr.io/linuxserver/qbittorrent:5.1.4" QBT_E2E_SEEDER_CONFIG_PATH="/tmp/.tmpQCzDFw/seeder-config" QBT_E2E_SEEDER_DOWNLOADS_PATH="/tmp/.tmpQCzDFw/seeder-downloads" QBT_E2E_SHARED_PATH="/tmp/.tmpQCzDFw/shared" QBT_E2E_TRACKER_CONFIG_PATH="/tmp/.tmpQCzDFw/tracker-config.toml" QBT_E2E_TRACKER_HEALTH_CHECK_API_PORT="1313" QBT_E2E_TRACKER_HTTP_API_PORT="1212" QBT_E2E_TRACKER_HTTP_TRACKER_PORT="7070" QBT_E2E_TRACKER_IMAGE="torrust-tracker:e2e-local" QBT_E2E_TRACKER_STORAGE_PATH="/tmp/.tmpQCzDFw/tracker-storage" QBT_E2E_TRACKER_UDP_PORT="6969" "docker" "compose" "-f" "compose.qbittorrent-e2e.postgresql.yaml" "-p" "qbt-e2e-wzrzu8o7ul" "down" "--volumes" +[warm] e2e_qbittorrent_postgresql_seconds=28 +[warm] e2e_qbittorrent_postgresql_exit_code=0 +[meta] end_utc=2026-05-27T21:30:55Z diff --git a/project-words.txt b/project-words.txt index 827920635..3301e1bf7 100644 --- a/project-words.txt +++ b/project-words.txt @@ -137,6 +137,7 @@ incompletei infohash infohashes infoschema +initialisation Intermodal intervali Irwe @@ -203,6 +204,7 @@ obra oneline oneshot openmetrics +optimisations organisation ostr Pando