y_octo/codec/
buffer.rs

1use std::io::{Error, Write};
2
3use nom::bytes::complete::take;
4
5use super::*;
6
7pub fn read_var_buffer(input: &[u8]) -> IResult<&[u8], &[u8]> {
8    let (tail, len) = read_var_u64(input)?;
9    let (tail, val) = take(len as usize)(tail)?;
10    Ok((tail, val))
11}
12
13pub fn write_var_buffer<W: Write>(buffer: &mut W, data: &[u8]) -> Result<(), Error> {
14    write_var_u64(buffer, data.len() as u64)?;
15    buffer.write_all(data)?;
16    Ok(())
17}
18
19#[cfg(test)]
20mod tests {
21    use nom::{
22        AsBytes, Err,
23        error::{Error, ErrorKind},
24    };
25
26    use super::*;
27
28    #[test]
29    fn test_read_var_buffer() {
30        // Test case 1: valid input, buffer length = 5
31        let input = [0x05, 0x01, 0x02, 0x03, 0x04, 0x05];
32        let expected_output = [0x01, 0x02, 0x03, 0x04, 0x05];
33        let result = read_var_buffer(&input);
34        assert_eq!(result, Ok((&[][..], &expected_output[..])));
35
36        // Test case 2: truncated input, missing buffer
37        let input = [0x05, 0x01, 0x02, 0x03];
38        let result = read_var_buffer(&input);
39        assert_eq!(result, Err(Err::Error(Error::new(&input[1..], ErrorKind::Eof))));
40
41        // Test case 3: invalid input
42        let input = [0xFF, 0x01, 0x02, 0x03];
43        let result = read_var_buffer(&input);
44        assert_eq!(result, Err(Err::Error(Error::new(&input[2..], ErrorKind::Eof))));
45
46        // Test case 4: invalid var int encoding
47        let input = [0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01];
48        let result = read_var_buffer(&input);
49        assert_eq!(result, Err(Err::Error(Error::new(&input[7..], ErrorKind::Eof))));
50    }
51
52    #[test]
53    fn test_var_buf_codec() {
54        test_var_buf_enc_dec(&[]);
55        test_var_buf_enc_dec(&[0x01, 0x02, 0x03, 0x04, 0x05]);
56        test_var_buf_enc_dec(b"test_var_buf_enc_dec");
57
58        #[cfg(not(miri))]
59        {
60            use rand::{Rng, thread_rng};
61            let mut rng = thread_rng();
62            for _ in 0..100 {
63                test_var_buf_enc_dec(&{
64                    let mut bytes = vec![0u8; rng.gen_range(0..u16::MAX as usize)];
65                    rng.fill(&mut bytes[..]);
66                    bytes
67                });
68            }
69        }
70    }
71
72    fn test_var_buf_enc_dec(data: &[u8]) {
73        let mut buf = Vec::<u8>::new();
74        write_var_buffer(&mut buf, data).unwrap();
75        let result = read_var_buffer(buf.as_bytes());
76        assert_eq!(result, Ok((&[][..], data)));
77    }
78}