diff options
author | Chih-Hung Hsieh <chh@google.com> | 2020-06-10 20:15:59 -0700 |
---|---|---|
committer | Chih-Hung Hsieh <chh@google.com> | 2020-06-10 20:15:59 -0700 |
commit | 01ae379526218e7f6ca28510b6c06098419b7380 (patch) | |
tree | ded7cfd36c57807924e0b2e62439a8df9f6d32c1 /tests/test_buf_mut.rs | |
parent | 7457df12a2eb70afcfa283968f7d1fadf123b0a1 (diff) | |
download | bytes-01ae379526218e7f6ca28510b6c06098419b7380.tar.gz |
Import bytes-0.5.4
* Add OWNERS and Android.bp
Bug: 143953733
Test: make
Change-Id: Ica69d7252abb1c2967f2c0e11a62d0bd83192fb3
Diffstat (limited to 'tests/test_buf_mut.rs')
-rw-r--r-- | tests/test_buf_mut.rs | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/tests/test_buf_mut.rs b/tests/test_buf_mut.rs new file mode 100644 index 0000000..f002f7d --- /dev/null +++ b/tests/test_buf_mut.rs @@ -0,0 +1,118 @@ +#![deny(warnings, rust_2018_idioms)] + +use bytes::{buf::IoSliceMut, BufMut, BytesMut}; +use std::usize; +use std::fmt::Write; + +#[test] +fn test_vec_as_mut_buf() { + let mut buf = Vec::with_capacity(64); + + assert_eq!(buf.remaining_mut(), usize::MAX); + + assert!(buf.bytes_mut().len() >= 64); + + buf.put(&b"zomg"[..]); + + assert_eq!(&buf, b"zomg"); + + assert_eq!(buf.remaining_mut(), usize::MAX - 4); + assert_eq!(buf.capacity(), 64); + + for _ in 0..16 { + buf.put(&b"zomg"[..]); + } + + assert_eq!(buf.len(), 68); +} + +#[test] +fn test_put_u8() { + let mut buf = Vec::with_capacity(8); + buf.put_u8(33); + assert_eq!(b"\x21", &buf[..]); +} + +#[test] +fn test_put_u16() { + let mut buf = Vec::with_capacity(8); + buf.put_u16(8532); + assert_eq!(b"\x21\x54", &buf[..]); + + buf.clear(); + buf.put_u16_le(8532); + assert_eq!(b"\x54\x21", &buf[..]); +} + +#[test] +fn test_vec_advance_mut() { + // Regression test for carllerche/bytes#108. + let mut buf = Vec::with_capacity(8); + unsafe { + buf.advance_mut(12); + assert_eq!(buf.len(), 12); + assert!(buf.capacity() >= 12, "capacity: {}", buf.capacity()); + } +} + +#[test] +fn test_clone() { + let mut buf = BytesMut::with_capacity(100); + buf.write_str("this is a test").unwrap(); + let buf2 = buf.clone(); + + buf.write_str(" of our emergency broadcast system").unwrap(); + assert!(buf != buf2); +} + +#[test] +fn test_bufs_vec_mut() { + let b1: &mut [u8] = &mut []; + let b2: &mut [u8] = &mut []; + let mut dst = [IoSliceMut::from(b1), IoSliceMut::from(b2)]; + + // with no capacity + let mut buf = BytesMut::new(); + assert_eq!(buf.capacity(), 0); + assert_eq!(1, buf.bytes_vectored_mut(&mut dst[..])); + + // with capacity + let mut buf = BytesMut::with_capacity(64); + assert_eq!(1, buf.bytes_vectored_mut(&mut dst[..])); +} + +#[test] +fn test_mut_slice() { + let mut v = vec![0, 0, 0, 0]; + let mut s = &mut v[..]; + s.put_u32(42); +} + +#[test] +fn test_deref_bufmut_forwards() { + struct Special; + + impl BufMut for Special { + fn remaining_mut(&self) -> usize { + unreachable!("remaining_mut"); + } + + fn bytes_mut(&mut self) -> &mut [std::mem::MaybeUninit<u8>] { + unreachable!("bytes_mut"); + } + + unsafe fn advance_mut(&mut self, _: usize) { + unreachable!("advance"); + } + + fn put_u8(&mut self, _: u8) { + // specialized! + } + } + + // these should all use the specialized method + Special.put_u8(b'x'); + (&mut Special as &mut dyn BufMut).put_u8(b'x'); + (Box::new(Special) as Box<dyn BufMut>).put_u8(b'x'); + Box::new(Special).put_u8(b'x'); +} |