ALPHA: wire is a tool to deploy nixos systems wire.althaea.zone/
at stable 63 lines 2.0 kB view raw
1// SPDX-License-Identifier: AGPL-3.0-or-later 2// Copyright 2024-2025 wire Contributors 3 4/// Split into its own struct to be tested nicer 5pub(crate) struct LogBuffer { 6 buffer: Vec<u8>, 7} 8 9impl LogBuffer { 10 pub const fn new() -> Self { 11 Self { buffer: Vec::new() } 12 } 13 14 pub fn process_slice(&mut self, slice: &[u8]) { 15 self.buffer.extend_from_slice(slice); 16 } 17 18 pub fn next_line(&mut self) -> Option<Vec<u8>> { 19 let line_end = self.buffer.iter().position(|x| *x == b'\n')?; 20 21 let drained = self.buffer.drain(..line_end).collect(); 22 self.buffer.remove(0); 23 Some(drained) 24 } 25 26 #[cfg(test)] 27 fn take_lines(&mut self) -> Vec<Vec<u8>> { 28 let mut lines = vec![]; 29 30 while let Some(line) = self.next_line() { 31 lines.push(line); 32 } 33 34 lines 35 } 36} 37 38#[cfg(test)] 39mod tests { 40 use super::*; 41 42 #[test] 43 fn test_split_line_processing() { 44 let mut log_buffer = LogBuffer::new(); 45 46 log_buffer.process_slice(b"Writing key KeySpec { destination: \"/et"); 47 log_buffer.process_slice(b"c/keys/buildbot.aws.key\", user: \"buildbot\", group: \"buildbot-worker\", permissions: 384, length: 32, last: false, crc: 1370815231 }, 32 bytes of data"); 48 log_buffer.process_slice(b"\n"); 49 log_buffer.process_slice(b"xxx"); 50 log_buffer.process_slice(b"xx_WIRE"); 51 log_buffer.process_slice(b"_QUIT\n"); 52 let lines = log_buffer.take_lines(); 53 assert_eq!(lines.len(), 2); 54 assert_eq!( 55 String::from_utf8_lossy(lines.first().unwrap()), 56 "Writing key KeySpec { destination: \"/etc/keys/buildbot.aws.key\", user: \"buildbot\", group: \"buildbot-worker\", permissions: 384, length: 32, last: false, crc: 1370815231 }, 32 bytes of data" 57 ); 58 assert_eq!(lines.get(1), Some(&"xxxxx_WIRE_QUIT".as_bytes().to_vec())); 59 60 // taking leaves none 61 assert_eq!(log_buffer.take_lines().len(), 0); 62 } 63}