()
| 167 | |
| 168 | #[tokio::test] |
| 169 | async fn respects_concurrency_limit() { |
| 170 | use std::sync::atomic::{AtomicUsize, Ordering}; |
| 171 | use std::sync::Arc; |
| 172 | |
| 173 | let active = Arc::new(AtomicUsize::new(0)); |
| 174 | let max_active = Arc::new(AtomicUsize::new(0)); |
| 175 | let results = run_ordered_parallel_with_limit(vec![1_u8, 2, 3, 4], 2, { |
| 176 | let active = Arc::clone(&active); |
| 177 | let max_active = Arc::clone(&max_active); |
| 178 | move |_index, value| { |
| 179 | let active = Arc::clone(&active); |
| 180 | let max_active = Arc::clone(&max_active); |
| 181 | async move { |
| 182 | let now = active.fetch_add(1, Ordering::SeqCst) + 1; |
| 183 | max_active.fetch_max(now, Ordering::SeqCst); |
| 184 | tokio::time::sleep(std::time::Duration::from_millis(30)).await; |
| 185 | active.fetch_sub(1, Ordering::SeqCst); |
| 186 | value |
| 187 | } |
| 188 | } |
| 189 | }) |
| 190 | .await; |
| 191 | |
| 192 | assert_eq!(max_active.load(Ordering::SeqCst), 2); |
| 193 | assert_eq!( |
| 194 | results |
| 195 | .into_iter() |
| 196 | .map(|result| result.output.unwrap()) |
| 197 | .collect::<Vec<_>>(), |
| 198 | vec![1, 2, 3, 4] |
| 199 | ); |
| 200 | } |
| 201 | } |
nothing calls this directly
no test coverage detected