Update timeout, tower-test and reconnect (#373)
* Update timeout and prepare 0.3 * Update tower-test and prepare release * Update lib doc path * Update reconnect and prepare for release
This commit is contained in:
parent
45e311c2f2
commit
ec6215fb2f
|
@ -12,12 +12,12 @@ members = [
|
|||
# "tower-load",
|
||||
# "tower-load-shed",
|
||||
# "tower-ready-cache",
|
||||
# "tower-reconnect",
|
||||
"tower-reconnect",
|
||||
# "tower-retry",
|
||||
"tower-service",
|
||||
# "tower-spawn-ready",
|
||||
# "tower-test",
|
||||
# "tower-timeout",
|
||||
"tower-test",
|
||||
"tower-timeout",
|
||||
"tower-make",
|
||||
# "tower-util",
|
||||
]
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
# 0.3.0 (December 1, 2019)
|
||||
|
||||
- Update to `tower-service 0.3`
|
||||
|
||||
# 0.3.0-alpha.2 (September 30, 2019)
|
||||
|
||||
- Move to `futures-*-preview 0.3.0-alpha.19`
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "tower-reconnect"
|
|||
# - README.md
|
||||
# - Update CHANGELOG.md.
|
||||
# - Create "v0.1.x" git tag.
|
||||
version = "0.3.0-alpha.2"
|
||||
version = "0.3.0"
|
||||
authors = ["Tower Maintainers <team@tower-rs.com>"]
|
||||
license = "MIT"
|
||||
readme = "README.md"
|
||||
|
@ -23,6 +23,6 @@ edition = "2018"
|
|||
|
||||
[dependencies]
|
||||
log = "0.4.1"
|
||||
tower-service = { version = "=0.3.0-alpha.2", path = "../tower-service" }
|
||||
tower-make = { version = "=0.3.0-alpha.2a", path = "../tower-make" }
|
||||
tower-service = { version = "0.3", path = "../tower-service" }
|
||||
tower-make = { version = "0.3", path = "../tower-make" }
|
||||
pin-project = "0.4"
|
||||
|
|
|
@ -6,6 +6,7 @@ use std::{
|
|||
task::{Context, Poll},
|
||||
};
|
||||
|
||||
/// Future that resolves to the response or failure to connect.
|
||||
#[pin_project]
|
||||
#[derive(Debug)]
|
||||
pub struct ResponseFuture<F> {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#![doc(html_root_url = "https://docs.rs/tower-reconnect/0.3.0-alpha.2")]
|
||||
#![doc(html_root_url = "https://docs.rs/tower-reconnect/0.3.0")]
|
||||
#![warn(missing_debug_implementations, rust_2018_idioms, unreachable_pub)]
|
||||
#![allow(missing_docs)] // TODO
|
||||
#![allow(elided_lifetimes_in_paths)]
|
||||
|
@ -16,6 +16,7 @@ use std::{
|
|||
use tower_make::MakeService;
|
||||
use tower_service::Service;
|
||||
|
||||
/// Reconnect to failed services.
|
||||
pub struct Reconnect<M, Target>
|
||||
where
|
||||
M: Service<Target>,
|
||||
|
@ -38,6 +39,7 @@ impl<M, Target> Reconnect<M, Target>
|
|||
where
|
||||
M: Service<Target>,
|
||||
{
|
||||
/// Lazily connect and reconnect to a Service.
|
||||
pub fn new<S, Request>(mk_service: M, target: Target) -> Self
|
||||
where
|
||||
M: Service<Target, Response = S>,
|
||||
|
@ -51,6 +53,15 @@ where
|
|||
target,
|
||||
}
|
||||
}
|
||||
|
||||
/// Reconnect to a already connected Service.
|
||||
pub fn with_connection(init_conn: M::Response, mk_service: M, target: Target) -> Self {
|
||||
Reconnect {
|
||||
mk_service,
|
||||
state: State::Connected(init_conn),
|
||||
target,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<M, Target, S, Request> Service<Request> for Reconnect<M, Target>
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
# 0.3.0 (December 1, 2019)
|
||||
|
||||
- Remove `futures-executor` dependency
|
||||
- Update to non-alpha versions
|
||||
- Add `mock::task_fn` util fn
|
||||
|
||||
# 0.3.0-alpha.2 (September 30, 2019)
|
||||
|
||||
- Move to `futures-*-preview 0.3.0-alpha.19`
|
||||
|
|
|
@ -8,7 +8,7 @@ name = "tower-test"
|
|||
# - README.md
|
||||
# - Update CHANGELOG.md.
|
||||
# - Create "v0.1.x" git tag.
|
||||
version = "0.3.0-alpha.2"
|
||||
version = "0.3.0"
|
||||
authors = ["Tower Maintainers <team@tower-rs.com>"]
|
||||
license = "MIT"
|
||||
readme = "README.md"
|
||||
|
@ -22,9 +22,8 @@ categories = ["asynchronous", "network-programming"]
|
|||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
futures-util-preview = "=0.3.0-alpha.19"
|
||||
futures-executor-preview = "=0.3.0-alpha.19"
|
||||
tokio-test = "=0.2.0-alpha.6"
|
||||
tokio-sync = "=0.2.0-alpha.6"
|
||||
tower-service = { version = "=0.3.0-alpha.2", path = "../tower-service" }
|
||||
futures-util = "0.3"
|
||||
tokio = { version = "0.2", features = ["sync"]}
|
||||
tokio-test = "0.2"
|
||||
tower-service = { version = "0.3", path = "../tower-service" }
|
||||
pin-project = "0.4"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#![doc(html_root_url = "https://docs.rs/tower-test/0.3.0-alpha.2")]
|
||||
#![doc(html_root_url = "https://docs.rs/tower-test/0.3.0")]
|
||||
#![warn(
|
||||
missing_debug_implementations,
|
||||
missing_docs,
|
||||
|
|
|
@ -14,15 +14,11 @@
|
|||
/// use tower_service::Service;
|
||||
/// use tower_test::mock;
|
||||
/// use std::task::{Poll, Context};
|
||||
/// use tokio_test::{task, assert_ready};
|
||||
/// use tokio_test::assert_ready;
|
||||
/// use futures_util::pin_mut;
|
||||
///
|
||||
/// # fn main() {
|
||||
/// task::mock(|cx|{
|
||||
/// let (mut mock, mut handle) = mock::pair();
|
||||
/// pin_mut!(mock);
|
||||
/// pin_mut!(handle);
|
||||
///
|
||||
/// mock::task_fn(|cx, mock, handle|{
|
||||
/// assert_ready!(mock.poll_ready(cx));
|
||||
///
|
||||
/// let _response = mock.call("hello");
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
use crate::mock::error::{self, Error};
|
||||
use futures_util::ready;
|
||||
use pin_project::pin_project;
|
||||
use tokio_sync::oneshot;
|
||||
use tokio::sync::oneshot;
|
||||
|
||||
use std::{
|
||||
future::Future,
|
||||
|
|
|
@ -6,7 +6,7 @@ pub mod future;
|
|||
use crate::mock::{error::Error, future::ResponseFuture};
|
||||
use core::task::Waker;
|
||||
|
||||
use tokio_sync::{mpsc, oneshot};
|
||||
use tokio::sync::{mpsc, oneshot};
|
||||
use tower_service::Service;
|
||||
|
||||
use std::{
|
||||
|
@ -18,6 +18,21 @@ use std::{
|
|||
u64,
|
||||
};
|
||||
|
||||
/// Mock a task and Service.
|
||||
pub fn task_fn<T, U, F>(mut f: F)
|
||||
where
|
||||
F: FnMut(&mut Context, &mut Pin<&mut Mock<T, U>>, &mut Pin<&mut Handle<T, U>>),
|
||||
{
|
||||
tokio_test::task::spawn(()).enter(|cx, _| {
|
||||
let (mock, handle) = pair();
|
||||
|
||||
futures_util::pin_mut!(mock);
|
||||
futures_util::pin_mut!(handle);
|
||||
|
||||
f(cx, &mut mock, &mut handle)
|
||||
})
|
||||
}
|
||||
|
||||
/// A mock service
|
||||
#[derive(Debug)]
|
||||
pub struct Mock<T, U> {
|
||||
|
@ -142,7 +157,7 @@ impl<T, U> Service<T> for Mock<T, U> {
|
|||
let (tx, rx) = oneshot::channel();
|
||||
let send_response = SendResponse { tx };
|
||||
|
||||
match self.tx.lock().unwrap().try_send((request, send_response)) {
|
||||
match self.tx.lock().unwrap().send((request, send_response)) {
|
||||
Ok(_) => {}
|
||||
Err(_) => {
|
||||
// TODO: Can this be reached
|
||||
|
@ -208,8 +223,8 @@ impl<T, U> Handle<T, U> {
|
|||
///
|
||||
/// This function blocks the current thread until a request is received.
|
||||
pub fn next_request(mut self: Pin<&mut Self>) -> Option<Request<T, U>> {
|
||||
use futures_executor::block_on;
|
||||
use futures_util::future::poll_fn;
|
||||
use tokio_test::block_on;
|
||||
|
||||
block_on(poll_fn(|cx| self.as_mut().poll_request(cx)))
|
||||
}
|
||||
|
|
|
@ -1,17 +1,12 @@
|
|||
use futures_executor::block_on;
|
||||
use futures_util::pin_mut;
|
||||
use std::future::Future;
|
||||
use tokio_test::{assert_pending, assert_ready, task};
|
||||
use tokio_test::{assert_pending, assert_ready};
|
||||
use tower_service::Service;
|
||||
use tower_test::{assert_request_eq, mock};
|
||||
|
||||
#[test]
|
||||
fn single_request_ready() {
|
||||
task::mock(|cx| {
|
||||
let (mock, handle) = new_mock();
|
||||
pin_mut!(mock);
|
||||
pin_mut!(handle);
|
||||
|
||||
mock::task_fn::<String, String, _>(|cx, mock, handle| {
|
||||
// No pending requests
|
||||
assert!(handle.as_mut().poll_request(cx).is_pending());
|
||||
|
||||
|
@ -30,16 +25,14 @@ fn single_request_ready() {
|
|||
// Send the response
|
||||
send_response.send_response("yes?".into());
|
||||
|
||||
assert_eq!(block_on(response).unwrap().as_str(), "yes?");
|
||||
assert_eq!(tokio_test::block_on(response).unwrap().as_str(), "yes?");
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn backpressure() {
|
||||
task::mock(|cx| {
|
||||
let (mut mock, mut handle) = new_mock();
|
||||
|
||||
mock::task_fn::<String, String, _>(|cx, mock, handle| {
|
||||
handle.allow(0);
|
||||
|
||||
// Make sure the mock cannot accept more requests
|
||||
|
@ -49,10 +42,3 @@ fn backpressure() {
|
|||
mock.call("hello?".into());
|
||||
});
|
||||
}
|
||||
|
||||
type Mock = mock::Mock<String, String>;
|
||||
type Handle = mock::Handle<String, String>;
|
||||
|
||||
fn new_mock() -> (Mock, Handle) {
|
||||
mock::pair()
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
# 0.3.0 (December 1, 2019)
|
||||
|
||||
- Update to `tower-service 0.3`
|
||||
|
||||
# 0.3.0-alpha.2 (September 30, 2019)
|
||||
|
||||
- Move to `futures-*-preview 0.3.0-alpha.19`
|
||||
|
|
|
@ -7,14 +7,14 @@ name = "tower-timeout"
|
|||
# - Cargo.toml
|
||||
# - README.md
|
||||
# - Update CHANGELOG.md.
|
||||
# - Create "v0.1.x" git tag.
|
||||
version = "0.3.0-alpha.2"
|
||||
# - Create "v0.3.x" git tag.
|
||||
version = "0.3.0"
|
||||
authors = ["Tower Maintainers <team@tower-rs.com>"]
|
||||
license = "MIT"
|
||||
readme = "README.md"
|
||||
repository = "https://github.com/tower-rs/tower"
|
||||
homepage = "https://github.com/tower-rs/tower"
|
||||
documentation = "https://docs.rs/tower-timeout/0.3.0-alpha.2"
|
||||
documentation = "https://docs.rs/tower-timeout/0.3.0"
|
||||
description = """
|
||||
Apply a timeout to requests, ensuring completion within a fixed time duration.
|
||||
"""
|
||||
|
@ -22,7 +22,7 @@ categories = ["asynchronous", "network-programming"]
|
|||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
tower-service = { version = "=0.3.0-alpha.2", path = "../tower-service" }
|
||||
tower-layer = { version = "=0.3.0-alpha.2", path = "../tower-layer" }
|
||||
tokio-timer = "=0.3.0-alpha.6"
|
||||
tower-service = { version = "0.3", path = "../tower-service" }
|
||||
tower-layer = { version = "0.3", path = "../tower-layer" }
|
||||
tokio = { version = "0.2", features = ["time"] }
|
||||
pin-project = "0.4"
|
||||
|
|
|
@ -7,7 +7,7 @@ use std::{
|
|||
pin::Pin,
|
||||
task::{Context, Poll},
|
||||
};
|
||||
use tokio_timer::Delay;
|
||||
use tokio::time::Delay;
|
||||
|
||||
/// `Timeout` response future
|
||||
#[pin_project]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#![doc(html_root_url = "https://docs.rs/tower-timeout/0.3.0-alpha.2")]
|
||||
#![doc(html_root_url = "https://docs.rs/tower-timeout/0.3.0")]
|
||||
#![warn(
|
||||
missing_debug_implementations,
|
||||
missing_docs,
|
||||
|
@ -19,11 +19,8 @@ pub use crate::layer::TimeoutLayer;
|
|||
|
||||
use crate::{error::Error, future::ResponseFuture};
|
||||
use std::task::{Context, Poll};
|
||||
use tokio_timer::{clock, delay};
|
||||
|
||||
use tower_service::Service;
|
||||
|
||||
use std::time::Duration;
|
||||
use tower_service::Service;
|
||||
|
||||
/// Applies a timeout to requests.
|
||||
#[derive(Debug, Clone)]
|
||||
|
@ -59,7 +56,7 @@ where
|
|||
|
||||
fn call(&mut self, request: Request) -> Self::Future {
|
||||
let response = self.inner.call(request);
|
||||
let sleep = delay(clock::now() + self.timeout);
|
||||
let sleep = tokio::time::delay_for(self.timeout);
|
||||
|
||||
ResponseFuture::new(response, sleep)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue