simple test harness

This commit is contained in:
Martin Algesten
2018-06-11 21:17:12 +02:00
parent 147a750aaf
commit d548b3ef4f
7 changed files with 101 additions and 4 deletions

52
src/test/mod.rs Normal file
View File

@@ -0,0 +1,52 @@
use agent::Request;
use error::Error;
use header::Header;
use std::collections::HashMap;
use std::io::Write;
use std::sync::{Arc, Mutex};
use stream::Stream;
use url::Url;
use util::vecread::VecRead;
mod simple;
type RequestHandler = Fn(&Request, &Url) -> Result<Stream, Error> + Send + 'static;
lazy_static! {
pub static ref TEST_HANDLERS: Arc<Mutex<HashMap<String, Box<RequestHandler>>>> =
{ Arc::new(Mutex::new(HashMap::new())) };
}
pub fn set_handler<H>(path: &str, handler: H)
where
H: Fn(&Request, &Url) -> Result<Stream, Error> + Send + 'static,
{
let mut handlers = TEST_HANDLERS.lock().unwrap();
handlers.insert(path.to_string(), Box::new(handler));
}
pub fn make_stream(
status: u16,
status_text: &str,
headers: Vec<&str>,
mut body: Vec<u8>,
) -> Result<Stream, Error> {
let mut buf: Vec<u8> = vec![];
write!(&mut buf, "HTTP/1.1 {} {}\r\n", status, status_text).ok();
for hstr in headers.iter() {
let header = hstr.parse::<Header>().unwrap();
write!(&mut buf, "{}: {}\r\n", header.name(), header.value()).ok();
}
write!(&mut buf, "\r\n").ok();
buf.append(&mut body);
let read = VecRead::from_vec(buf);
let write: Vec<u8> = vec![];
Ok(Stream::Test(Box::new(read), Box::new(write)))
}
pub fn resolve_handler(req: &Request, url: &Url) -> Result<Stream, Error> {
let mut handlers = TEST_HANDLERS.lock().unwrap();
let path = url.path();
let handler = handlers.remove(path).unwrap();
handler(req, url)
}

25
src/test/simple.rs Normal file
View File

@@ -0,0 +1,25 @@
use super::super::*;
use test;
#[test]
fn header_passing() {
test::set_handler("/header_passing", |req, _url| {
assert!(req.has("X-Foo"));
assert_eq!(req.get("X-Foo").unwrap(), "bar");
test::make_stream(200, "OK", vec!["X-Bar: foo"], vec![])
});
let resp = get("test://host/header_passing").set("X-Foo", "bar").call();
assert_eq!(*resp.status(), 200);
assert!(resp.has("X-Bar"));
assert_eq!(resp.get("X-Bar").unwrap(), "foo");
}
#[test]
fn body_as_text() {
test::set_handler("/body_as_text", |_req, _url| {
test::make_stream(200, "OK", vec![], "Hello World!".to_string().into_bytes())
});
let resp = get("test://host/body_as_text").call();
let text = resp.into_string().unwrap();
assert_eq!(text, "Hello World!");
}