codek/
testing.rs

1use std::any::type_name;
2use std::fmt::Debug;
3use std::io;
4
5use crate::codec::Codec;
6
7/// Test decoding from correct data and corrupted data.
8pub fn test_codec<D: Codec + PartialEq + Debug>(
9    encoded_bytes: &[u8],
10    v: &D,
11) -> Result<(), io::Error> {
12    // convert `correct` to string if possible
13    let correct_str = String::from_utf8_lossy(encoded_bytes);
14    println!("correct data: {}", correct_str);
15
16    let mes = format!("Type: {} encoded data: {:?}", type_name::<D>(), correct_str);
17
18    // Test encoding
19    {
20        let mut b = Vec::new();
21        let n = v.encode(&mut b)?;
22        assert_eq!(n, b.len(), "output len, {}", &mes);
23        assert_eq!(b, encoded_bytes, "output data, {}", &mes);
24    }
25
26    // Assert the input is correct
27
28    {
29        let b = encoded_bytes.to_vec();
30        let decoded = D::decode(&mut b.as_slice())?;
31        assert_eq!(v, &decoded, "decode, {}", &mes);
32    }
33
34    // Assert corrupted data returns error
35    for i in 0..encoded_bytes.len() {
36        let mut corrupted = encoded_bytes.to_vec();
37        corrupted[i] = corrupted[i].wrapping_add(1);
38
39        let res = D::decode(&mut corrupted.as_slice());
40        assert!(
41            res.is_err(),
42            "change {}-th byte for type {}; the correct encoded data is: {}",
43            i,
44            type_name::<D>(),
45            correct_str
46        );
47    }
48
49    Ok(())
50}