fix(deno test): support directories as arguments (#4011)

This commit is contained in:
Bartek Iwańczuk 2020-02-17 19:11:45 +01:00 committed by GitHub
parent 1908066753
commit 95563476f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 110 additions and 30 deletions

21
Cargo.lock generated
View File

@ -385,6 +385,7 @@ dependencies = [
"tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)",
"url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"utime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
"webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1556,6 +1557,14 @@ name = "ryu"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "schannel"
version = "0.1.16"
@ -2116,6 +2125,16 @@ name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "walkdir"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "want"
version = "0.3.0"
@ -2478,6 +2497,7 @@ dependencies = [
"checksum rusty_v8 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8ed9530934df58a5be648916e142858b473558a0df6356b59e083c1c3c2f7d32"
"checksum rustyline 5.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a23cb19702a8d6afb6edb3c842386e680d4883760e0df74e6848e23c2a87a635"
"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021"
"checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"
@ -2542,6 +2562,7 @@ dependencies = [
"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
"checksum vlq 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff"
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
"checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
"checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c"

View File

@ -62,6 +62,7 @@ url = "2.1.0"
utime = "0.2.1"
webpki = "0.21.0"
webpki-roots = "0.17.0"
walkdir = "2.3.1"
[target.'cfg(windows)'.dependencies]
winapi = "0.3.8"

View File

@ -7,9 +7,9 @@
//! the future it can be easily extended to provide
//! the same functions as ops available in JS runtime.
use crate::fs::files_in_subtree;
use deno_core::ErrBox;
use dprint_plugin_typescript as dprint;
use glob;
use std::fs;
use std::io::stdin;
use std::io::stdout;
@ -135,26 +135,6 @@ fn format_source_files(
);
}
pub fn source_files_in_subtree(root: PathBuf) -> Vec<PathBuf> {
assert!(root.is_dir());
// TODO(ry) Use WalkDir instead of globs.
let g = root.join("**/*");
glob::glob(&g.into_os_string().into_string().unwrap())
.expect("Failed to execute glob.")
.filter_map(|result| {
if let Ok(p) = result {
if is_supported(&p) {
Some(p)
} else {
None
}
} else {
None
}
})
.collect()
}
/// Format JavaScript/TypeScript files.
///
/// First argument supports globs, and if it is `None`
@ -168,13 +148,15 @@ pub fn format_files(args: Vec<String>, check: bool) -> Result<(), ErrBox> {
let mut target_files: Vec<PathBuf> = vec![];
if args.is_empty() {
target_files
.extend(source_files_in_subtree(std::env::current_dir().unwrap()));
target_files.extend(files_in_subtree(
std::env::current_dir().unwrap(),
is_supported,
));
} else {
for arg in args {
let p = PathBuf::from(arg);
if p.is_dir() {
target_files.extend(source_files_in_subtree(p));
target_files.extend(files_in_subtree(p, is_supported));
} else {
target_files.push(p);
};

View File

@ -9,6 +9,7 @@ use deno_core::ErrBox;
use rand;
use rand::Rng;
use url::Url;
use walkdir::WalkDir;
#[cfg(unix)]
use nix::unistd::{chown as unix_chown, Gid, Uid};
@ -188,3 +189,17 @@ mod tests {
assert_eq!(resolve_from_cwd(expected).unwrap(), expected);
}
}
pub fn files_in_subtree<F>(root: PathBuf, filter: F) -> Vec<PathBuf>
where
F: Fn(&Path) -> bool,
{
assert!(root.is_dir());
WalkDir::new(root)
.into_iter()
.filter_map(|e| e.ok())
.map(|e| e.path().to_owned())
.filter(|p| if p.is_dir() { false } else { filter(&p) })
.collect()
}

View File

@ -429,7 +429,7 @@ async fn test_command(
let global_state = create_global_state(flags.clone());
let cwd = std::env::current_dir().expect("No current directory");
let include = include.unwrap_or_else(|| vec![".".to_string()]);
let res = test_runner::prepare_test_modules_urls(include, cwd.clone());
let res = test_runner::prepare_test_modules_urls(include, &cwd);
let test_modules = match res {
Ok(modules) => modules,

View File

@ -3,12 +3,28 @@
use crate::installer::is_remote_url;
use deno_core::ErrBox;
use std;
use std::path::Path;
use std::path::PathBuf;
use url::Url;
fn is_supported(p: &Path) -> bool {
use std::path::Component;
if let Some(Component::Normal(basename_os_str)) = p.components().next_back() {
let basename = basename_os_str.to_string_lossy();
basename.ends_with("_test.ts")
|| basename.ends_with("_test.js")
|| basename.ends_with(".test.ts")
|| basename.ends_with(".test.js")
|| basename == "test.ts"
|| basename == "test.js"
} else {
false
}
}
pub fn prepare_test_modules_urls(
include: Vec<String>,
root_path: PathBuf,
root_path: &PathBuf,
) -> Result<Vec<Url>, ErrBox> {
let (include_paths, include_urls): (Vec<String>, Vec<String>) =
include.into_iter().partition(|n| !is_remote_url(n));
@ -16,9 +32,19 @@ pub fn prepare_test_modules_urls(
let mut prepared = vec![];
for path in include_paths {
let p = root_path.join(path).canonicalize()?;
let url = Url::from_file_path(p).unwrap();
prepared.push(url);
let q = root_path.join(path);
let p = q.canonicalize()?;
if p.is_dir() {
let test_files = crate::fs::files_in_subtree(p, is_supported);
let test_files_as_urls = test_files
.iter()
.map(|f| Url::from_file_path(f).unwrap())
.collect::<Vec<Url>>();
prepared.extend(test_files_as_urls);
} else {
let url = Url::from_file_path(p).unwrap();
prepared.push(url);
}
}
for remote_url in include_urls {
@ -59,7 +85,7 @@ mod tests {
"subdir2/mod2.ts".to_string(),
"http://example.com/printf_test.ts".to_string(),
],
test_data_path.clone(),
&test_data_path,
)
.unwrap();
let test_data_url =
@ -78,4 +104,39 @@ mod tests {
matched_urls.sort();
assert_eq!(matched_urls, expected);
}
#[test]
fn test_is_supported() {
assert!(is_supported(Path::new("tests/subdir/foo_test.ts")));
assert!(is_supported(Path::new("tests/subdir/foo_test.js")));
assert!(is_supported(Path::new("bar/foo.test.ts")));
assert!(is_supported(Path::new("bar/foo.test.js")));
assert!(is_supported(Path::new("foo/bar/test.js")));
assert!(is_supported(Path::new("foo/bar/test.ts")));
assert!(!is_supported(Path::new("README.md")));
assert!(!is_supported(Path::new("lib/typescript.d.ts")));
assert!(!is_supported(Path::new("notatest.js")));
assert!(!is_supported(Path::new("NotAtest.ts")));
}
#[test]
fn supports_dirs() {
let root = test_util::root_path().join("std").join("http");
println!("root {:?}", root);
let mut matched_urls =
prepare_test_modules_urls(vec![".".to_string()], &root).unwrap();
matched_urls.sort();
let root_url = Url::from_file_path(root).unwrap().to_string();
println!("root_url {}", root_url);
let expected: Vec<Url> = vec![
format!("{}/cookie_test.ts", root_url),
format!("{}/file_server_test.ts", root_url),
format!("{}/racing_server_test.ts", root_url),
format!("{}/server_test.ts", root_url),
]
.into_iter()
.map(|f| Url::parse(&f).unwrap())
.collect();
assert_eq!(matched_urls, expected);
}
}