[INFO] cloning repository https://github.com/hiraginoyuki/onair
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/hiraginoyuki/onair" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fhiraginoyuki%2Fonair", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fhiraginoyuki%2Fonair'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 218e552b81d601914300f1cf083bc617aba9aa81
[INFO] testing hiraginoyuki/onair/218e552b81d601914300f1cf083bc617aba9aa81 against 1.98.0-beta.8+cargoflags=--release for beta-release-1.99-2
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fhiraginoyuki%2Fonair" "/workspace/builds/worker-5-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-5-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/hiraginoyuki/onair
[INFO] finished tweaking git repo https://github.com/hiraginoyuki/onair
[INFO] tweaked toml for git repo https://github.com/hiraginoyuki/onair written to /workspace/builds/worker-5-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/hiraginoyuki/onair on toolchain 1.98.0-beta.8
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.8" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/hiraginoyuki/onair already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.8" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded wasm-bindgen-shared v0.2.121
[INFO] [stderr]   Downloaded wasm-bindgen v0.2.121
[INFO] [stderr]   Downloaded wasm-bindgen-macro v0.2.121
[INFO] [stderr]   Downloaded js-sys v0.3.98
[INFO] [stderr]   Downloaded wasm-bindgen-macro-support v0.2.121
[INFO] [stderr]   Downloaded kqueue-sys v1.1.2
[INFO] [stderr]   Downloaded wasm-bindgen-futures v0.4.71
[INFO] [stderr]   Downloaded opentelemetry-http v0.30.0
[INFO] [stderr]   Downloaded notify-types v2.1.0
[INFO] [stderr]   Downloaded inotify v0.11.1
[INFO] [stderr]   Downloaded notify v8.2.0
[INFO] [stderr]   Downloaded opentelemetry-otlp v0.30.0
[INFO] [stderr]   Downloaded axum-macros v0.5.1
[INFO] [stderr]   Downloaded opentelemetry v0.30.0
[INFO] [stderr]   Downloaded tonic v0.13.1
[INFO] [stderr]   Downloaded opentelemetry-proto v0.30.0
[INFO] [stderr]   Downloaded opentelemetry_sdk v0.30.0
[INFO] [stderr]   Downloaded web-sys v0.3.98
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d
[INFO] running `Command { std: "docker" "start" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling cc v1.2.62
[INFO] [stderr]    Compiling mio v1.2.0
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling serde_json v1.0.150
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling ppv-lite86 v0.2.21
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling subtle v2.6.1
[INFO] [stderr]    Compiling either v1.16.0
[INFO] [stderr]    Compiling zerotrie v0.2.4
[INFO] [stderr]    Compiling pin-project-internal v1.1.13
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]    Compiling tinystr v0.8.3
[INFO] [stderr]    Compiling icu_collections v2.2.0
[INFO] [stderr]    Compiling inotify-sys v0.1.5
[INFO] [stderr]    Compiling winnow v1.0.3
[INFO] [stderr]    Compiling icu_locale_core v2.2.0
[INFO] [stderr]    Compiling itertools v0.14.0
[INFO] [stderr]    Compiling hashbrown v0.15.5
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling inotify v0.11.1
[INFO] [stderr]    Compiling toml_parser v1.1.2+spec-1.1.0
[INFO] [stderr]    Compiling tokio v1.52.3
[INFO] [stderr]    Compiling rand_core v0.9.5
[INFO] [stderr]    Compiling opentelemetry v0.30.0
[INFO] [stderr]    Compiling axum-core v0.5.6
[INFO] [stderr]    Compiling rand_chacha v0.9.0
[INFO] [stderr]    Compiling notify-types v2.1.0
[INFO] [stderr]    Compiling axum-macros v0.5.1
[INFO] [stderr]    Compiling matchit v0.8.4
[INFO] [stderr]    Compiling pin-project v1.1.13
[INFO] [stderr]    Compiling rand v0.9.4
[INFO] [stderr]    Compiling toml_writer v1.1.1+spec-1.1.0
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling icu_provider v2.2.0
[INFO] [stderr]    Compiling libsqlite3-sys v0.35.0
[INFO] [stderr]    Compiling prost-derive v0.13.5
[INFO] [stderr]    Compiling winnow v0.7.15
[INFO] [stderr]    Compiling hashlink v0.10.0
[INFO] [stderr]    Compiling icu_properties v2.2.0
[INFO] [stderr]    Compiling icu_normalizer v2.2.0
[INFO] [stderr]    Compiling notify v8.2.0
[INFO] [stderr]    Compiling regex-syntax v0.8.10
[INFO] [stderr]    Compiling fallible-iterator v0.3.0
[INFO] [stderr]    Compiling fallible-streaming-iterator v0.1.9
[INFO] [stderr]    Compiling rand_chacha v0.3.1
[INFO] [stderr]    Compiling clap_lex v1.1.0
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling strsim v0.11.1
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling prost v0.13.5
[INFO] [stderr]    Compiling idna_adapter v1.2.2
[INFO] [stderr]    Compiling idna v1.1.0
[INFO] [stderr]    Compiling sharded-slab v0.1.7
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling serde_spanned v1.1.1
[INFO] [stderr]    Compiling toml_datetime v0.7.5+spec-1.1.0
[INFO] [stderr]    Compiling serde_path_to_error v0.1.20
[INFO] [stderr]    Compiling clap_derive v4.6.1
[INFO] [stderr]    Compiling rand v0.8.6
[INFO] [stderr]    Compiling tracing-log v0.2.0
[INFO] [stderr]    Compiling serde_urlencoded v0.7.1
[INFO] [stderr]    Compiling toml v0.9.12+spec-1.1.0
[INFO] [stderr]    Compiling thread_local v1.1.9
[INFO] [stderr]    Compiling nu-ansi-term v0.50.3
[INFO] [stderr]    Compiling tokio-util v0.7.18
[INFO] [stderr]    Compiling tokio-stream v0.1.18
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling tracing-subscriber v0.3.23
[INFO] [stderr]    Compiling h2 v0.4.14
[INFO] [stderr]    Compiling tower v0.5.3
[INFO] [stderr]    Compiling opentelemetry_sdk v0.30.0
[INFO] [stderr]    Compiling clap v4.6.1
[INFO] [stderr]    Compiling tower-http v0.6.11
[INFO] [stderr]    Compiling hyper v1.9.0
[INFO] [stderr]    Compiling rustls v0.23.40
[INFO] [stderr]    Compiling hyper-util v0.1.20
[INFO] [stderr]    Compiling rustls-webpki v0.103.13
[INFO] [stderr]    Compiling hyper-timeout v0.5.2
[INFO] [stderr]    Compiling axum v0.8.9
[INFO] [stderr]    Compiling tonic v0.13.1
[INFO] [stderr]    Compiling opentelemetry-proto v0.30.0
[INFO] [stderr]    Compiling tokio-rustls v0.26.4
[INFO] [stderr]    Compiling hyper-rustls v0.27.9
[INFO] [stderr]    Compiling reqwest v0.12.28
[INFO] [stderr]    Compiling opentelemetry-http v0.30.0
[INFO] [stderr]    Compiling onair-core v0.2.1 (/opt/rustwide/workdir/crates/onair-core)
[INFO] [stderr]    Compiling opentelemetry-otlp v0.30.0
[INFO] [stderr]    Compiling rusqlite v0.37.0
[INFO] [stderr]    Compiling onair-obs v0.2.1 (/opt/rustwide/workdir/crates/onair-obs)
[INFO] [stderr]    Compiling onair-proxy v0.2.1 (/opt/rustwide/workdir/crates/onair-proxy)
[INFO] [stderr]    Compiling onair v0.2.1 (/opt/rustwide/workdir/crates/onair)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 2m 58s
[INFO] running `Command { std: "docker" "inspect" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling onair-core v0.2.1 (/opt/rustwide/workdir/crates/onair-core)
[INFO] [stderr]    Compiling onair-obs v0.2.1 (/opt/rustwide/workdir/crates/onair-obs)
[INFO] [stderr]    Compiling onair-proxy v0.2.1 (/opt/rustwide/workdir/crates/onair-proxy)
[INFO] [stderr]    Compiling onair v0.2.1 (/opt/rustwide/workdir/crates/onair)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 23.83s
[INFO] running `Command { std: "docker" "inspect" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "test" "--frozen" "--release", kill_on_drop: false }`
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 0.26s
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/release/deps/onair-0adf10933cdb9cd3)
[INFO] [stdout] 
[INFO] [stdout] running 79 tests
[INFO] [stdout] test app::tests::anthropic_messages_non_json_body_returns_400 ... ok
[INFO] [stdout] test app::tests::anthropic_messages_count_tokens_404_exists ... ok
[INFO] [stdout] test app::tests::anthropic_messages_missing_max_tokens_returns_400 ... ok
[INFO] [stdout] test app::tests::chat_completions_via_messages_injects_default_anthropic_version ... ok
[INFO] [stdout] test app::tests::anthropic_messages_streaming_anthropic_version_forwarded ... ok
[INFO] [stdout] test app::tests::anthropic_messages_non_streaming_success ... ok
[INFO] [stdout] test app::tests::anthropic_messages_non_streaming_fills_max_tokens_from_policy ... ok
[INFO] [stdout] test app::tests::count_tokens_returns_404_with_anthropic_error_format ... ok
[INFO] [stdout] test app::tests::anthropic_messages_streaming_success ... ok
[INFO] [stdout] test app::tests::active_health_probe_marks_backend_healthy ... ok
[INFO] [stdout] test app::tests::chat_completions_stream_translates_mislabeled_responses_stream ... ok
[INFO] [stdout] test app::tests::anthropic_version_default_injected_when_client_omits ... ok
[INFO] [stdout] test app::tests::disallowed_model_returns_404_without_calling_backend ... ok
[INFO] [stdout] test app::tests::chat_stream_usage_policy_inserts_upstream_include_usage ... ok
[INFO] [stdout] test app::tests::chat_completions_stream_translates_to_responses_stream_backend ... ok
[INFO] [stdout] test app::tests::chat_completions_via_messages_buffered_success ... ok
[INFO] [stdout] test app::tests::expose_off_default_sanitizes_error ... ok
[INFO] [stdout] test app::tests::debug_capture_failures_mode_skips_success_and_captures_upstream_error ... ok
[INFO] [stdout] test app::tests::chat_stream_usage_requested_by_client_is_forwarded_to_client ... ok
[INFO] [stdout] test app::tests::expose_off_per_route_overrides_backend_on ... ok
[INFO] [stdout] test app::tests::debug_capture_writes_inbound_and_upstream_request_bodies ... ok
[INFO] [stdout] test app::tests::expose_off_records_exposed_backend_error_false_in_inspector ... ok
[INFO] [stdout] test app::tests::expose_on_no_body_still_sends_default_content_type ... ok
[INFO] [stdout] test app::tests::chat_completions_via_messages_forwards_client_anthropic_version ... ok
[INFO] [stdout] test app::tests::chat_completions_translates_to_responses_for_responses_backend ... ok
[INFO] [stdout] test app::tests::expose_on_per_route_overrides_backend_off ... ok
[INFO] [stdout] test app::tests::inspector_auth_preflight_failure_emits_auth_stage_record ... ok
[INFO] [stdout] test app::tests::expose_on_per_backend_forwards_upstream_body_and_status ... ok
[INFO] [stdout] test app::tests::extra_body_merges_into_upstream_request_and_preserves_model_rewrite ... ok
[INFO] [stdout] test app::tests::debug_capture_records_stream_usage_diagnostics ... ok
[INFO] [stdout] test app::tests::expose_on_unknown_status_maps_to_502 ... ok
[INFO] [stdout] test app::tests::expose_on_unset_content_type_defaults_to_application_json ... ok
[INFO] [stdout] test app::tests::inspector_rejects_remote_forwarded_clients_by_default ... ok
[INFO] [stdout] test app::tests::inspector_preflight_failure_replaces_live_record_without_duplication ... ok
[INFO] [stdout] test app::tests::backend_redirects_are_not_followed ... ok
[INFO] [stdout] test app::tests::extra_body_backend_defaults_are_inherited_by_route ... ok
[INFO] [stdout] test app::tests::expose_on_retry_after_is_forwarded ... ok
[INFO] [stdout] test app::tests::inspector_records_completed_requests_and_serves_details ... ok
[INFO] [stdout] test app::tests::expose_on_records_exposed_backend_error_in_inspector ... ok
[INFO] [stdout] test app::tests::inspector_request_list_limits_to_latest_records ... ok
[INFO] [stdout] test app::tests::model_required_endpoint_without_model_returns_400_without_calling_backend ... ok
[INFO] [stdout] test app::tests::debug_capture_writes_upstream_error_response_body ... ok
[INFO] [stdout] test app::tests::native_responses_rejects_orphan_function_calls_before_backend ... ok
[INFO] [stdout] test app::tests::operator_health_tracks_backend_failures ... ok
[INFO] [stdout] test app::tests::native_responses_route_can_drop_max_output_tokens ... ok
[INFO] [stdout] test app::tests::inspector_is_local_only_by_default ... ok
[INFO] [stdout] test app::tests::operator_endpoints_return_sanitized_snapshots ... ok
[INFO] [stdout] test app::tests::models_respect_context_length_output_policy ... ok
[INFO] [stdout] test app::tests::models_request_unauthorized_for_models_outside_effective_whitelist ... ok
[INFO] [stdout] test app::tests::request_headers_api_key_takes_precedence ... ok
[INFO] [stdout] test app::tests::models_listing_unions_default_models_and_client_models ... ok
[INFO] [stdout] test app::tests::native_responses_route_can_force_store_false ... ok
[INFO] [stdout] test app::tests::request_headers_overrides_client_header ... ok
[INFO] [stdout] test app::tests::responses_chat_compat_can_sanitize_tool_schema_for_backend ... ok
[INFO] [stdout] test app::tests::expose_on_does_not_forward_server_header ... ok
[INFO] [stdout] test app::tests::responses_forwards_prompt_cache_fields_and_rewrites_model ... ok
[INFO] [stdout] test app::tests::operator_health_tracks_backend_successes ... ok
[INFO] [stdout] test app::tests::request_headers_injects_into_upstream_request ... ok
[INFO] [stdout] test app::tests::send_failure_falls_back_before_response_commit ... ok
[INFO] [stdout] test app::tests::responses_full_compat_payload_translates_to_chat_backend ... ok
[INFO] [stdout] test app::tests::responses_translates_to_chat_completions_for_chat_backend ... ok
[INFO] [stdout] test app::tests::tool_request_requires_tool_capable_route ... ok
[INFO] [stdout] test app::tests::sticky_routing_reuses_backend_for_same_prompt_cache_key ... ok
[INFO] [stdout] test app::tests::responses_native_capability_uses_native_backend_path ... ok
[INFO] [stdout] test app::tests::upstream_non_success_does_not_fall_back ... ok
[INFO] [stdout] test app::tests::request_headers_hot_reload ... ok
[INFO] [stdout] test app::tests::expose_on_oversize_body_falls_back_to_sanitize ... ok
[INFO] [stdout] test app::tests::operator_models_reports_upstream_source ... ok
[INFO] [stdout] test app::tests::upstream_context_size_is_forwarded_to_v1_models ... ok
[INFO] [stdout] test app::tests::upstream_context_size_is_forwarded_to_props ... ok
[INFO] [stdout] test app::tests::upstream_unreachable_hides_value ... ok
[INFO] [stdout] test app::tests::shutdown_signal_cancels_buffered_upstream_wait ... ok
[INFO] [stdout] test app::tests::stream_capture_disabled_writes_no_ndjson_files ... ok
[INFO] [stdout] test app::tests::inspector_persistence_restores_retained_records_after_restart ... ok
[INFO] [stdout] test app::tests::inspector_in_flight_record_persisted_as_interrupted_on_app_state_drop ... ok
[INFO] [stdout] test app::tests::stream_capture_records_upstream_and_client_ndjson_with_monotonic_timestamps ... ok
[INFO] [stdout] test app::tests::inspector_record_appears_before_request_completes ... ok
[INFO] [stdout] test app::tests::inspector_sse_reports_in_flight_record ... ok
[INFO] [stdout] test app::tests::inspector_sse_event_stream_emits_in_flight_record_for_active_request ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 79 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.03s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/release/deps/onair_core-f0129a829e05727b)
[INFO] [stdout] 
[INFO] [stdout] running 171 tests
[INFO] [stdout] test auth::tests::both_present_bearer_wins ... ok
[INFO] [stdout] test auth::tests::bearer_auth_still_works ... ok
[INFO] [stdout] test auth::tests::both_present_bearer_wins_even_if_xapikey_matches ... ok
[INFO] [stdout] test auth::tests::invalid_x_api_key_returns_xapikey_error ... ok
[INFO] [stdout] test auth::tests::invalid_bearer_returns_bearer_error ... ok
[INFO] [stdout] test auth::tests::missing_both_returns_missing_error ... ok
[INFO] [stdout] test config::tests::backend_base_url_rejects_credentials_and_query_strings ... ok
[INFO] [stdout] test config::tests::backend_config_default_weight_is_one ... ok
[INFO] [stdout] test config::tests::anthropic_max_tokens_parses_and_resolves ... ok
[INFO] [stdout] test config::tests::backend_id_containing_at_sign_is_rejected ... ok
[INFO] [stdout] test config::tests::backend_config_parses_explicit_weight ... ok
[INFO] [stdout] test config::tests::backend_id_without_at_sign_still_resolves ... ok
[INFO] [stdout] test config::tests::chat_stream_usage_policy_can_be_set_per_backend_and_route ... ok
[INFO] [stdout] test config::tests::chat_via_messages_alias_canonicalizes_in_backend_and_route ... ok
[INFO] [stdout] test auth::tests::x_api_key_auth_works ... ok
[INFO] [stdout] test config::tests::backend_context_length_field_is_rejected ... ok
[INFO] [stdout] test config::tests::chat_via_messages_alias_dedupes_with_canonical_marker ... ok
[INFO] [stdout] test config::tests::compat_marker_via_messages_is_reachable_with_messages_backend ... ok
[INFO] [stdout] test config::tests::config_rejects_zero_weight ... ok
[INFO] [stdout] test config::tests::debug_capture_config_resolves_when_enabled ... ok
[INFO] [stdout] test config::tests::debug_capture_rejects_parent_directory_components ... ok
[INFO] [stdout] test config::tests::context_length_policies_resolve_from_config ... ok
[INFO] [stdout] test config::tests::expose_backend_errors_route_inherits_backend ... ok
[INFO] [stdout] test config::tests::expose_backend_errors_defaults_to_false_when_omitted ... ok
[INFO] [stdout] test config::tests::expose_backend_errors_route_overrides_backend ... ok
[INFO] [stdout] test config::tests::expose_backend_errors_with_multiple_bindings_uses_first_bindings_backend ... ok
[INFO] [stdout] test config::tests::extra_body_route_overrides_backend_on_key_conflict ... ok
[INFO] [stdout] test config::tests::extra_body_with_multiple_bindings_takes_first_bindings_backend ... ok
[INFO] [stdout] test config::tests::health_config_rejects_invalid_path ... ok
[INFO] [stdout] test config::tests::inspector_config_rejects_zero_retention_requests ... ok
[INFO] [stdout] test config::tests::inspector_config_resolves_when_enabled ... ok
[INFO] [stdout] test config::tests::extra_body_resolves_with_nested_object_array_and_scalar_values ... ok
[INFO] [stdout] test config::tests::inspector_persistence_config_resolves_when_enabled_with_path ... ok
[INFO] [stdout] test config::tests::health_config_resolves_when_enabled ... ok
[INFO] [stdout] test config::tests::extra_body_defaults_to_empty_when_omitted ... ok
[INFO] [stdout] test config::tests::inspector_persistence_drain_timeout_defaults_to_500ms ... ok
[INFO] [stdout] test config::tests::inspector_persistence_rejects_drain_timeout_above_maximum ... ok
[INFO] [stdout] test config::tests::inspector_persistence_rejects_enabled_without_path ... ok
[INFO] [stdout] test config::tests::inspector_persistence_rejects_zero_drain_timeout ... ok
[INFO] [stdout] test config::tests::marker_policies_are_independent ... ok
[INFO] [stdout] test config::tests::reload_events_include_close_after_write ... ok
[INFO] [stdout] test config::tests::known_aliases_and_compat_markers_are_accepted ... ok
[INFO] [stdout] test config::tests::request_headers_accepts_valid_header_names ... ok
[INFO] [stdout] test config::tests::request_headers_defaults_to_empty_when_omitted ... ok
[INFO] [stdout] test config::tests::request_headers_rejects_invalid_header_name ... ok
[INFO] [stdout] test config::tests::request_headers_resolves_from_config ... ok
[INFO] [stdout] test config::tests::responses_store_policy_can_be_set_per_backend_and_route ... ok
[INFO] [stdout] test config::tests::route_backend_binding_splits_on_last_at_sign ... ok
[INFO] [stdout] test config::tests::responses_max_output_tokens_policy_can_be_set_per_backend_and_route ... ok
[INFO] [stdout] test config::tests::route_backend_binding_with_leading_at_still_errors ... ok
[INFO] [stdout] test config::tests::routing_config_rejects_excessive_fallback_attempts ... ok
[INFO] [stdout] test config::tests::routing_config_resolves_fallback_attempts ... ok
[INFO] [stdout] test config::tests::routing_strategy_round_robin_and_weighted_random_parse ... ok
[INFO] [stdout] test config::tests::request_headers_rejects_invalid_header_value ... ok
[INFO] [stdout] test config::tests::reload_applies_unknown_marker_under_warn_policy ... ok
[INFO] [stdout] test config::tests::route_backend_binding_rejects_at_in_backend_id_part ... ok
[INFO] [stdout] test config::tests::route_backend_binding_with_single_at_sign_unchanged ... ok
[INFO] [stdout] test config::tests::inspector_persistence_drain_timeout_accepts_explicit_value ... ok
[INFO] [stdout] test config::tests::config_store_lock_survives_panic_in_holder ... ok
[INFO] [stdout] test config::tests::reload_keeps_previous_config_when_new_config_is_invalid ... ok
[INFO] [stdout] test config::tests::tool_schema_mode_can_be_set_per_backend_and_route ... ok
[INFO] [stdout] test config::tests::trusted_proxy_cidrs_resolve_from_server_config ... ok
[INFO] [stdout] test config::tests::unknown_capability_marker_fails_under_error_policy ... ok
[INFO] [stdout] test config::tests::unknown_endpoint_marker_fails_under_error_policy ... ok
[INFO] [stdout] test config::tests::unknown_endpoint_marker_passes_under_warn_policy ... ok
[INFO] [stdout] test config::tests::unknown_marker_policy_defaults_to_warn ... ok
[INFO] [stdout] test config::tests::unknown_marker_policy_parses_error_value ... ok
[INFO] [stdout] test config::tests::unknown_marker_policy_rejects_unknown_value ... ok
[INFO] [stdout] test config::tests::upstream_context_length_resolves_without_backend_default ... ok
[INFO] [stdout] test error::tests::api_error_upstream_message_preserved_per_status ... ok
[INFO] [stdout] test error::tests::map_upstream_status_collapses_other_codes_to_bad_gateway ... ok
[INFO] [stdout] test error::tests::map_upstream_status_keeps_pass_through_codes ... ok
[INFO] [stdout] test ip_cidr::tests::display_round_trip ... ok
[INFO] [stdout] test ip_cidr::tests::parses_v4_cidr ... ok
[INFO] [stdout] test ip_cidr::tests::rejects_empty ... ok
[INFO] [stdout] test ip_cidr::tests::parses_v6_cidr ... ok
[INFO] [stdout] test ip_cidr::tests::rejects_oversized_prefix ... ok
[INFO] [stdout] test ip_cidr::tests::rejects_zero_prefix_v4 ... ok
[INFO] [stdout] test context_size_cache::tests::lock_survives_panic_in_holder ... ok
[INFO] [stdout] test ip_cidr::tests::rejects_zero_prefix_v6 ... ok
[INFO] [stdout] test openai::paths::tests::endpoint_kind_recognizes_known_paths ... ok
[INFO] [stdout] test ip_cidr::tests::v6_cidr_matches_v4_mapped_address ... ok
[INFO] [stdout] test openai::paths::tests::normalize_path_trims_trailing_slashes ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_empty_body_returns_error ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_inserts_route_max_tokens_when_client_omits ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_missing_max_tokens_returns_error ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_non_json_returns_error ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_rewrites_model_field ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_to_chat_stream_emits_text_and_done ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_preserves_client_max_tokens ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_to_chat_stream_emits_tool_call_deltas ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_via_rewrite_mode_delegates ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_to_chat_stream_skips_usage_chunk_without_upstream_usage ... ok
[INFO] [stdout] test openai::tests::anthropic_messages_via_rewrite_mode_fills_max_tokens ... ok
[INFO] [stdout] test openai::tests::anthropic_response_body_without_model_field_passes_through_unchanged ... ok
[INFO] [stdout] test openai::tests::anthropic_response_dispatch_does_not_touch_nested_model_fields ... ok
[INFO] [stdout] test openai::tests::anthropic_response_leaves_model_alone_when_no_match ... ok
[INFO] [stdout] test openai::tests::anthropic_response_non_json_body_passes_through_unchanged ... ok
[INFO] [stdout] test openai::tests::anthropic_response_rewrites_model_from_backend_to_public ... ok
[INFO] [stdout] test openai::tests::anthropic_response_via_rewrite_response_body_dispatch ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_finish_is_noop ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_message_start_rewrites_message_model ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_model_left_alone_when_no_match ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_multiple_events_in_one_chunk ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_non_json_and_comment_lines_pass_through ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_rewrite_model_no_backend_noop ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_strategy_variant_matches ... ok
[INFO] [stdout] test openai::tests::anthropic_sse_top_level_model_rewritten ... ok
[INFO] [stdout] test openai::tests::chat_completion_response_converts_to_responses_shape ... ok
[INFO] [stdout] test openai::tests::chat_completion_stream_converts_to_responses_events ... ok
[INFO] [stdout] test openai::tests::chat_completion_stream_finishes_response_when_done_marker_is_missing ... ok
[INFO] [stdout] test openai::tests::chat_completion_stream_converts_tool_call_events_to_responses_events ... ok
[INFO] [stdout] test openai::tests::chat_completions_to_messages_accepts_stream_options_include_usage ... ok
[INFO] [stdout] test openai::tests::chat_completions_to_messages_rejects_invalid_stream_options_shape ... ok
[INFO] [stdout] test openai::tests::chat_completions_request_converts_to_responses ... ok
[INFO] [stdout] test openai::tests::chat_completions_request_converts_to_messages ... ok
[INFO] [stdout] test openai::tests::chat_completions_to_responses_rejects_unsupported_options ... ok
[INFO] [stdout] test openai::tests::chat_completions_to_responses_applies_responses_policies ... ok
[INFO] [stdout] test openai::tests::chat_completions_to_responses_requires_json_and_messages ... ok
[INFO] [stdout] test openai::tests::chat_completions_to_messages_rejects_unsupported_fields ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_filter_collects_metrics_without_forwarding_usage_chunk ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_policy_force_true_replaces_non_object_stream_options ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_policy_force_true_overrides_client_value ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_policy_ignores_non_chat_and_native_responses ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_policy_applies_after_responses_to_chat_conversion ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_policy_preserves_client_stream_options ... ok
[INFO] [stdout] test openai::tests::extra_body_drops_protected_keys_with_warn ... ok
[INFO] [stdout] test openai::tests::chat_stream_usage_policy_inserts_usage_request_for_chat_streams ... ok
[INFO] [stdout] test openai::tests::extra_body_merges_into_chat_to_responses_compat_path ... ok
[INFO] [stdout] test openai::tests::extra_body_merges_arbitrary_keys_into_rewritten_native_request ... ok
[INFO] [stdout] test openai::tests::extra_body_merges_into_responses_to_chat_compat_path ... ok
[INFO] [stdout] test openai::tests::llama_cpp_tool_schema_mode_sanitizes_common_schema_fragments ... ok
[INFO] [stdout] test openai::tests::native_json_response_adds_missing_total_tokens ... ok
[INFO] [stdout] test openai::tests::messages_response_converts_to_chat_completion ... ok
[INFO] [stdout] test openai::tests::native_responses_can_rewrite_max_output_tokens_for_wrapper_quirks ... ok
[INFO] [stdout] test openai::tests::native_responses_can_force_store_false_when_omitted ... ok
[INFO] [stdout] test openai::tests::native_responses_rejects_function_calls_without_matching_outputs ... ok
[INFO] [stdout] test openai::tests::native_responses_max_output_tokens_policy_preserves_other_paths_and_existing_fields ... ok
[INFO] [stdout] test openai::tests::native_responses_store_policy_preserves_explicit_store_and_chat_requests ... ok
[INFO] [stdout] test openai::tests::native_stream_response_adds_missing_total_tokens ... ok
[INFO] [stdout] test openai::tests::request_inspection_detects_stream_usage_request ... ok
[INFO] [stdout] test openai::tests::request_inspection_detects_non_empty_tools ... ok
[INFO] [stdout] test openai::tests::responses_request_converts_function_call_items_to_tool_messages ... ok
[INFO] [stdout] test openai::tests::responses_request_converts_image_parts_to_chat_content ... ok
[INFO] [stdout] test openai::tests::responses_request_converts_to_chat_completions ... ok
[INFO] [stdout] test openai::tests::responses_request_ignores_null_tools_and_collapses_text_parts ... ok
[INFO] [stdout] test openai::tests::responses_request_preserves_tool_strictness ... ok
[INFO] [stdout] test openai::tests::responses_response_converts_to_chat_completion_shape ... ok
[INFO] [stdout] test openai::tests::responses_stream_failed_emits_sanitized_chat_error ... ok
[INFO] [stdout] test openai::tests::responses_stream_converts_function_call_deltas_to_chat_completion_chunks ... ok
[INFO] [stdout] test openai::tests::responses_response_missing_usage_defaults_to_zero_chat_usage ... ok
[INFO] [stdout] test openai::tests::responses_stream_usage_filter_collects_metrics_without_forwarding_chat_usage ... ok
[INFO] [stdout] test openai::tests::responses_stream_incomplete_maps_to_length_finish_reason ... ok
[INFO] [stdout] test openai::tests::sse_strategy_chat_to_responses_matches_chat_completions_normalizer ... ok
[INFO] [stdout] test openai::tests::sse_strategy_clear_usage_and_diagnostics_resets_counters ... ok
[INFO] [stdout] test openai::tests::sse_strategy_usage_gating_filters_usage_chunk ... ok
[INFO] [stdout] test openai::tests::responses_stream_converts_text_deltas_to_chat_completion_chunks ... ok
[INFO] [stdout] test sanitize::tests::capture_id_stays_under_name_max ... ok
[INFO] [stdout] test sanitize::tests::sanitize_drops_control_and_non_ascii ... ok
[INFO] [stdout] test sanitize::tests::sanitize_keeps_alphanumerics_and_safe_punctuation ... ok
[INFO] [stdout] test openai::tests::responses_stream_finishes_response_when_done_marker_is_missing ... ok
[INFO] [stdout] test sanitize::tests::sanitize_replaces_unsafe_ascii_with_underscore ... ok
[INFO] [stdout] test openai::tests::sse_strategy_finish_emits_closing_events ... ok
[INFO] [stdout] test sanitize::tests::sanitize_truncates_to_max_chars ... ok
[INFO] [stdout] test sanitize::tests::storage_segment_cap_is_160 ... ok
[INFO] [stdout] test openai::tests::sse_strategy_responses_to_chat_matches_responses_normalizer ... ok
[INFO] [stdout] test sanitize::tests::sanitize_returns_none_for_all_dropped_input ... ok
[INFO] [stdout] test sanitize::tests::display_segment_cap_is_512 ... ok
[INFO] [stdout] test openai::tests::sse_strategy_native_passthrough_matches_sse_normalizer ... ok
[INFO] [stdout] test openai::tests::extract_usage_observation_collects_usage_keys ... ok
[INFO] [stdout] test config::tests::watcher_reloads_config_after_file_changes ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 171 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.53s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/release/deps/onair_obs-d52ea2e0b8407933)
[INFO] [stdout] 
[INFO] [stdout] running 61 tests
[INFO] [stdout] test observe::client_info::tests::cidr_matches_ipv4_and_ipv6_ranges ... ok
[INFO] [stdout] test observe::client_info::tests::invalid_closest_forwarded_header_does_not_fall_back_to_spoofed_entries ... ok
[INFO] [stdout] test observe::client_info::tests::invalid_last_x_real_ip_does_not_fall_back_to_spoofed_values ... ok
[INFO] [stdout] test observe::client_info::tests::effective_client_loopback_uses_trusted_forwarded_address ... ok
[INFO] [stdout] test observe::client_info::tests::repeated_forwarded_headers_use_the_last_combined_hop ... ok
[INFO] [stdout] test observe::client_info::tests::forwarded_header_uses_closest_valid_hop_when_trusted ... ok
[INFO] [stdout] test observe::client_info::tests::repeated_x_real_ip_headers_use_last_valid_value ... ok
[INFO] [stdout] test observe::client_info::tests::trusted_proxy_uses_closest_forwarded_for_hop ... ok
[INFO] [stdout] test observe::client_info::tests::untrusted_forwarded_headers_are_ignored ... ok
[INFO] [stdout] test observe::client_info::tests::x_real_ip_must_be_valid_ip_or_socket ... ok
[INFO] [stdout] test observe::context_sizes::tests::build_props_url_percent_encodes_reserved_chars ... ok
[INFO] [stdout] test observe::context_sizes::tests::build_props_url_returns_none_for_invalid_base ... ok
[INFO] [stdout] test observe::context_sizes::tests::build_props_url_trims_trailing_slash ... ok
[INFO] [stdout] test observe::context_sizes::tests::collect_upstream_targets_returns_first_match_per_public_model ... ok
[INFO] [stdout] test observe::context_sizes::tests::lookup_returns_none_for_missing_key ... ok
[INFO] [stdout] test observe::client_info::tests::invalid_forwarded_values_are_ignored ... ok
[INFO] [stdout] test observe::context_sizes::tests::prune_removes_inactive_keys_only ... ok
[INFO] [stdout] test observe::context_sizes::tests::set_updates_value_and_stamps_success ... ok
[INFO] [stdout] test observe::context_sizes::tests::set_with_error_stamps_failure_only ... ok
[INFO] [stdout] test observe::context_sizes::tests::set_with_neither_value_nor_error_is_a_noop ... ok
[INFO] [stdout] test observe::health::tests::health_tracks_success_and_failure_state ... ok
[INFO] [stdout] test observe::health::tests::health_window_clears_on_success ... ok
[INFO] [stdout] test observe::health::tests::health_window_reaches_unhealthy_after_threshold_failures ... ok
[INFO] [stdout] test observe::health_probe::tests::health_probe_url_joins_base_and_path ... ok
[INFO] [stdout] test observe::health_probe::tests::inactive_probe_loop_uses_short_poll_delay ... ok
[INFO] [stdout] test observe::debug_capture::tests::capture_root_and_request_directories_are_private ... ok
[INFO] [stdout] test observe::inspector::tests::embedded_ui_renders_attempt_waterfall ... ok
[INFO] [stdout] test observe::inspector::tests::disabled_store_does_not_record ... ok
[INFO] [stdout] test observe::inspector::tests::live_record_partial_field_updates_replace_in_place ... ok
[INFO] [stdout] test observe::inspector::tests::live_record_upsert_replaces_in_place_preserving_position ... ok
[INFO] [stdout] test observe::inspector::tests::eviction_decrements_in_flight_count ... ok
[INFO] [stdout] test observe::inspector::tests::eviction_of_final_record_does_not_change_in_flight_count ... ok
[INFO] [stdout] test observe::inspector::tests::interrupted_outcome_serializes_as_interrupted_kind ... ok
[INFO] [stdout] test observe::inspector::tests::broadcast_closed_is_observed_after_store_drop ... ok
[INFO] [stdout] test observe::inspector::tests::request_ids_include_safe_client_request_id ... ok
[INFO] [stdout] test observe::inspector::tests::in_flight_outcome_serializes_as_in_flight_kind ... ok
[INFO] [stdout] test observe::inspector::tests::live_record_new_does_not_publish_initial_record ... ok
[INFO] [stdout] test observe::inspector::tests::retention_boundary_evicts_oldest_record ... ok
[INFO] [stdout] test observe::inspector::tests::retention_boundary_evicts_under_bulk_load ... ok
[INFO] [stdout] test observe::inspector::tests::live_record_publish_initial_pushes_after_creation ... ok
[INFO] [stdout] test observe::inspector::tests::upsert_replace_at_limit_does_not_evict ... ok
[INFO] [stdout] test observe::stream_capture::tests::handle_can_be_moved_across_threads ... ok
[INFO] [stdout] test observe::inspector::tests::upsert_final_replace_at_limit_does_not_evict ... ok
[INFO] [stdout] test observe::inspector::tests::panic_in_lock_holder_does_not_poison_next_accessor ... ok
[INFO] [stdout] test observe::inspector::tests::store_retains_latest_records ... ok
[INFO] [stdout] test observe::timeline::tests::first_body_chunk_keeps_first_mark ... ok
[INFO] [stdout] test observe::timeline::tests::timeline_records_named_milestones ... ok
[INFO] [stdout] test observe::stream_capture::tests::new_rejects_zero_or_oversized_drain_timeout ... ok
[INFO] [stdout] test observe::inspector::tests::broadcast_lagged_is_observed_when_slow_subscriber_falls_behind ... ok
[INFO] [stdout] test observe::stream_capture::tests::dropped_stream_capture_does_not_panic_and_writer_exits ... ok
[INFO] [stdout] test observe::stream_capture::tests::body_chunk_records_bytes_and_lossy_data ... ok
[INFO] [stdout] test observe::stream_capture::tests::finish_records_completion_timings ... ok
[INFO] [stdout] test observe::stream_capture::tests::handle_clone_shares_channel_and_timings ... ok
[INFO] [stdout] test observe::stream_capture::tests::writer_creates_ndjson_with_monotonic_timestamps ... ok
[INFO] [stdout] test observe::stream_capture::tests::writer_serializes_events_as_ndjson ... ok
[INFO] [stdout] test observe::stream_capture::tests::writer_drops_on_full_channel_and_marks_truncated ... ok
[INFO] [stdout] test observe::inspector::tests::persistent_store_drop_drains_pending_records ... ok
[INFO] [stdout] test observe::inspector::tests::store_drop_marks_inflight_records_as_interrupted ... ok
[INFO] [stdout] test observe::inspector::tests::evicted_in_flight_record_is_not_marked_interrupted_on_drop ... ok
[INFO] [stdout] test observe::inspector::tests::persistent_store_restores_latest_records ... ok
[INFO] [stdout] test observe::inspector::tests::persistence_drain_only_walks_current_deque_state ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 61 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/release/deps/onair_proxy-541309bcc72c17f6)
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 37 tests
[INFO] [stdout] test routing::tests::chat_completions_can_route_to_explicit_messages_compat_backend ... ok
[INFO] [stdout] test routing::tests::is_known_marker_matches_canonical_allowlist ... ok
[INFO] [stdout] test routing::tests::chat_completions_prefers_responses_compat_before_messages_compat ... ok
[INFO] [stdout] test routing::tests::chat_completions_does_not_implicitly_use_messages_backend ... ok
[INFO] [stdout] test routing::tests::known_markers_allowlist_is_non_empty_and_deduped ... ok
[INFO] [stdout] test routing::tests::messages_path_metric_name ... ok
[INFO] [stdout] test routing::tests::known_markers_contain_structural_aliases ... ok
[INFO] [stdout] test routing::tests::messages_path_requires_model ... ok
[INFO] [stdout] test routing::tests::missing_messages_capability_returns_none ... ok
[INFO] [stdout] test routing::tests::model_less_unavailable_path_uses_endpoint_unavailable_code ... ok
[INFO] [stdout] test routing::tests::native_chat_capability_prevents_responses_compat_mode ... ok
[INFO] [stdout] test routing::tests::chat_completions_can_route_to_explicit_responses_compat_backend ... ok
[INFO] [stdout] test routing::tests::native_responses_capability_prevents_chat_compat_mode ... ok
[INFO] [stdout] test routing::tests::native_messages_route_selects_anthropic_messages_native ... ok
[INFO] [stdout] test routing::tests::responses_404_for_unknown_model_uses_model_not_found_code ... ok
[INFO] [stdout] test routing::tests::responses_can_route_to_explicit_chat_compat_backend ... ok
[INFO] [stdout] test routing::tests::responses_requires_explicit_chat_compat_marker ... ok
[INFO] [stdout] test routing::tests::round_robin_advances_per_model ... ok
[INFO] [stdout] test routing::tests::responses_404_for_known_model_uses_endpoint_unavailable_code ... ok
[INFO] [stdout] test routing::tests::round_robin_preserves_fallback_set ... ok
[INFO] [stdout] test routing::tests::round_robin_default_matches_new ... ok
[INFO] [stdout] test routing::tests::round_robin_single_candidate_noop ... ok
[INFO] [stdout] test routing::tests::round_robin_shrinking_candidate_list ... ok
[INFO] [stdout] test routing::tests::round_robin_wraps ... ok
[INFO] [stdout] test routing::tests::round_robin_path_key_for_model_less ... ok
[INFO] [stdout] test routing::tests::route_endpoint_can_force_chat_compat_without_responses ... ok
[INFO] [stdout] test routing::tests::tool_requests_require_backend_and_route_capability ... ok
[INFO] [stdout] test routing::tests::strategy_round_robin_serializes_via_selected_route_weight ... ok
[INFO] [stdout] test routing::tests::round_robin_uses_model_key ... ok
[INFO] [stdout] test routing::tests::sticky_candidates_start_with_hashed_backend_and_keep_fallbacks ... ok
[INFO] [stdout] test routing::tests::route_endpoint_can_force_responses_compat_without_chat ... ok
[INFO] [stdout] test routing::tests::round_robin_zero_count_returns_zero ... ok
[INFO] [stdout] test routing::tests::weighted_random_single_candidate_noop ... ok
[INFO] [stdout] test routing::tests::tool_requests_fail_when_only_endpoint_matches ... ok
[INFO] [stdout] test routing::tests::weighted_random_preserves_fallback_set ... ok
[INFO] [stdout] test routing::tests::round_robin_concurrent_threads_cover_all_indices ... ok
[INFO] [stdout] test routing::tests::weighted_random_deterministic_weights_zero_skipped ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 37 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests onair_core
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests onair_obs
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests onair_proxy
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d", kill_on_drop: false }`
[INFO] [stdout] f80c2afa327d285ce960866c9f931c4fb1ca950dc2de47add3bba14672026f0d
