1 use super::getrandom_impl; 2 3 #[cfg(all(target_arch = "wasm32", target_os = "unknown"))] 4 use wasm_bindgen_test::wasm_bindgen_test as test; 5 6 #[cfg(feature = "test-in-browser")] 7 wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); 8 9 #[test] test_zero()10fn test_zero() { 11 // Test that APIs are happy with zero-length requests 12 getrandom_impl(&mut [0u8; 0]).unwrap(); 13 } 14 15 #[test] test_diff()16fn test_diff() { 17 let mut v1 = [0u8; 1000]; 18 getrandom_impl(&mut v1).unwrap(); 19 20 let mut v2 = [0u8; 1000]; 21 getrandom_impl(&mut v2).unwrap(); 22 23 let mut n_diff_bits = 0; 24 for i in 0..v1.len() { 25 n_diff_bits += (v1[i] ^ v2[i]).count_ones(); 26 } 27 28 // Check at least 1 bit per byte differs. p(failure) < 1e-1000 with random input. 29 assert!(n_diff_bits >= v1.len() as u32); 30 } 31 32 #[test] test_huge()33fn test_huge() { 34 let mut huge = [0u8; 100_000]; 35 getrandom_impl(&mut huge).unwrap(); 36 } 37 38 // On WASM, the thread API always fails/panics 39 #[cfg(not(target_arch = "wasm32"))] 40 #[test] test_multithreading()41fn test_multithreading() { 42 extern crate std; 43 use std::{sync::mpsc::channel, thread, vec}; 44 45 let mut txs = vec![]; 46 for _ in 0..20 { 47 let (tx, rx) = channel(); 48 txs.push(tx); 49 50 thread::spawn(move || { 51 // wait until all the tasks are ready to go. 52 rx.recv().unwrap(); 53 let mut v = [0u8; 1000]; 54 55 for _ in 0..100 { 56 getrandom_impl(&mut v).unwrap(); 57 thread::yield_now(); 58 } 59 }); 60 } 61 62 // start all the tasks 63 for tx in txs.iter() { 64 tx.send(()).unwrap(); 65 } 66 } 67