use crate::error::Result;
use crate::proto::{self, Header};
use crate::proto::{Endianness, Flags, MessageType};
use crate::ty;
use crate::{BodyBuf, Signature, Variant};
#[rustfmt::skip]
const LE_BLOB: [u8; 36] = [
b'l',
b'\x02',
b'\x02',
b'\x01',
b'\x04', b'\x00', b'\x00', b'\x00',
b'\x78', b'\x56', b'\x34', b'\x12',
b'\x0f', b'\0', b'\0', b'\0',
b'\x05',
b'\x01', b'u', b'\0',
b'\x12', b'\xef', b'\xcd', b'\xab',
b'\x08',
b'\x01', b'g', b'\0',
b'\x01', b'u', b'\0',
b'\0',
b'\xef', b'\xbe', b'\xad', b'\xde'
];
#[rustfmt::skip]
const BE_BLOB: [u8; 36] = [
b'B',
b'\x02',
b'\x02',
b'\x01',
b'\x00', b'\x00', b'\x00', b'\x04',
b'\x12', b'\x34', b'\x56', b'\x78',
b'\0', b'\0', b'\0', b'\x0f',
b'\x05',
b'\x01', b'u', b'\0',
b'\xab', b'\xcd', b'\xef', b'\x12',
b'\x08',
b'\x01', b'g', b'\0',
b'\x01', b'u', b'\0',
b'\0',
b'\xde', b'\xad', b'\xbe', b'\xef',
];
#[test]
fn write_blobs() -> Result<()> {
let mut buf = BodyBuf::with_endianness(Endianness::LITTLE);
write_blob(&mut buf)?;
assert_eq!(buf.get(), &LE_BLOB[..]);
let mut buf = BodyBuf::with_endianness(Endianness::BIG);
write_blob(&mut buf)?;
assert_eq!(buf.get(), &BE_BLOB[..]);
Ok(())
}
fn write_blob(buf: &mut BodyBuf) -> Result<()> {
buf.store(Header {
endianness: buf.endianness(),
message_type: MessageType::METHOD_RETURN,
flags: Flags::default() | Flags::NO_AUTO_START,
version: 1,
body_length: 4,
serial: 0x12345678u32,
})?;
let mut array = buf.store_array::<(proto::Variant, ty::Variant)>()?;
array
.store_struct()
.store(proto::Variant::REPLY_SERIAL)
.store(Variant::U32(0xabcdef12u32))
.finish();
array
.store_struct()
.store(proto::Variant::SIGNATURE)
.store(Variant::Signature(Signature::UINT32))
.finish();
array.finish();
buf.store(0xdeadbeefu32)?;
Ok(())
}
#[test]
fn test_read_buf() -> Result<()> {
let mut buf = BodyBuf::new();
buf.store(4u32)?;
buf.extend_from_slice_nul(b"\x01\x02\x03\x04");
let mut buf = buf.as_body();
let mut read_buf = buf.read_until(6);
assert_eq!(read_buf.load::<u32>()?, 4);
assert_eq!(read_buf.load::<u8>()?, 1);
assert_eq!(read_buf.load::<u8>()?, 2);
assert_eq!(buf.get(), &[3, 4, 0]);
Ok(())
}
#[test]
fn test_read_buf_load() -> Result<()> {
let mut buf = BodyBuf::new();
buf.store(7u32)?;
buf.extend_from_slice_nul(b"foo bar");
let mut buf = buf.as_body();
let mut read_buf = buf.read_until(6);
assert_eq!(read_buf.load::<u32>()?, 7u32);
assert_eq!(read_buf.load::<u8>()?, b'f');
assert_eq!(read_buf.load::<u8>()?, b'o');
assert_eq!(buf.get(), &[b'o', b' ', b'b', b'a', b'r', 0]);
Ok(())
}
#[test]
fn test_read_buf_read() -> Result<()> {
let mut buf = BodyBuf::new();
buf.store(4u32)?;
buf.extend_from_slice_nul(b"\x01\x02\x03\x04");
let mut buf = buf.as_body();
let mut read_buf = buf.read_until(6);
assert_eq!(read_buf.load::<u32>()?, 4);
assert_eq!(read_buf.load::<u8>()?, 1);
assert_eq!(read_buf.load::<u8>()?, 2);
assert!(read_buf.load::<u8>().is_err());
assert!(read_buf.is_empty());
let _ = buf.read_until(3);
assert!(buf.is_empty());
Ok(())
}
#[test]
fn test_nested_read_buf() -> Result<()> {
let mut buf = BodyBuf::new();
buf.store(4u32)?;
buf.extend_from_slice_nul(b"\x01\x02\x03\x04");
let mut buf = buf.as_body();
let mut read_buf = buf.read_until(6);
assert_eq!(read_buf.load::<u32>()?, 4);
let mut read_buf2 = read_buf.read_until(2);
assert_eq!(read_buf2.load::<u8>()?, 1);
assert_eq!(read_buf2.load::<u8>()?, 2);
assert!(read_buf.is_empty());
assert!(read_buf2.is_empty());
assert_eq!(buf.get(), &[3, 4, 0]);
Ok(())
}