mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-01 00:00:10 +02:00
buf: impl size_hint for str types + reorg tests (#1012)
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
use never::Never;
|
use never::Never;
|
||||||
use BufStream;
|
use BufStream;
|
||||||
|
use SizeHint;
|
||||||
|
|
||||||
use futures::Poll;
|
use futures::Poll;
|
||||||
|
|
||||||
@@ -20,6 +21,10 @@ impl BufStream for String {
|
|||||||
|
|
||||||
Ok(Some(buf).into())
|
Ok(Some(buf).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn size_hint(&self) -> SizeHint {
|
||||||
|
size_hint(&self[..])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BufStream for &'static str {
|
impl BufStream for &'static str {
|
||||||
@@ -36,4 +41,15 @@ impl BufStream for &'static str {
|
|||||||
|
|
||||||
Ok(Some(buf).into())
|
Ok(Some(buf).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn size_hint(&self) -> SizeHint {
|
||||||
|
size_hint(&self[..])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn size_hint(s: &str) -> SizeHint {
|
||||||
|
let mut hint = SizeHint::new();
|
||||||
|
hint.set_lower(s.len() as u64);
|
||||||
|
hint.set_upper(s.len() as u64);
|
||||||
|
hint
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,66 +1,7 @@
|
|||||||
extern crate bytes;
|
|
||||||
extern crate futures;
|
|
||||||
extern crate tokio_buf;
|
extern crate tokio_buf;
|
||||||
|
|
||||||
use bytes::Buf;
|
use tokio_buf::BufStream;
|
||||||
use futures::Async::*;
|
|
||||||
use tokio_buf::{BufStream, SizeHint};
|
|
||||||
|
|
||||||
#[macro_use]
|
// Ensures that `BufStream` can be a trait object
|
||||||
mod support;
|
#[allow(dead_code)]
|
||||||
|
fn obj(_: &mut BufStream<Item = u32, Error = ()>) {}
|
||||||
// ===== test `SizeHint` =====
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn size_hint() {
|
|
||||||
let hint = SizeHint::new();
|
|
||||||
assert_eq!(hint.lower(), 0);
|
|
||||||
assert!(hint.upper().is_none());
|
|
||||||
|
|
||||||
let mut hint = SizeHint::new();
|
|
||||||
hint.set_lower(100);
|
|
||||||
assert_eq!(hint.lower(), 100);
|
|
||||||
assert!(hint.upper().is_none());
|
|
||||||
|
|
||||||
let mut hint = SizeHint::new();
|
|
||||||
hint.set_upper(200);
|
|
||||||
assert_eq!(hint.lower(), 0);
|
|
||||||
assert_eq!(hint.upper(), Some(200));
|
|
||||||
|
|
||||||
let mut hint = SizeHint::new();
|
|
||||||
hint.set_lower(100);
|
|
||||||
hint.set_upper(100);
|
|
||||||
assert_eq!(hint.lower(), 100);
|
|
||||||
assert_eq!(hint.upper(), Some(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[should_panic]
|
|
||||||
fn size_hint_lower_bigger_than_upper() {
|
|
||||||
let mut hint = SizeHint::new();
|
|
||||||
hint.set_upper(100);
|
|
||||||
hint.set_lower(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[should_panic]
|
|
||||||
fn size_hint_upper_less_than_lower() {
|
|
||||||
let mut hint = SizeHint::new();
|
|
||||||
hint.set_lower(200);
|
|
||||||
hint.set_upper(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===== BufStream impelmentations for misc types =====
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn str_buf_stream() {
|
|
||||||
let mut bs = "hello world".to_string();
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "hello world");
|
|
||||||
assert!(bs.is_empty());
|
|
||||||
assert_none!(bs.poll_buf());
|
|
||||||
|
|
||||||
let mut bs = "hello world";
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "hello world");
|
|
||||||
assert!(bs.is_empty());
|
|
||||||
assert_none!(bs.poll_buf());
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,156 +0,0 @@
|
|||||||
#![cfg(feature = "util")]
|
|
||||||
|
|
||||||
extern crate bytes;
|
|
||||||
extern crate futures;
|
|
||||||
extern crate tokio_buf;
|
|
||||||
|
|
||||||
use bytes::{Buf, Bytes};
|
|
||||||
use futures::Async::*;
|
|
||||||
use futures::Future;
|
|
||||||
use tokio_buf::{BufStream, BufStreamExt};
|
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
mod support;
|
|
||||||
|
|
||||||
use support::*;
|
|
||||||
|
|
||||||
// ===== test `chain()` =====
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn chain() {
|
|
||||||
// Chain one with one
|
|
||||||
//
|
|
||||||
let mut bs = one("hello").chain(one("world"));
|
|
||||||
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "hello");
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "world");
|
|
||||||
assert_none!(bs.poll_buf());
|
|
||||||
|
|
||||||
// Chain multi with multi
|
|
||||||
let mut bs = list(&["foo", "bar"]).chain(list(&["baz", "bok"]));
|
|
||||||
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "foo");
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "bar");
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "baz");
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "bok");
|
|
||||||
assert_none!(bs.poll_buf());
|
|
||||||
|
|
||||||
// Chain includes a not ready call
|
|
||||||
//
|
|
||||||
let mut bs = new_mock(&[Ok(Ready("foo")), Ok(NotReady), Ok(Ready("bar"))]).chain(one("baz"));
|
|
||||||
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "foo");
|
|
||||||
assert_not_ready!(bs.poll_buf());
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "bar");
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "baz");
|
|
||||||
assert_none!(bs.poll_buf());
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===== Test `collect()` =====
|
|
||||||
|
|
||||||
macro_rules! test_collect_impl {
|
|
||||||
($t:ty $(, $capacity:ident)*) => {
|
|
||||||
// While unfortunate, this test makes some assumptions on vec's resizing
|
|
||||||
// behavior.
|
|
||||||
//
|
|
||||||
// Collect one
|
|
||||||
//
|
|
||||||
let bs = one("hello world");
|
|
||||||
|
|
||||||
let vec: $t = bs.collect().wait().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(vec, &b"hello world"[..]);
|
|
||||||
$( assert_eq!(vec.$capacity(), 64); )*
|
|
||||||
|
|
||||||
// Collect one, with size hint
|
|
||||||
//
|
|
||||||
let mut bs = one("hello world");
|
|
||||||
bs.size_hint.set_lower(11);
|
|
||||||
|
|
||||||
let vec: $t = bs.collect().wait().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(vec, &b"hello world"[..]);
|
|
||||||
$( assert_eq!(vec.$capacity(), 64); )*
|
|
||||||
|
|
||||||
// Collect one, with size hint
|
|
||||||
//
|
|
||||||
let mut bs = one("hello world");
|
|
||||||
bs.size_hint.set_lower(10);
|
|
||||||
|
|
||||||
let vec: $t = bs.collect().wait().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(vec, &b"hello world"[..]);
|
|
||||||
$( assert_eq!(vec.$capacity(), 64); )*
|
|
||||||
|
|
||||||
// Collect many
|
|
||||||
//
|
|
||||||
let bs = list(&["hello", " ", "world", ", one two three"]);
|
|
||||||
|
|
||||||
let vec: $t = bs.collect().wait().unwrap();
|
|
||||||
|
|
||||||
assert_eq!(vec, &b"hello world, one two three"[..]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn collect_vec() {
|
|
||||||
test_collect_impl!(Vec<u8>, capacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn collect_bytes() {
|
|
||||||
test_collect_impl!(Bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===== Test limit() =====
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn limit() {
|
|
||||||
// Not limited
|
|
||||||
|
|
||||||
let res = one("hello world")
|
|
||||||
.limit(100)
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.wait()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(res, b"hello world");
|
|
||||||
|
|
||||||
let res = list(&["hello", " ", "world"])
|
|
||||||
.limit(100)
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.wait()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(res, b"hello world");
|
|
||||||
|
|
||||||
let res = list(&["hello", " ", "world"])
|
|
||||||
.limit(11)
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.wait()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(res, b"hello world");
|
|
||||||
|
|
||||||
// Limited
|
|
||||||
|
|
||||||
let res = one("hello world").limit(5).collect::<Vec<_>>().wait();
|
|
||||||
|
|
||||||
assert!(res.is_err());
|
|
||||||
|
|
||||||
let res = one("hello world").limit(10).collect::<Vec<_>>().wait();
|
|
||||||
|
|
||||||
assert!(res.is_err());
|
|
||||||
|
|
||||||
let mut bs = list(&["hello", " ", "world"]).limit(9);
|
|
||||||
|
|
||||||
assert_buf_eq!(bs.poll_buf(), "hello");
|
|
||||||
assert_buf_eq!(bs.poll_buf(), " ");
|
|
||||||
assert!(bs.poll_buf().is_err());
|
|
||||||
|
|
||||||
let mut bs = list(&["hello", " ", "world"]);
|
|
||||||
bs.size_hint.set_lower(11);
|
|
||||||
let mut bs = bs.limit(9);
|
|
||||||
|
|
||||||
assert!(bs.poll_buf().is_err());
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#![cfg(feature = "util")]
|
||||||
|
|
||||||
|
extern crate bytes;
|
||||||
|
extern crate futures;
|
||||||
|
extern crate tokio_buf;
|
||||||
|
|
||||||
|
use bytes::Buf;
|
||||||
|
use futures::Async::*;
|
||||||
|
use tokio_buf::{BufStream, BufStreamExt};
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
mod support;
|
||||||
|
|
||||||
|
use support::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn chain() {
|
||||||
|
// Chain one with one
|
||||||
|
//
|
||||||
|
let mut bs = one("hello").chain(one("world"));
|
||||||
|
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "hello");
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "world");
|
||||||
|
assert_none!(bs.poll_buf());
|
||||||
|
|
||||||
|
// Chain multi with multi
|
||||||
|
let mut bs = list(&["foo", "bar"]).chain(list(&["baz", "bok"]));
|
||||||
|
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "foo");
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "bar");
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "baz");
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "bok");
|
||||||
|
assert_none!(bs.poll_buf());
|
||||||
|
|
||||||
|
// Chain includes a not ready call
|
||||||
|
//
|
||||||
|
let mut bs = new_mock(&[Ok(Ready("foo")), Ok(NotReady), Ok(Ready("bar"))]).chain(one("baz"));
|
||||||
|
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "foo");
|
||||||
|
assert_not_ready!(bs.poll_buf());
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "bar");
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "baz");
|
||||||
|
assert_none!(bs.poll_buf());
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#![cfg(feature = "util")]
|
||||||
|
|
||||||
|
extern crate bytes;
|
||||||
|
extern crate futures;
|
||||||
|
extern crate tokio_buf;
|
||||||
|
|
||||||
|
use bytes::Bytes;
|
||||||
|
use futures::Future;
|
||||||
|
use tokio_buf::BufStreamExt;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
mod support;
|
||||||
|
|
||||||
|
use support::*;
|
||||||
|
|
||||||
|
macro_rules! test_collect_impl {
|
||||||
|
($t:ty $(, $capacity:ident)*) => {
|
||||||
|
// While unfortunate, this test makes some assumptions on vec's resizing
|
||||||
|
// behavior.
|
||||||
|
//
|
||||||
|
// Collect one
|
||||||
|
//
|
||||||
|
let bs = one("hello world");
|
||||||
|
|
||||||
|
let vec: $t = bs.collect().wait().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(vec, &b"hello world"[..]);
|
||||||
|
$( assert_eq!(vec.$capacity(), 64); )*
|
||||||
|
|
||||||
|
// Collect one, with size hint
|
||||||
|
//
|
||||||
|
let mut bs = one("hello world");
|
||||||
|
bs.size_hint.set_lower(11);
|
||||||
|
|
||||||
|
let vec: $t = bs.collect().wait().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(vec, &b"hello world"[..]);
|
||||||
|
$( assert_eq!(vec.$capacity(), 64); )*
|
||||||
|
|
||||||
|
// Collect one, with size hint
|
||||||
|
//
|
||||||
|
let mut bs = one("hello world");
|
||||||
|
bs.size_hint.set_lower(10);
|
||||||
|
|
||||||
|
let vec: $t = bs.collect().wait().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(vec, &b"hello world"[..]);
|
||||||
|
$( assert_eq!(vec.$capacity(), 64); )*
|
||||||
|
|
||||||
|
// Collect many
|
||||||
|
//
|
||||||
|
let bs = list(&["hello", " ", "world", ", one two three"]);
|
||||||
|
|
||||||
|
let vec: $t = bs.collect().wait().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(vec, &b"hello world, one two three"[..]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn collect_vec() {
|
||||||
|
test_collect_impl!(Vec<u8>, capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn collect_bytes() {
|
||||||
|
test_collect_impl!(Bytes);
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
#![cfg(feature = "util")]
|
||||||
|
|
||||||
|
extern crate bytes;
|
||||||
|
extern crate futures;
|
||||||
|
extern crate tokio_buf;
|
||||||
|
|
||||||
|
use bytes::Buf;
|
||||||
|
use futures::Async::*;
|
||||||
|
use futures::Future;
|
||||||
|
use tokio_buf::{BufStream, BufStreamExt};
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
mod support;
|
||||||
|
|
||||||
|
use support::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn limit() {
|
||||||
|
// Not limited
|
||||||
|
|
||||||
|
let res = one("hello world")
|
||||||
|
.limit(100)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.wait()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(res, b"hello world");
|
||||||
|
|
||||||
|
let res = list(&["hello", " ", "world"])
|
||||||
|
.limit(100)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.wait()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(res, b"hello world");
|
||||||
|
|
||||||
|
let res = list(&["hello", " ", "world"])
|
||||||
|
.limit(11)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.wait()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(res, b"hello world");
|
||||||
|
|
||||||
|
// Limited
|
||||||
|
|
||||||
|
let res = one("hello world").limit(5).collect::<Vec<_>>().wait();
|
||||||
|
|
||||||
|
assert!(res.is_err());
|
||||||
|
|
||||||
|
let res = one("hello world").limit(10).collect::<Vec<_>>().wait();
|
||||||
|
|
||||||
|
assert!(res.is_err());
|
||||||
|
|
||||||
|
let mut bs = list(&["hello", " ", "world"]).limit(9);
|
||||||
|
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "hello");
|
||||||
|
assert_buf_eq!(bs.poll_buf(), " ");
|
||||||
|
assert!(bs.poll_buf().is_err());
|
||||||
|
|
||||||
|
let mut bs = list(&["hello", " ", "world"]);
|
||||||
|
bs.size_hint.set_lower(11);
|
||||||
|
let mut bs = bs.limit(9);
|
||||||
|
|
||||||
|
assert!(bs.poll_buf().is_err());
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
extern crate tokio_buf;
|
||||||
|
|
||||||
|
use tokio_buf::SizeHint;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn size_hint() {
|
||||||
|
let hint = SizeHint::new();
|
||||||
|
assert_eq!(hint.lower(), 0);
|
||||||
|
assert!(hint.upper().is_none());
|
||||||
|
|
||||||
|
let mut hint = SizeHint::new();
|
||||||
|
hint.set_lower(100);
|
||||||
|
assert_eq!(hint.lower(), 100);
|
||||||
|
assert!(hint.upper().is_none());
|
||||||
|
|
||||||
|
let mut hint = SizeHint::new();
|
||||||
|
hint.set_upper(200);
|
||||||
|
assert_eq!(hint.lower(), 0);
|
||||||
|
assert_eq!(hint.upper(), Some(200));
|
||||||
|
|
||||||
|
let mut hint = SizeHint::new();
|
||||||
|
hint.set_lower(100);
|
||||||
|
hint.set_upper(100);
|
||||||
|
assert_eq!(hint.lower(), 100);
|
||||||
|
assert_eq!(hint.upper(), Some(100));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn size_hint_lower_bigger_than_upper() {
|
||||||
|
let mut hint = SizeHint::new();
|
||||||
|
hint.set_upper(100);
|
||||||
|
hint.set_lower(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn size_hint_upper_less_than_lower() {
|
||||||
|
let mut hint = SizeHint::new();
|
||||||
|
hint.set_lower(200);
|
||||||
|
hint.set_upper(100);
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
extern crate bytes;
|
||||||
|
extern crate futures;
|
||||||
|
extern crate tokio_buf;
|
||||||
|
|
||||||
|
use bytes::Buf;
|
||||||
|
use futures::Async::*;
|
||||||
|
use std::fmt;
|
||||||
|
use tokio_buf::BufStream;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
mod support;
|
||||||
|
|
||||||
|
fn test_hello_world<B>(mut bs: B)
|
||||||
|
where
|
||||||
|
B: BufStream + fmt::Debug,
|
||||||
|
B::Item: fmt::Debug,
|
||||||
|
B::Error: fmt::Debug,
|
||||||
|
{
|
||||||
|
let hint = bs.size_hint();
|
||||||
|
assert_eq!(hint.lower(), 11);
|
||||||
|
assert_eq!(hint.upper(), Some(11));
|
||||||
|
|
||||||
|
assert_buf_eq!(bs.poll_buf(), "hello world");
|
||||||
|
|
||||||
|
let hint = bs.size_hint();
|
||||||
|
assert_eq!(hint.lower(), 0);
|
||||||
|
assert_eq!(hint.upper(), Some(0));
|
||||||
|
assert_none!(bs.poll_buf());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn string() {
|
||||||
|
test_hello_world("hello world".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn str() {
|
||||||
|
test_hello_world("hello world");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user