Skip to content

Commit

Permalink
Better handle stuck WebDriver processes
Browse files Browse the repository at this point in the history
  • Loading branch information
daxpedda committed Dec 10, 2024
1 parent 8fa299f commit 119634c
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 17 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
* Adding `getter`, `setter`, and `constructor` methods to enums now results in a compiler error. This was previously erroneously allowed and resulted in invalid JS code gen.
[#4278](https://github.com/rustwasm/wasm-bindgen/pull/4278)

* Handle stuck and failed WebDriver processes when re-trying to start them.
[#4340](https://github.com/rustwasm/wasm-bindgen/pull/4340)

### Fixed

- Fixed using [JavaScript keyword](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords) as identifiers not being handled correctly.
Expand Down
32 changes: 15 additions & 17 deletions crates/cli/src/bin/wasm-bindgen-test-runner/headless.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ use serde::{Deserialize, Serialize};
use serde_json::{json, Map, Value as Json};
use std::env;
use std::fs::File;
use std::io::{self, Read};
use std::io::{BufRead, BufReader, Read};
use std::net::{SocketAddr, TcpListener, TcpStream};
use std::path::{Path, PathBuf};
use std::process::{Child, Command, Stdio};
use std::process::{Child, ChildStderr, ChildStdout, Command, Stdio};
use std::thread;
use std::time::{Duration, Instant};
use ureq::Agent;
Expand Down Expand Up @@ -615,12 +615,6 @@ impl Drop for Client {
}
}

fn read<R: Read>(r: &mut R) -> io::Result<Vec<u8>> {
let mut dst = Vec::new();
r.read_to_end(&mut dst)?;
Ok(dst)
}

fn tab(s: &str) -> String {
let mut result = String::new();
for line in s.lines() {
Expand All @@ -633,8 +627,8 @@ fn tab(s: &str) -> String {

struct BackgroundChild<'a> {
child: Child,
stdout: Option<thread::JoinHandle<io::Result<Vec<u8>>>>,
stderr: Option<thread::JoinHandle<io::Result<Vec<u8>>>>,
stdout: BufReader<ChildStdout>,
stderr: BufReader<ChildStderr>,
shell: &'a Shell,
print_stdio_on_drop: bool,
}
Expand All @@ -652,10 +646,8 @@ impl<'a> BackgroundChild<'a> {
let mut child = cmd
.spawn()
.context(format!("failed to spawn {:?} binary", path))?;
let mut stdout = child.stdout.take().unwrap();
let mut stderr = child.stderr.take().unwrap();
let stdout = Some(thread::spawn(move || read(&mut stdout)));
let stderr = Some(thread::spawn(move || read(&mut stderr)));
let stdout = BufReader::new(child.stdout.take().unwrap());
let stderr = BufReader::new(child.stderr.take().unwrap());
Ok(BackgroundChild {
child,
stdout,
Expand All @@ -668,7 +660,11 @@ impl<'a> BackgroundChild<'a> {
fn has_failed(&mut self) -> bool {
match self.child.try_wait() {
Ok(Some(status)) => !status.success(),
Ok(None) => false,
Ok(None) => self
.stderr
.fill_buf()
.map(|b| !b.is_empty())
.unwrap_or(true),
Err(_) => true,
}
}
Expand All @@ -685,11 +681,13 @@ impl Drop for BackgroundChild<'_> {
self.shell.clear();
println!("driver status: {}", status);

let stdout = self.stdout.take().unwrap().join().unwrap().unwrap();
let mut stdout = Vec::new();
self.stdout.read_to_end(&mut stdout).unwrap();
if !stdout.is_empty() {
println!("driver stdout:\n{}", tab(&String::from_utf8_lossy(&stdout)));
}
let stderr = self.stderr.take().unwrap().join().unwrap().unwrap();
let mut stderr = Vec::new();
self.stderr.read_to_end(&mut stderr).unwrap();
if !stderr.is_empty() {
println!("driver stderr:\n{}", tab(&String::from_utf8_lossy(&stderr)));
}
Expand Down

0 comments on commit 119634c

Please sign in to comment.