//! Regression test for the on-device failure: the APK built, installed and //! opened, but pressing **Open** on the unlock screen died one call deep inside //! Arti's rustls backend with //! //! ```text //! Could not automatically determine the process-level CryptoProvider from //! Rustls crate features. //! Call CryptoProvider::install_default() before this point to select a //! provider manually, or make sure exactly one of the 'aws-lc-rs' and 'ring' //! features is enabled. //! ``` //! //! rustls 0.23 chooses its provider from its own `ring` / `aws-lc-rs` **crate //! features**, not from which crypto crates happen to be linked. Arti reaches //! rustls through `tor-rtcompat` with `default-features = false`, so neither //! provider feature is on and rustls is compiled with *no* provider at all: //! `ring` showing up in `cargo tree` (pulled in by `snow`, for Noise) proves //! nothing. Everything compiles, the APK ships, and the process-default lookup //! fails at runtime. //! //! This test is the invariant Arti relies on: the process default must be //! resolvable **without** anyone calling `install_default()` first. //! //! Deliberately the only test in this file — a second test that installs a //! provider would race with it inside the same test binary and could mask the //! regression. /// Building a `rustls` config the way Arti does, straight from the process /// default, must not panic. #[test] fn rustls_default_provider_resolves_without_manual_install() { assert!( rustls::crypto::CryptoProvider::get_default().is_none(), "this test must start with no provider installed" ); // Pre-fix this panics with the device's exact message. let _ = rustls::ClientConfig::builder(); assert!( rustls::crypto::CryptoProvider::get_default().is_some(), "rustls resolved no CryptoProvider — the crate feature that selects a \ provider is not enabled in this workspace" ); }