|
| 1 | +// https://github.com/denoland/fastwebsockets/blob/d45101044613c47e7a44a14a59bde02285503c6d/src/mask.rs |
| 2 | + |
1 | 3 | #[inline] |
2 | 4 | fn unmask_easy(payload: &mut [u8], mask: [u8; 4]) { |
3 | 5 | payload.iter_mut().enumerate().for_each(|(i, v)| { |
@@ -36,3 +38,48 @@ fn unmask_fallback(buf: &mut [u8], mask: [u8; 4]) { |
36 | 38 | pub fn unmask(payload: &mut [u8], mask: [u8; 4]) { |
37 | 39 | unmask_fallback(payload, mask) |
38 | 40 | } |
| 41 | + |
| 42 | +#[cfg(test)] |
| 43 | +mod tests { |
| 44 | + use super::*; |
| 45 | + |
| 46 | + #[test] |
| 47 | + fn test_unmask() { |
| 48 | + let mut payload = [0u8; 33]; |
| 49 | + let mask = [1, 2, 3, 4]; |
| 50 | + unmask(&mut payload, mask); |
| 51 | + assert_eq!( |
| 52 | + &payload, |
| 53 | + &[ |
| 54 | + 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, |
| 55 | + 1, 2, 3, 4, 1 |
| 56 | + ] |
| 57 | + ); |
| 58 | + } |
| 59 | + |
| 60 | + #[test] |
| 61 | + fn length_variation_unmask() { |
| 62 | + for len in &[0, 2, 3, 8, 16, 18, 31, 32, 40] { |
| 63 | + let mut payload = std::vec![0u8; *len]; |
| 64 | + let mask = [1, 2, 3, 4]; |
| 65 | + unmask(&mut payload, mask); |
| 66 | + |
| 67 | + let expected = (0..*len) |
| 68 | + .map(|i| (i & 3) as u8 + 1) |
| 69 | + .collect::<std::vec::Vec<_>>(); |
| 70 | + assert_eq!(payload, expected); |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + #[test] |
| 75 | + fn length_variation_unmask_2() { |
| 76 | + for len in &[0, 2, 3, 8, 16, 18, 31, 32, 40] { |
| 77 | + let mut payload = std::vec![0u8; *len]; |
| 78 | + let mask = rand::random::<[u8; 4]>(); |
| 79 | + unmask(&mut payload, mask); |
| 80 | + |
| 81 | + let expected = (0..*len).map(|i| mask[i & 3]).collect::<std::vec::Vec<_>>(); |
| 82 | + assert_eq!(payload, expected); |
| 83 | + } |
| 84 | + } |
| 85 | +} |
0 commit comments