//! Stress tests and benchmarks use crate::common::task_fn; use dagx::DagRunner; use std::sync::Arc; use std::time::{Duration, Instant}; #[tokio::test] async fn test_deep_chain_100_levels() { let dag = Arc::new(DagRunner::new()); // Create a chain 100 levels deep let start = Instant::now(); let first = dag.add_task(task_fn(|_: ()| async { 0 })); let mut handles = vec![(&first).into()]; for _ in 1..=100 { let next = dag .add_task(task_fn(move |x: i32| async move { x + 1 })) .depends_on(handles.last().unwrap()); handles.push(next); } let build_time = start.elapsed(); println!("Built 100-level chain in {:?}", build_time); // Execute let start = Instant::now(); dag.run(|fut| { tokio::spawn(fut); }) .await .unwrap(); let exec_time = start.elapsed(); println!("Executed 100-level chain in {:?}", exec_time); assert!( exec_time < Duration::from_secs(5), "Execution took too long" ); // Verify result assert_eq!(dag.get(handles.last().unwrap()).unwrap(), 100); } #[tokio::test] async fn test_stress_mixed_patterns() { // Stress test with mixed DAG patterns let dag = Arc::new(DagRunner::new()); let mut all_tasks = vec![]; // Add various patterns for i in 0..10 { // Linear chains let first = dag.add_task(task_fn(move |_: ()| async move { i * 1000 })); let mut chain_handles = vec![(&first).into()]; for j in 1..10 { let next = dag .add_task(task_fn(move |x: i32| async move { x + j })) .depends_on(chain_handles.last().unwrap()); chain_handles.push(next); } all_tasks.push(*chain_handles.last().unwrap()); // Diamonds let source = dag.add_task(task_fn(move |_: ()| async move { i * 100 })); let source_handle: dagx::TaskHandle = (&source).into(); let left = dag .add_task(task_fn(|x: i32| async move { x * 2 })) .depends_on(source_handle); let right = dag .add_task(task_fn(|x: i32| async move { x * 3 })) .depends_on(source_handle); let merge = dag .add_task(task_fn(|(l, r): (i32, i32)| async move { l + r })) .depends_on((&left, &right)); all_tasks.push(merge); // Fan-outs let hub = dag.add_task(task_fn(move |_: ()| async move { i })); let hub_handle: dagx::TaskHandle = (&hub).into(); for j in 0..5 { let fan = dag .add_task(task_fn(move |x: i32| async move { x + j * 10 })) .depends_on(hub_handle); all_tasks.push(fan); } } // Execute let start = Instant::now(); dag.run(|fut| { tokio::spawn(fut); }) .await .unwrap(); let exec_time = start.elapsed(); println!("Executed mixed pattern stress test in {:?}", exec_time); // Verify some results for task in all_tasks.iter().take(10) { assert!(dag.get(task).is_ok()); } }