xmlstream: add tests to capture thingy

Jonas Schäfer created

This would've caught the embarrassing error made in the previous commit.

Change summary

tokio-xmpp/src/xmlstream/capture.rs | 72 ++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)

Detailed changes

tokio-xmpp/src/xmlstream/capture.rs 🔗

@@ -202,3 +202,75 @@ pub(super) fn log_recv(err: Option<&xmpp_parsers::Error>, capture: Option<Vec<u8
 pub(super) fn log_send(data: &[u8]) {
     log::trace!("SEND {}", LogXsoBuf(data));
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    use tokio::io::{AsyncBufReadExt, AsyncReadExt};
+
+    #[tokio::test]
+    async fn captures_data_read_via_async_read() {
+        let mut src = &b"Hello World!"[..];
+        let src = tokio::io::BufReader::new(&mut src);
+        let mut src = CaptureBufRead::wrap(src);
+        src.enable_capture();
+
+        let mut dst = [0u8; 8];
+        assert_eq!(src.read(&mut dst[..]).await.unwrap(), 8);
+        assert_eq!(&dst, b"Hello Wo");
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap(), b"Hello Wo");
+    }
+
+    #[tokio::test]
+    async fn captures_data_read_via_async_buf_read() {
+        let mut src = &b"Hello World!"[..];
+        let src = tokio::io::BufReader::new(&mut src);
+        let mut src = CaptureBufRead::wrap(src);
+        src.enable_capture();
+
+        assert_eq!(src.fill_buf().await.unwrap().len(), 12);
+        // We haven't consumed any bytes yet -> must return zero.
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap().len(), 0);
+
+        src.consume(5);
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap(), b"Hello");
+
+        src.consume(6);
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap(), b" World");
+    }
+
+    #[tokio::test]
+    async fn discard_capture_drops_consumed_data() {
+        let mut src = &b"Hello World!"[..];
+        let src = tokio::io::BufReader::new(&mut src);
+        let mut src = CaptureBufRead::wrap(src);
+        src.enable_capture();
+
+        assert_eq!(src.fill_buf().await.unwrap().len(), 12);
+        // We haven't consumed any bytes yet -> must return zero.
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap().len(), 0);
+
+        src.consume(5);
+        Pin::new(&mut src).discard_capture();
+
+        src.consume(6);
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap(), b" World");
+    }
+
+    #[tokio::test]
+    async fn captured_data_accumulates() {
+        let mut src = &b"Hello World!"[..];
+        let src = tokio::io::BufReader::new(&mut src);
+        let mut src = CaptureBufRead::wrap(src);
+        src.enable_capture();
+
+        assert_eq!(src.fill_buf().await.unwrap().len(), 12);
+        // We haven't consumed any bytes yet -> must return zero.
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap().len(), 0);
+
+        src.consume(5);
+        src.consume(6);
+        assert_eq!(Pin::new(&mut src).take_capture().unwrap(), b"Hello World");
+    }
+}