// Copyright 2015-2019 Brian Smith. // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use ring::{ rand::{self, SecureRandom as _}, test, }; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test_configure; #[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn test_system_random_lengths() { const LINUX_LIMIT: usize = 256; const WEB_LIMIT: usize = 65536; // Test that `fill` succeeds for various interesting lengths. `256` and // multiples thereof are interesting because that's an edge case for // `getrandom` on Linux. let lengths = [ 0, 1, 2, 3, 96, LINUX_LIMIT - 1, LINUX_LIMIT, LINUX_LIMIT + 1, LINUX_LIMIT * 2, 511, 512, 513, 4096, WEB_LIMIT - 1, WEB_LIMIT, WEB_LIMIT + 1, WEB_LIMIT * 2, ]; for len in lengths.iter() { let mut buf = vec![0; *len]; let rng = rand::SystemRandom::new(); assert!(rng.fill(&mut buf).is_ok()); // If `len` < 96 then there's a big chance of false positives, but // otherwise the likelihood of a false positive is so too low to // worry about. if *len >= 96 { assert!(buf.iter().any(|x| *x != 0)); } } } #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn test_system_random_traits() { test::compile_time_assert_clone::(); test::compile_time_assert_send::(); assert_eq!( "SystemRandom(())", format!("{:?}", rand::SystemRandom::new()) ); }