agate

Simple gemini server for static files
git clone https://github.com/mbrubeck/agate.git
Log | Files | Refs | README

commit 8b4692b08b6ae1658502baedec12d406da5ab390
parent 1059f8b94a8951975f6a9f8c11571081cd281a97
Author: Johann150 <johann.galle@protonmail.com>
Date:   Thu, 25 Feb 2021 17:30:12 +0100

use RAII guard in tests

Diffstat:
Mtests/tests.rs | 90++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 55 insertions(+), 35 deletions(-)

diff --git a/tests/tests.rs b/tests/tests.rs @@ -16,48 +16,68 @@ fn addr(port: u16) -> SocketAddr { .unwrap() } +struct Server { + server: std::process::Child, + buf: u8, +} + +impl Server { + pub fn new(args: &[&str]) -> Self { + // start the server + let mut server = Command::new(BINARY_PATH) + .stderr(Stdio::piped()) + .current_dir(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/data")) + .args(args) + .spawn() + .expect("failed to start binary"); + + // the first output is when Agate is listening, so we only have to wait + // until the first byte is output + let mut buffer = [0; 1]; + server + .stderr + .as_mut() + .unwrap() + .read_exact(&mut buffer) + .unwrap(); + + Self { + server, + buf: buffer[0], + } + } +} + +impl Drop for Server { + fn drop(&mut self) { + // try to stop the server again + match self.server.try_wait() { + Err(e) => panic!("cannot access orchestrated program: {:?}", e), + // everything fine, still running as expected, kill it now + Ok(None) => self.server.kill().unwrap(), + Ok(Some(_)) => { + // forward stderr so we have a chance to understand the problem + let buffer = std::iter::once(Ok(self.buf)) + .chain(self.server.stderr.take().unwrap().bytes()) + .collect::<Result<Vec<u8>, _>>() + .unwrap(); + + eprintln!("{}", String::from_utf8_lossy(&buffer)); + // make the test fail + panic!("program had crashed"); + } + } + } +} + fn get(args: &[&str], addr: SocketAddr, url: &str) -> Result<Page, anyhow::Error> { - // start the server - let mut server = Command::new(BINARY_PATH) - .stderr(Stdio::piped()) - .current_dir(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/data")) - .args(args) - .spawn() - .expect("failed to start binary"); - - // the first output is when Agate is listening, so we only have to wait - // until the first byte is output - let mut buffer = [0; 1]; - server - .stderr - .as_mut() - .unwrap() - .read_exact(&mut buffer) - .unwrap(); + let _server = Server::new(args); // actually perform the request let page = tokio::runtime::Runtime::new() .unwrap() .block_on(async { Page::fetch_from(&Url::parse(url).unwrap(), addr, None).await }); - // try to stop the server again - match server.try_wait() { - Err(e) => panic!("cannot access orchestrated program: {:?}", e), - // everything fine, still running as expected, kill it now - Ok(None) => server.kill().unwrap(), - Ok(Some(_)) => { - // forward stderr so we have a chance to understand the problem - let buffer = std::iter::once(Ok(buffer[0])) - .chain(server.stderr.take().unwrap().bytes()) - .collect::<Result<Vec<u8>, _>>() - .unwrap(); - - eprintln!("{}", String::from_utf8_lossy(&buffer)); - // make the test fail - panic!("program had crashed"); - } - } - page }