use crate::Error;
use super::super::SendResponseResult;
use super::scenario::Scenario;
#[test]
fn write_response() {
let scenario = Scenario::builder().get("/path").build();
let mut reply = scenario.to_send_response();
let mut output = [0u8; 1024];
let bytes_written = reply.write(&mut output).unwrap();
assert!(bytes_written > 0);
let response_str = std::str::from_utf8(&output[..bytes_written]).unwrap();
assert!(response_str.starts_with("HTTP/1.1 200 OK\r\n"));
}
#[test]
fn short_buffer() {
let scenario = Scenario::builder()
.get("/path")
.header("header1", "value1")
.header("header2", "value2")
.header("header3", "value3")
.header("header4", "value4")
.header("header5", "value5")
.build();
let mut reply = scenario.to_send_response();
let mut output = [0u8; 20];
let bytes_written = reply.write(&mut output).unwrap();
assert!(bytes_written > 0);
assert!(bytes_written <= 20);
assert!(!reply.is_finished());
let mut output2 = [0u8; 1024];
let bytes_written2 = reply.write(&mut output2).unwrap();
assert!(bytes_written2 > 0);
while !reply.is_finished() {
let mut output3 = [0u8; 1024];
let _ = reply.write(&mut output3).unwrap();
}
assert!(reply.is_finished());
}
#[test]
fn proceed_to_send_body() {
let scenario = Scenario::builder()
.get("/path")
.header("content-type", "text/plain")
.build();
let mut reply = scenario.to_send_response();
let mut output = [0u8; 1024];
while !reply.is_finished() {
let _ = reply.write(&mut output).unwrap();
}
match reply.proceed() {
SendResponseResult::SendBody(_) => {}
SendResponseResult::Cleanup(_) => panic!("Expected SendBody variant"),
}
}
#[test]
fn proceed_to_cleanup() {
let scenario = Scenario::builder()
.head("/path")
.header("content-type", "text/plain")
.build();
let mut reply = scenario.to_send_response();
let mut output = [0u8; 1024];
while !reply.is_finished() {
let _ = reply.write(&mut output).unwrap();
}
match reply.proceed() {
SendResponseResult::Cleanup(_) => {}
SendResponseResult::SendBody(_) => panic!("Expected Cleanup variant"),
}
}
#[test]
#[should_panic]
fn proceed_before_finished_panics() {
let scenario = Scenario::builder()
.get("/path")
.header("header1", "value1")
.header("header2", "value2")
.header("header3", "value3")
.header("header4", "value4")
.header("header5", "value5")
.build();
let mut reply = scenario.to_send_response();
let mut output = [0u8; 20];
let _ = reply.write(&mut output).unwrap();
assert!(!reply.is_finished());
let _ = reply.proceed();
}
#[test]
fn buffer_overflow() {
let scenario = Scenario::builder()
.get("/path")
.header("header1", "value1")
.header("header2", "value2")
.header("header3", "value3")
.header("header4", "value4")
.header("header5", "value5")
.build();
let mut reply = scenario.to_send_response();
let mut output = [0u8; 0];
let result = reply.write(&mut output);
assert!(result.is_err());
match result.unwrap_err() {
Error::OutputOverflow => {}
_ => panic!("Expected OutputOverflow error"),
}
}