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:
Lucio Franco 2019-12-02 19:14:15 -05:00 committed by GitHub
parent 45e311c2f2
commit ec6215fb2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 74 additions and 55 deletions

View File

@ -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",
]

View File

@ -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`

View File

@ -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"

View File

@ -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> {

View File

@ -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>

View File

@ -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`

View File

@ -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"

View File

@ -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,

View File

@ -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");

View File

@ -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,

View File

@ -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)))
}

View File

@ -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()
}

View File

@ -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`

View File

@ -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"

View File

@ -7,7 +7,7 @@ use std::{
pin::Pin,
task::{Context, Poll},
};
use tokio_timer::Delay;
use tokio::time::Delay;
/// `Timeout` response future
#[pin_project]

View File

@ -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)
}