diff options
| author | Daniel Mueller <deso@posteo.net> | 2019-01-16 17:26:30 -0800 | 
|---|---|---|
| committer | Daniel Mueller <deso@posteo.net> | 2019-01-16 17:26:30 -0800 | 
| commit | 8350ac6afb2d678b74581000a6aafe1994b72231 (patch) | |
| tree | 2330da01a806921b3849c9e64d2b9f506495e2c0 /rand/rand_os/tests | |
| parent | d6652b913b33e432a748187f9f5623cec1e9926e (diff) | |
| download | nitrocli-8350ac6afb2d678b74581000a6aafe1994b72231.tar.gz nitrocli-8350ac6afb2d678b74581000a6aafe1994b72231.tar.bz2 | |
Update nitrokey crate to 0.3.3
This change updates the nitrokey crate to version 0.3.3. Along with that
change we update rand to 0.6.4 because rand 0.6.1 does not yet contain a
publicly accessible rand_os. Note that we no longer require all
crates in rand's workspace, but only rand_os and rand_core, which is a
significant reduction in the number of lines of code compiled.
Import subrepo nitrokey/:nitrokey at 7cf747d56ddc0b7eeedc3caf36dcc909907a171c
Import subrepo rand/:rand at 4336232dda03323634b10ec72ddf27914aebc3a2
Diffstat (limited to 'rand/rand_os/tests')
| -rw-r--r-- | rand/rand_os/tests/mod.rs | 80 | 
1 files changed, 80 insertions, 0 deletions
| diff --git a/rand/rand_os/tests/mod.rs b/rand/rand_os/tests/mod.rs new file mode 100644 index 0000000..2130e16 --- /dev/null +++ b/rand/rand_os/tests/mod.rs @@ -0,0 +1,80 @@ +extern crate rand_os; + +use rand_os::rand_core::RngCore; +use rand_os::OsRng; + +#[test] +fn test_os_rng() { +    let mut r = OsRng::new().unwrap(); + +    r.next_u32(); +    r.next_u64(); + +    let mut v1 = [0u8; 1000]; +    r.fill_bytes(&mut v1); + +    let mut v2 = [0u8; 1000]; +    r.fill_bytes(&mut v2); + +    let mut n_diff_bits = 0; +    for i in 0..v1.len() { +        n_diff_bits += (v1[i] ^ v2[i]).count_ones(); +    } + +    // Check at least 1 bit per byte differs. p(failure) < 1e-1000 with random input. +    assert!(n_diff_bits >= v1.len() as u32); +} + +#[test] +fn test_os_rng_empty() { +    let mut r = OsRng::new().unwrap(); + +    let mut empty = [0u8; 0]; +    r.fill_bytes(&mut empty); +} + +#[test] +fn test_os_rng_huge() { +    let mut r = OsRng::new().unwrap(); + +    let mut huge = [0u8; 100_000]; +    r.fill_bytes(&mut huge); +} + +#[cfg(not(any(target_arch = "wasm32", target_arch = "asmjs")))] +#[test] +fn test_os_rng_tasks() { +    use std::sync::mpsc::channel; +    use std::thread; + +    let mut txs = vec!(); +    for _ in 0..20 { +        let (tx, rx) = channel(); +        txs.push(tx); + +        thread::spawn(move|| { +            // wait until all the tasks are ready to go. +            rx.recv().unwrap(); + +            // deschedule to attempt to interleave things as much +            // as possible (XXX: is this a good test?) +            let mut r = OsRng::new().unwrap(); +            thread::yield_now(); +            let mut v = [0u8; 1000]; + +            for _ in 0..100 { +                r.next_u32(); +                thread::yield_now(); +                r.next_u64(); +                thread::yield_now(); +                r.fill_bytes(&mut v); +                thread::yield_now(); +            } +        }); +    } + +    // start all the tasks +    for tx in txs.iter() { +        tx.send(()).unwrap(); +    } +} | 
