summaryrefslogtreecommitdiff
path: root/cli/tests/integration_tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests/integration_tests.rs')
-rw-r--r--cli/tests/integration_tests.rs97
1 files changed, 94 insertions, 3 deletions
diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs
index 40a23bcfa..bd197daff 100644
--- a/cli/tests/integration_tests.rs
+++ b/cli/tests/integration_tests.rs
@@ -5,6 +5,7 @@ use deno_core::serde_json;
use deno_core::url;
use deno_runtime::deno_fetch::reqwest;
use deno_runtime::deno_websocket::tokio_tungstenite;
+use std::io::BufReader;
use std::io::{BufRead, Write};
use std::path::Path;
use std::path::PathBuf;
@@ -5249,6 +5250,32 @@ fn jsonc_to_serde(j: jsonc_parser::JsonValue) -> serde_json::Value {
}
}
+struct WPTServer(std::process::Child);
+
+impl Drop for WPTServer {
+ fn drop(&mut self) {
+ match self.0.try_wait() {
+ Ok(None) => {
+ #[cfg(target_os = "linux")]
+ {
+ println!("libc kill");
+ unsafe {
+ libc::kill(self.0.id() as i32, libc::SIGTERM);
+ }
+ }
+ #[cfg(not(target_os = "linux"))]
+ {
+ println!("std kill");
+ self.0.kill().expect("killing 'wpt serve' failed");
+ }
+ let _ = self.0.wait();
+ }
+ Ok(Some(status)) => panic!("'wpt serve' exited unexpectedly {}", status),
+ Err(e) => panic!("'wpt serve' error: {}", e),
+ }
+ }
+}
+
#[test]
fn web_platform_tests() {
use deno_core::serde::Deserialize;
@@ -5270,6 +5297,61 @@ fn web_platform_tests() {
let config: std::collections::HashMap<String, Vec<WptConfig>> =
deno_core::serde_json::from_value(jsonc_to_serde(jsonc)).unwrap();
+ // Observation: `python3 wpt serve` hangs with the python3 from homebrew
+ // but works okay with /usr/bin/python, which is python 2.7.10. Observed
+ // with homebrew python 3.8.5, 3.8.7 and 3.9.1.
+ let python = match true {
+ _ if cfg!(target_os = "windows") => "python.exe",
+ _ if cfg!(target_os = "macos") => "python",
+ _ => "python3",
+ };
+
+ eprintln!("If the wpt server fails or gets stuck, please set up your /etc/hosts file like specified in //docs/contributing/building_from_source.md.");
+
+ let mut proc = Command::new(python)
+ .current_dir(util::wpt_path())
+ .arg("wpt.py")
+ .arg("serve")
+ .stderr(std::process::Stdio::piped())
+ .spawn()
+ .unwrap();
+
+ let stderr = proc.stderr.as_mut().unwrap();
+ let mut stderr = BufReader::new(stderr).lines();
+ let mut ready_8000 = false;
+ let mut ready_8443 = false;
+ let mut ready_8444 = false;
+ let mut ready_9000 = false;
+ while let Ok(line) = stderr.next().unwrap() {
+ if !line.starts_with("DEBUG:") {
+ eprintln!("{}", line);
+ }
+ if cfg!(target_os = "windows") && line.contains("Using ports") {
+ break;
+ }
+ if line.contains("web-platform.test:8000") {
+ ready_8000 = true;
+ }
+ if line.contains("web-platform.test:8443") {
+ ready_8443 = true;
+ }
+ if line.contains("web-platform.test:8444") {
+ ready_8444 = true;
+ }
+ if line.contains("web-platform.test:9000") {
+ ready_9000 = true;
+ }
+ // WPT + python2 doesn't support HTTP/2.0.
+ if line.contains("Cannot start HTTP/2.0 server") {
+ ready_9000 = true;
+ }
+ if ready_8000 && ready_8443 && ready_8444 && ready_9000 {
+ break;
+ }
+ }
+
+ let _wpt_server = WPTServer(proc);
+
for (suite_name, includes) in config.into_iter() {
let suite_path = util::wpt_path().join(suite_name);
let dir = WalkDir::new(&suite_path)
@@ -5352,14 +5434,15 @@ fn web_platform_tests() {
})
.collect();
- let mut variants: Vec<&str> = test_file_text
+ let mut variants: Vec<String> = test_file_text
.split('\n')
.into_iter()
.filter_map(|t| t.strip_prefix("// META: variant="))
+ .map(|t| format!("?{}", t))
.collect();
if variants.is_empty() {
- variants.push("");
+ variants.push("".to_string());
}
for variant in variants {
@@ -5382,11 +5465,19 @@ fn web_platform_tests() {
let bundle = concat_bundle(files, file.path(), "".to_string());
file.write_all(bundle.as_bytes()).unwrap();
+ let self_path = test_file_path.strip_prefix(util::wpt_path()).unwrap();
+
let child = util::deno_cmd()
.current_dir(test_file_path.parent().unwrap())
.arg("run")
.arg("--location")
- .arg(&format!("http://web-platform-tests/?{}", variant))
+ .arg(&format!(
+ "http://web-platform.test:8000/{}{}",
+ self_path.to_str().unwrap(),
+ variant
+ ))
+ .arg("--cert")
+ .arg(util::wpt_path().join("tools/certs/cacert.pem"))
.arg("-A")
.arg(file.path())
.arg(deno_core::serde_json::to_string(&expect_fail).unwrap())