summaryrefslogtreecommitdiffstats
path: root/third_party/rust/tokio/tests/process_issue_42.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/tokio/tests/process_issue_42.rs')
-rw-r--r--third_party/rust/tokio/tests/process_issue_42.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/third_party/rust/tokio/tests/process_issue_42.rs b/third_party/rust/tokio/tests/process_issue_42.rs
new file mode 100644
index 0000000000..569c122e36
--- /dev/null
+++ b/third_party/rust/tokio/tests/process_issue_42.rs
@@ -0,0 +1,38 @@
+#![warn(rust_2018_idioms)]
+#![cfg(feature = "full")]
+#![cfg(unix)]
+
+use futures::future::join_all;
+use std::process::Stdio;
+use tokio::process::Command;
+use tokio::task;
+
+#[tokio::test]
+async fn issue_42() {
+ // We spawn a many batches of processes which should exit at roughly the
+ // same time (modulo OS scheduling delays), to make sure that consuming
+ // a readiness event for one process doesn't inadvertently starve another.
+ // We then do this many times (in parallel) in an effort to stress test the
+ // implementation to ensure there are no race conditions.
+ // See alexcrichton/tokio-process#42 for background
+ let join_handles = (0..10usize).map(|_| {
+ task::spawn(async {
+ let processes = (0..10usize).map(|i| {
+ let mut child = Command::new("echo")
+ .arg(format!("I am spawned process #{}", i))
+ .stdin(Stdio::null())
+ .stdout(Stdio::null())
+ .stderr(Stdio::null())
+ .kill_on_drop(true)
+ .spawn()
+ .unwrap();
+
+ async move { child.wait().await }
+ });
+
+ join_all(processes).await;
+ })
+ });
+
+ join_all(join_handles).await;
+}