mirror of https://github.com/linkerd/linkerd2.git
Add unit tests for Labeled middleware (#738)
I've added unit tests for the `Labeled` middleware used to add Destination labels in the proxy, as @olix0r requested in https://github.com/runconduit/conduit/pull/661#discussion_r179897783. Signed-off-by: Eliza Weisman <eliza@buoyant.io>
This commit is contained in:
parent
61d15a6c3e
commit
b6180d8bfe
|
@ -282,3 +282,87 @@ impl fmt::Display for DstLabels {
|
||||||
write!(f, "{}", self.0)
|
write!(f, "{}", self.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
use futures::{Async, Poll, Future};
|
||||||
|
use futures::future::{self, FutureResult};
|
||||||
|
use http;
|
||||||
|
use tower::Service;
|
||||||
|
|
||||||
|
|
||||||
|
struct MockInnerService;
|
||||||
|
|
||||||
|
impl Service for MockInnerService {
|
||||||
|
type Request = http::Request<()>;
|
||||||
|
type Response = Option<String>;
|
||||||
|
type Error = ();
|
||||||
|
type Future = FutureResult<Self::Response, Self::Error>;
|
||||||
|
|
||||||
|
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
|
||||||
|
Ok(Async::Ready(()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn call(&mut self, req: Self::Request) -> Self::Future {
|
||||||
|
future::ok(req.extensions()
|
||||||
|
.get::<DstLabels>()
|
||||||
|
.map(|&DstLabels(ref inner)| inner.as_ref().to_string()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn no_labels() {
|
||||||
|
let mut labeled = Labeled {
|
||||||
|
metric_labels: None,
|
||||||
|
inner: MockInnerService,
|
||||||
|
};
|
||||||
|
let labels = labeled.call(http::Request::new(()))
|
||||||
|
.wait().expect("call");
|
||||||
|
assert_eq!(None, labels);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn one_label() {
|
||||||
|
let (watch, _) =
|
||||||
|
Watch::new(DstLabels::new(vec![("foo", "bar")]));
|
||||||
|
let mut labeled = Labeled {
|
||||||
|
metric_labels: Some(watch),
|
||||||
|
inner: MockInnerService,
|
||||||
|
};
|
||||||
|
let labels = labeled.call(http::Request::new(()))
|
||||||
|
.wait().expect("call");
|
||||||
|
assert_eq!(Some("dst_foo=\"bar\"".to_string()), labels);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn label_updates() {
|
||||||
|
let (watch, mut store) =
|
||||||
|
Watch::new(DstLabels::new(vec![("foo", "bar")]));
|
||||||
|
let mut labeled = Labeled {
|
||||||
|
metric_labels: Some(watch),
|
||||||
|
inner: MockInnerService,
|
||||||
|
};
|
||||||
|
|
||||||
|
let labels = labeled.call(http::Request::new(()))
|
||||||
|
.wait().expect("first call");
|
||||||
|
assert_eq!(Some("dst_foo=\"bar\"".to_string()), labels);
|
||||||
|
|
||||||
|
store.store(DstLabels::new(vec![("foo", "baz")]))
|
||||||
|
.expect("store (\"foo\", \"baz\")");
|
||||||
|
let labels = labeled.call(http::Request::new(()))
|
||||||
|
.wait().expect("second call");
|
||||||
|
assert_eq!(Some("dst_foo=\"baz\"".to_string()), labels);
|
||||||
|
|
||||||
|
store.store(DstLabels::new(vec![
|
||||||
|
("foo", "baz"),
|
||||||
|
("quux", "quuux")
|
||||||
|
]))
|
||||||
|
.expect("store (\"foo\", \"baz\"), (\"quux\", \"quuux\")");
|
||||||
|
let labels = labeled.call(http::Request::new(()))
|
||||||
|
.wait().expect("third call");
|
||||||
|
assert_eq!(Some("dst_foo=\"baz\",dst_quux=\"quuux\"".to_string()), labels);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue