53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
use std::iter;
|
|
use tokio_stream::{self as stream, Stream};
|
|
use tokio_test::{assert_pending, assert_ready, task};
|
|
|
|
#[tokio::test]
|
|
async fn coop() {
|
|
let mut stream = task::spawn(stream::iter(iter::repeat(1)));
|
|
|
|
for _ in 0..10_000 {
|
|
if stream.poll_next().is_pending() {
|
|
tokio::task::yield_now().await;
|
|
assert!(stream.is_woken());
|
|
return;
|
|
}
|
|
}
|
|
|
|
panic!("did not yield");
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_iter_coop_budget() {
|
|
let mut stream = task::spawn(stream::iter(iter::repeat(1)));
|
|
|
|
// Tokio's default budget is 128.
|
|
// Fallback yield_amt is 32.
|
|
let limit = if cfg!(feature = "rt") { 128 } else { 32 };
|
|
|
|
for i in 0..limit {
|
|
let res = stream.poll_next();
|
|
assert!(res.is_ready(), "Should be ready at index {i}");
|
|
}
|
|
|
|
// Next poll should be pending
|
|
assert_pending!(stream.poll_next());
|
|
|
|
tokio::task::yield_now().await;
|
|
assert!(stream.is_woken());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_iter_size_hint() {
|
|
let stream = stream::iter(vec![1, 2, 3]);
|
|
assert_eq!(stream.size_hint(), (3, Some(3)));
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_iter_eof_behavior() {
|
|
let mut stream = task::spawn(stream::iter(vec![1]));
|
|
|
|
assert_ready!(stream.poll_next());
|
|
assert_ready!(stream.poll_next()); // EOF should be ready None
|
|
}
|