Add a Transcript Service for testing.

This commit is contained in:
Henry de Valence 2020-06-22 21:00:20 -07:00
parent a9efb8715e
commit 5c9cd52baf
5 changed files with 102 additions and 0 deletions

4
Cargo.lock generated
View File

@ -2403,8 +2403,12 @@ dependencies = [
name = "zebra-test"
version = "0.1.0"
dependencies = [
"color-eyre",
"futures",
"hex",
"lazy_static",
"tokio",
"tower",
]
[[package]]

View File

@ -10,3 +10,9 @@ edition = "2018"
[dependencies]
hex = "0.4.2"
lazy_static = "1.4.0"
tower = "0.3.1"
futures = "0.3.5"
color-eyre = "0.5"
[dev-dependencies]
tokio = { version = "0.2", features = ["full"] }

View File

@ -1 +1,4 @@
//! Miscellaneous test code for Zebra.
pub mod transcript;
pub mod vectors;

View File

@ -0,0 +1,55 @@
//! A [`Service`](tower::Service) implementation based on a fixed transcript.
use color_eyre::eyre::{eyre, Report};
use futures::future::{ready, Ready};
use std::{
fmt::Debug,
task::{Context, Poll},
};
use tower::Service;
pub struct Transcript<R, S, I>
where
I: Iterator<Item = (R, S)>,
{
messages: I,
}
impl<R, S, I> From<I> for Transcript<R, S, I>
where
I: Iterator<Item = (R, S)>,
{
fn from(messages: I) -> Self {
Self { messages }
}
}
impl<R, S, I> Service<R> for Transcript<R, S, I>
where
R: Debug + Eq,
I: Iterator<Item = (R, S)>,
{
type Response = S;
type Error = Report;
type Future = Ready<Result<S, Report>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&mut self, request: R) -> Self::Future {
if let Some((expected_request, response)) = self.messages.next() {
if request == expected_request {
ready(Ok(response))
} else {
ready(Err(eyre!(
"Expected {:?}, got {:?}",
expected_request,
request
)))
}
} else {
ready(Err(eyre!("Got request after transcript ended")))
}
}
}

View File

@ -0,0 +1,34 @@
use tower::{Service, ServiceExt};
use zebra_test::transcript::Transcript;
const TRANSCRIPT_DATA: [(&'static str, &'static str); 4] = [
("req1", "rsp1"),
("req2", "rsp2"),
("req3", "rsp3"),
("req4", "rsp4"),
];
#[tokio::test]
async fn transcript_returns_responses_and_ends() {
let mut svc = Transcript::from(TRANSCRIPT_DATA.iter().cloned());
for (req, rsp) in TRANSCRIPT_DATA.iter() {
assert_eq!(
svc.ready_and().await.unwrap().call(req).await.unwrap(),
*rsp,
);
}
assert!(svc.ready_and().await.unwrap().call("end").await.is_err());
}
#[tokio::test]
async fn transcript_errors_wrong_request() {
let mut svc = Transcript::from(TRANSCRIPT_DATA.iter().cloned());
assert_eq!(
svc.ready_and().await.unwrap().call("req1").await.unwrap(),
"rsp1",
);
assert!(svc.ready_and().await.unwrap().call("bad").await.is_err());
}