1 use super::*;
2 use crate::error::Result;
3
4 use std::sync::Arc;
5 use tokio::sync::Mutex;
6 use waitgroup::WaitGroup;
7
8 #[tokio::test]
test_random_generator_collision() -> Result<()>9 async fn test_random_generator_collision() -> Result<()> {
10 let test_cases = vec![
11 (
12 "CandidateID",
13 0, /*||-> String {
14 generate_cand_id()
15 },*/
16 ),
17 (
18 "PWD", 1, /*||-> String {
19 generate_pwd()
20 },*/
21 ),
22 (
23 "Ufrag", 2, /*|| ->String {
24 generate_ufrag()
25 },*/
26 ),
27 ];
28
29 const N: usize = 10;
30 const ITERATION: usize = 10;
31
32 for (name, test_case) in test_cases {
33 for _ in 0..ITERATION {
34 let rands = Arc::new(Mutex::new(vec![]));
35
36 // Create a new wait group.
37 let wg = WaitGroup::new();
38
39 for _ in 0..N {
40 let w = wg.worker();
41 let rs = Arc::clone(&rands);
42
43 tokio::spawn(async move {
44 let _d = w;
45
46 let s = if test_case == 0 {
47 generate_cand_id()
48 } else if test_case == 1 {
49 generate_pwd()
50 } else {
51 generate_ufrag()
52 };
53
54 let mut r = rs.lock().await;
55 r.push(s);
56 });
57 }
58 wg.wait().await;
59
60 let rs = rands.lock().await;
61 assert_eq!(rs.len(), N, "{name} Failed to generate randoms");
62
63 for i in 0..N {
64 for j in i + 1..N {
65 assert_ne!(
66 rs[i], rs[j],
67 "{}: generateRandString caused collision: {} == {}",
68 name, rs[i], rs[j],
69 );
70 }
71 }
72 }
73 }
74
75 Ok(())
76 }
77