xref: /webrtc/ice/src/rand/rand_test.rs (revision 5d8fe953)
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