Skip to content

Commit ab861ec

Browse files
test(proto): add BufList tests
1 parent a5d679e commit ab861ec

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

watermelon-proto/src/util/buf_list.rs

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ impl<B: Buf> BufList<B> {
2929

3030
impl<B: Buf> Buf for BufList<B> {
3131
fn remaining(&self) -> usize {
32+
debug_assert_eq!(
33+
self.len,
34+
self.bufs.iter().map(Buf::remaining).sum::<usize>()
35+
);
3236
self.len
3337
}
3438

@@ -106,3 +110,155 @@ impl<B: Buf> Buf for BufList<B> {
106110
bufs.freeze()
107111
}
108112
}
113+
114+
#[cfg(test)]
115+
mod tests {
116+
#[cfg(feature = "std")]
117+
use std::io;
118+
119+
use bytes::{buf::Chain, Buf};
120+
121+
use super::BufList;
122+
123+
#[test]
124+
fn series() {
125+
let mut bufs = BufList::<Chain<&[u8], &[u8]>>::new();
126+
// empty
127+
assert_eq!(bufs.remaining(), 0);
128+
assert!(!bufs.has_remaining());
129+
assert_eq!(bufs.chunk(), &[0u8; 0]);
130+
#[cfg(feature = "std")]
131+
{
132+
let mut vectors = [io::IoSlice::new(&[]); 64];
133+
assert_eq!(bufs.chunks_vectored(&mut vectors), 0);
134+
assert!(vectors.iter().all(|vector| vector.is_empty()));
135+
}
136+
137+
// first push
138+
bufs.push([0u8, 1, 2, 3, 4, 5, 6, 7].chain(&[8u8, 9, 10, 11]));
139+
assert_eq!(bufs.remaining(), 12);
140+
assert!(bufs.has_remaining());
141+
assert_eq!(bufs.chunk(), &[0u8, 1, 2, 3, 4, 5, 6, 7]);
142+
#[cfg(feature = "std")]
143+
{
144+
let mut vectors = [io::IoSlice::new(&[]); 64];
145+
assert_eq!(bufs.chunks_vectored(&mut vectors), 2);
146+
assert_eq!(&*vectors[0], &[0u8, 1, 2, 3, 4, 5, 6, 7]);
147+
assert_eq!(&*vectors[1], &[8u8, 9, 10, 11]);
148+
assert!(vectors[2..].iter().all(|vector| vector.is_empty()));
149+
}
150+
151+
// partially read the first buf
152+
bufs.advance(4);
153+
assert_eq!(bufs.remaining(), 8);
154+
assert!(bufs.has_remaining());
155+
assert_eq!(bufs.chunk(), &[4u8, 5, 6, 7]);
156+
#[cfg(feature = "std")]
157+
{
158+
let mut vectors = [io::IoSlice::new(&[]); 64];
159+
assert_eq!(bufs.chunks_vectored(&mut vectors), 2);
160+
assert_eq!(&*vectors[0], &[4u8, 5, 6, 7]);
161+
assert_eq!(&*vectors[1], &[8u8, 9, 10, 11]);
162+
assert!(vectors[2..].iter().all(|vector| vector.is_empty()));
163+
}
164+
165+
// second push
166+
bufs.push([12u8, 13, 14, 15, 16, 17].chain(&[18u8, 19, 20]));
167+
assert_eq!(bufs.remaining(), 17);
168+
assert!(bufs.has_remaining());
169+
assert_eq!(bufs.chunk(), &[4u8, 5, 6, 7]);
170+
#[cfg(feature = "std")]
171+
{
172+
let mut vectors = [io::IoSlice::new(&[]); 64];
173+
assert_eq!(bufs.chunks_vectored(&mut vectors), 4);
174+
assert_eq!(&*vectors[0], &[4u8, 5, 6, 7]);
175+
assert_eq!(&*vectors[1], &[8u8, 9, 10, 11]);
176+
assert_eq!(&*vectors[2], &[12u8, 13, 14, 15, 16, 17]);
177+
assert_eq!(&*vectors[3], &[18u8, 19, 20]);
178+
assert!(vectors[4..].iter().all(|vector| vector.is_empty()));
179+
}
180+
181+
// read remaining first buf and part of second buf
182+
bufs.advance(6);
183+
assert_eq!(bufs.remaining(), 11);
184+
assert!(bufs.has_remaining());
185+
assert_eq!(bufs.chunk(), &[10u8, 11]);
186+
#[cfg(feature = "std")]
187+
{
188+
let mut vectors = [io::IoSlice::new(&[]); 64];
189+
assert_eq!(bufs.chunks_vectored(&mut vectors), 3);
190+
assert_eq!(&*vectors[0], &[10u8, 11]);
191+
assert_eq!(&*vectors[1], &[12u8, 13, 14, 15, 16, 17]);
192+
assert_eq!(&*vectors[2], &[18u8, 19, 20]);
193+
assert!(vectors[3..].iter().all(|vector| vector.is_empty()));
194+
}
195+
196+
// third push
197+
bufs.push([21u8, 22, 23, 24].chain(&[25u8, 26, 27]));
198+
assert_eq!(bufs.remaining(), 18);
199+
assert!(bufs.has_remaining());
200+
assert_eq!(bufs.chunk(), &[10u8, 11]);
201+
#[cfg(feature = "std")]
202+
{
203+
let mut vectors = [io::IoSlice::new(&[]); 64];
204+
assert_eq!(bufs.chunks_vectored(&mut vectors), 5);
205+
assert_eq!(&*vectors[0], &[10u8, 11]);
206+
assert_eq!(&*vectors[1], &[12u8, 13, 14, 15, 16, 17]);
207+
assert_eq!(&*vectors[2], &[18u8, 19, 20]);
208+
assert_eq!(&*vectors[3], &[21u8, 22, 23, 24]);
209+
assert_eq!(&*vectors[4], &[25u8, 26, 27]);
210+
assert!(vectors[5..].iter().all(|vector| vector.is_empty()));
211+
}
212+
213+
// read part of second buf
214+
let buf = bufs.copy_to_bytes(1);
215+
assert_eq!(&*buf, &[10u8]);
216+
assert_eq!(bufs.remaining(), 17);
217+
assert!(bufs.has_remaining());
218+
assert_eq!(bufs.chunk(), &[11u8]);
219+
#[cfg(feature = "std")]
220+
{
221+
let mut vectors = [io::IoSlice::new(&[]); 64];
222+
assert_eq!(bufs.chunks_vectored(&mut vectors), 5);
223+
assert_eq!(&*vectors[0], &[11u8]);
224+
assert_eq!(&*vectors[1], &[12u8, 13, 14, 15, 16, 17]);
225+
assert_eq!(&*vectors[2], &[18u8, 19, 20]);
226+
assert_eq!(&*vectors[3], &[21u8, 22, 23, 24]);
227+
assert_eq!(&*vectors[4], &[25u8, 26, 27]);
228+
assert!(vectors[5..].iter().all(|vector| vector.is_empty()));
229+
}
230+
231+
// read remaining second buf and part of third buf
232+
let buf = bufs.copy_to_bytes(4);
233+
assert_eq!(&*buf, &[11u8, 12, 13, 14]);
234+
assert_eq!(bufs.remaining(), 13);
235+
assert!(bufs.has_remaining());
236+
assert_eq!(bufs.chunk(), &[15u8, 16, 17]);
237+
#[cfg(feature = "std")]
238+
{
239+
let mut vectors = [io::IoSlice::new(&[]); 64];
240+
assert_eq!(bufs.chunks_vectored(&mut vectors), 4);
241+
assert_eq!(&*vectors[0], &[15u8, 16, 17]);
242+
assert_eq!(&*vectors[1], &[18u8, 19, 20]);
243+
assert_eq!(&*vectors[2], &[21u8, 22, 23, 24]);
244+
assert_eq!(&*vectors[3], &[25u8, 26, 27]);
245+
assert!(vectors[4..].iter().all(|vector| vector.is_empty()));
246+
}
247+
248+
// read remaining
249+
let buf = bufs.copy_to_bytes(13);
250+
assert_eq!(
251+
&*buf,
252+
&[15u8, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
253+
);
254+
assert_eq!(bufs.remaining(), 0);
255+
assert!(!bufs.has_remaining());
256+
assert_eq!(bufs.chunk(), &[0u8; 0]);
257+
#[cfg(feature = "std")]
258+
{
259+
let mut vectors = [io::IoSlice::new(&[]); 64];
260+
assert_eq!(bufs.chunks_vectored(&mut vectors), 0);
261+
assert!(vectors.iter().all(|vector| vector.is_empty()));
262+
}
263+
}
264+
}

0 commit comments

Comments
 (0)