mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-08 00:00:13 +02:00
Move stream items into tokio-stream (#3277)
This change removes all references to `Stream` from within the `tokio` crate and moves them into a new `tokio-stream` crate. Most types have had their `impl Stream` removed as well in-favor of their inherent methods. Closes #2870
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
#![cfg(feature = "full")]
|
||||
|
||||
use tokio::time::{self, sleep, Duration};
|
||||
use tokio_stream::{self, StreamExt};
|
||||
use tokio_test::*;
|
||||
|
||||
use futures::StreamExt as _;
|
||||
|
||||
async fn maybe_sleep(idx: i32) -> i32 {
|
||||
if idx % 2 == 0 {
|
||||
sleep(ms(200)).await;
|
||||
}
|
||||
idx
|
||||
}
|
||||
|
||||
fn ms(n: u64) -> Duration {
|
||||
Duration::from_millis(n)
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn basic_usage() {
|
||||
time::pause();
|
||||
|
||||
// Items 2 and 4 time out. If we run the stream until it completes,
|
||||
// we end up with the following items:
|
||||
//
|
||||
// [Ok(1), Err(Elapsed), Ok(2), Ok(3), Err(Elapsed), Ok(4)]
|
||||
|
||||
let stream = stream::iter(1..=4).then(maybe_sleep).timeout(ms(100));
|
||||
let mut stream = task::spawn(stream);
|
||||
|
||||
// First item completes immediately
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(1)));
|
||||
|
||||
// Second item is delayed 200ms, times out after 100ms
|
||||
assert_pending!(stream.poll_next());
|
||||
|
||||
time::advance(ms(150)).await;
|
||||
let v = assert_ready!(stream.poll_next());
|
||||
assert!(v.unwrap().is_err());
|
||||
|
||||
assert_pending!(stream.poll_next());
|
||||
|
||||
time::advance(ms(100)).await;
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(2)));
|
||||
|
||||
// Third item is ready immediately
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(3)));
|
||||
|
||||
// Fourth item is delayed 200ms, times out after 100ms
|
||||
assert_pending!(stream.poll_next());
|
||||
|
||||
time::advance(ms(60)).await;
|
||||
assert_pending!(stream.poll_next()); // nothing ready yet
|
||||
|
||||
time::advance(ms(60)).await;
|
||||
let v = assert_ready!(stream.poll_next());
|
||||
assert!(v.unwrap().is_err()); // timeout!
|
||||
|
||||
time::advance(ms(120)).await;
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(4)));
|
||||
|
||||
// Done.
|
||||
assert_ready_eq!(stream.poll_next(), None);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn return_elapsed_errors_only_once() {
|
||||
time::pause();
|
||||
|
||||
let stream = stream::iter(1..=3).then(maybe_sleep).timeout(ms(50));
|
||||
let mut stream = task::spawn(stream);
|
||||
|
||||
// First item completes immediately
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(1)));
|
||||
|
||||
// Second item is delayed 200ms, times out after 50ms. Only one `Elapsed`
|
||||
// error is returned.
|
||||
assert_pending!(stream.poll_next());
|
||||
//
|
||||
time::advance(ms(51)).await;
|
||||
let v = assert_ready!(stream.poll_next());
|
||||
assert!(v.unwrap().is_err()); // timeout!
|
||||
|
||||
// deadline elapses again, but no error is returned
|
||||
time::advance(ms(50)).await;
|
||||
assert_pending!(stream.poll_next());
|
||||
|
||||
time::advance(ms(100)).await;
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(2)));
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(3)));
|
||||
|
||||
// Done
|
||||
assert_ready_eq!(stream.poll_next(), None);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn no_timeouts() {
|
||||
let stream = stream::iter(vec![1, 3, 5])
|
||||
.then(maybe_sleep)
|
||||
.timeout(ms(100));
|
||||
|
||||
let mut stream = task::spawn(stream);
|
||||
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(1)));
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(3)));
|
||||
assert_ready_eq!(stream.poll_next(), Some(Ok(5)));
|
||||
assert_ready_eq!(stream.poll_next(), None);
|
||||
}
|
||||
Reference in New Issue
Block a user