chiark / gitweb /
packetframe: tests: LumpReader tests short reads
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 17 Apr 2021 12:45:54 +0000 (13:45 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 23 Apr 2021 18:32:07 +0000 (19:32 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/packetframe.rs

index 3b0eb76dbc704a5af930a2ae365bee3f69a52d35..9f61eba37a282492e0f1c1729a4fb7c940bacb1c 100644 (file)
@@ -377,4 +377,32 @@ fn write_test(){
     expect_good(&mut rd, b"longer!");
   };
   read_all(&mut &*msg.buf);
+
+  #[derive(Debug)]
+  struct LumpReader<R: Read> {
+    inner: R,
+    inlump: usize,
+    lumpsize: usize,
+  }
+  impl<R:Read> LumpReader<R> {
+    fn new(lumpsize: usize, inner: R) -> Self {
+      LumpReader { inner, lumpsize, inlump: 0 }
+    }
+  }
+  impl<R:Read> Read for LumpReader<R> {
+    #[throws(io::Error)]
+    fn read(&mut self, buf: &mut [u8]) -> usize {
+      if self.inlump == 0 { self.inlump = self.lumpsize }
+      let want = min(self.inlump, buf.len());
+      let r = self.inner.read(&mut buf[0..want])?;
+      self.inlump -= r;
+      r
+    }
+  }
+
+  for lumpsize in 1..msg.buf.len() {
+    dbgc!(lumpsize);
+    let mut lr = LumpReader::new(lumpsize, &*msg.buf);
+    read_all(&mut lr);
+  }
 }