From ef2e13df274aaf0f2e50c03c63db33d65d9a0275 Mon Sep 17 00:00:00 2001 From: salmonik Date: Wed, 28 Oct 2026 22:38:54 +0100 Subject: v0.2.6: preserve buffered lines and add request read timeouts --- tests/protocol.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tests/protocol.rs (limited to 'tests/protocol.rs') diff --git a/tests/protocol.rs b/tests/protocol.rs new file mode 100644 index 0000000..2962574 --- /dev/null +++ b/tests/protocol.rs @@ -0,0 +1,78 @@ +use std::io::{Cursor, Error, ErrorKind}; + +use zagan_bet::protocol::{io_failure_message, LineBuffer}; + +#[test] +fn keeps_data_after_the_first_newline() { + let mut buffer = LineBuffer::new(); + buffer.push(b"PONG\nGAME_RESULT session 60 10 990 OSS two\n"); + + assert_eq!(buffer.next_line().as_deref(), Some("PONG")); + assert_eq!( + buffer.next_line().as_deref(), + Some("GAME_RESULT session 60 10 990 OSS two") + ); + assert_eq!(buffer.next_line(), None); +} + +#[test] +fn handles_crlf_and_empty_lines() { + let mut buffer = LineBuffer::new(); + buffer.push(b"PONG\r\n\r\n"); + + assert_eq!(buffer.next_line().as_deref(), Some("PONG")); + assert_eq!(buffer.next_line().as_deref(), Some("")); + assert_eq!(buffer.next_line(), None); +} + +#[test] +fn waits_for_a_split_line() { + let mut buffer = LineBuffer::new(); + buffer.push(b"PO"); + assert_eq!(buffer.next_line(), None); + + buffer.push(b"NG\n"); + assert_eq!(buffer.next_line().as_deref(), Some("PONG")); +} + +#[test] +fn reads_multiple_lines_from_a_reader() { + let mut buffer = LineBuffer::new(); + let mut reader = Cursor::new(b"one\ntwo\n".to_vec()); + + assert_eq!(buffer.read_line(&mut reader).unwrap().as_deref(), Some("one")); + assert_eq!(buffer.read_line(&mut reader).unwrap().as_deref(), Some("two")); + assert_eq!(buffer.read_line(&mut reader).unwrap(), None); +} + +#[test] +fn returns_a_partial_line_at_eof() { + let mut buffer = LineBuffer::new(); + let mut reader = Cursor::new(b"partial".to_vec()); + + assert_eq!( + buffer.read_line(&mut reader).unwrap().as_deref(), + Some("partial") + ); + assert_eq!(buffer.read_line(&mut reader).unwrap(), None); +} + +#[test] +fn timeout_errors_get_a_timeout_message() { + assert_eq!( + io_failure_message(&Error::from(ErrorKind::TimedOut)), + "ERROR Request timed out" + ); + assert_eq!( + io_failure_message(&Error::from(ErrorKind::WouldBlock)), + "ERROR Request timed out" + ); + assert_eq!( + io_failure_message(&Error::from(ErrorKind::UnexpectedEof)), + "ERROR Connection lost" + ); + assert_eq!( + io_failure_message(&Error::from(ErrorKind::ConnectionReset)), + "ERROR Connection lost" + ); +} -- cgit v1.2.3