Skip to content

Commit 7137549

Browse files
authored
feat(cli/test): deno test --clean (#23519)
The result of the call is ignored as it throws even when the directory does not exist. Closes #23491
1 parent fab4c17 commit 7137549

File tree

7 files changed

+62
-1
lines changed

7 files changed

+62
-1
lines changed

cli/args/flags.rs

+20-1
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ pub struct TestFlags {
333333
pub doc: bool,
334334
pub no_run: bool,
335335
pub coverage_dir: Option<String>,
336+
pub clean: bool,
336337
pub fail_fast: Option<NonZeroUsize>,
337338
pub files: FileFlags,
338339
pub allow_none: bool,
@@ -2630,6 +2631,14 @@ Directory arguments are expanded to all contained files matching the glob
26302631
.conflicts_with("inspect-brk")
26312632
.help("Collect coverage profile data into DIR. If DIR is not specified, it uses 'coverage/'."),
26322633
)
2634+
.arg(
2635+
Arg::new("clean")
2636+
.long("clean")
2637+
.help("Empty the temporary coverage profile data directory before running tests.
2638+
2639+
Note: running multiple `deno test --clean` calls in series or parallel for the same coverage directory may cause race conditions.")
2640+
.action(ArgAction::SetTrue),
2641+
)
26332642
.arg(
26342643
Arg::new("parallel")
26352644
.long("parallel")
@@ -4240,6 +4249,7 @@ fn test_parse(flags: &mut Flags, matches: &mut ArgMatches) {
42404249
let doc = matches.get_flag("doc");
42414250
let allow_none = matches.get_flag("allow-none");
42424251
let filter = matches.remove_one::<String>("filter");
4252+
let clean = matches.get_flag("clean");
42434253

42444254
let fail_fast = if matches.contains_id("fail-fast") {
42454255
Some(
@@ -4325,6 +4335,7 @@ fn test_parse(flags: &mut Flags, matches: &mut ArgMatches) {
43254335
no_run,
43264336
doc,
43274337
coverage_dir: matches.remove_one::<String>("coverage"),
4338+
clean,
43284339
fail_fast,
43294340
files: FileFlags { include, ignore },
43304341
filter,
@@ -8189,7 +8200,7 @@ mod tests {
81898200
#[test]
81908201
fn test_with_flags() {
81918202
#[rustfmt::skip]
8192-
let r = flags_from_vec(svec!["deno", "test", "--unstable", "--no-npm", "--no-remote", "--trace-leaks", "--no-run", "--filter", "- foo", "--coverage=cov", "--location", "https:foo", "--allow-net", "--allow-none", "dir1/", "dir2/", "--", "arg1", "arg2"]);
8203+
let r = flags_from_vec(svec!["deno", "test", "--unstable", "--no-npm", "--no-remote", "--trace-leaks", "--no-run", "--filter", "- foo", "--coverage=cov", "--clean", "--location", "https:foo", "--allow-net", "--allow-none", "dir1/", "dir2/", "--", "arg1", "arg2"]);
81938204
assert_eq!(
81948205
r.unwrap(),
81958206
Flags {
@@ -8207,6 +8218,7 @@ mod tests {
82078218
concurrent_jobs: None,
82088219
trace_leaks: true,
82098220
coverage_dir: Some("cov".to_string()),
8221+
clean: true,
82108222
watch: Default::default(),
82118223
reporter: Default::default(),
82128224
junit_path: None,
@@ -8294,6 +8306,7 @@ mod tests {
82948306
concurrent_jobs: Some(NonZeroUsize::new(4).unwrap()),
82958307
trace_leaks: false,
82968308
coverage_dir: None,
8309+
clean: false,
82978310
watch: Default::default(),
82988311
junit_path: None,
82998312
}),
@@ -8330,6 +8343,7 @@ mod tests {
83308343
concurrent_jobs: None,
83318344
trace_leaks: false,
83328345
coverage_dir: None,
8346+
clean: false,
83338347
watch: Default::default(),
83348348
reporter: Default::default(),
83358349
junit_path: None,
@@ -8371,6 +8385,7 @@ mod tests {
83718385
concurrent_jobs: None,
83728386
trace_leaks: false,
83738387
coverage_dir: None,
8388+
clean: false,
83748389
watch: Default::default(),
83758390
reporter: Default::default(),
83768391
junit_path: None,
@@ -8506,6 +8521,7 @@ mod tests {
85068521
concurrent_jobs: None,
85078522
trace_leaks: false,
85088523
coverage_dir: None,
8524+
clean: false,
85098525
watch: Default::default(),
85108526
reporter: Default::default(),
85118527
junit_path: None,
@@ -8540,6 +8556,7 @@ mod tests {
85408556
concurrent_jobs: None,
85418557
trace_leaks: false,
85428558
coverage_dir: None,
8559+
clean: false,
85438560
watch: Some(Default::default()),
85448561
reporter: Default::default(),
85458562
junit_path: None,
@@ -8573,6 +8590,7 @@ mod tests {
85738590
concurrent_jobs: None,
85748591
trace_leaks: false,
85758592
coverage_dir: None,
8593+
clean: false,
85768594
watch: Some(Default::default()),
85778595
reporter: Default::default(),
85788596
junit_path: None,
@@ -8608,6 +8626,7 @@ mod tests {
86088626
concurrent_jobs: None,
86098627
trace_leaks: false,
86108628
coverage_dir: None,
8629+
clean: false,
86118630
watch: Some(WatchFlags {
86128631
hmr: false,
86138632
no_clear_screen: true,

cli/main.rs

+3
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ async fn run_subcommand(flags: Flags) -> Result<i32, AnyError> {
191191
DenoSubcommand::Test(test_flags) => {
192192
spawn_subcommand(async {
193193
if let Some(ref coverage_dir) = test_flags.coverage_dir {
194+
if test_flags.clean {
195+
let _ = std::fs::remove_dir_all(coverage_dir);
196+
}
194197
std::fs::create_dir_all(coverage_dir)
195198
.with_context(|| format!("Failed creating: {coverage_dir}"))?;
196199
// this is set in order to ensure spawned processes use the same
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"args": "run -A main.js",
3+
"exitCode": 0,
4+
"output": "main.out"
5+
}

tests/specs/test/clean_flag/main.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { emptyDir } from "../../../util/std/fs/empty_dir.ts";
2+
3+
const DIR = "./coverage";
4+
const COMMAND = new Deno.Command(Deno.execPath(), {
5+
args: ["test", "--coverage", "--clean"],
6+
stdout: "null",
7+
});
8+
9+
async function getCoverageFiles() {
10+
return await Array.fromAsync(Deno.readDir(DIR), ({ name }) => name);
11+
}
12+
13+
await emptyDir(DIR);
14+
await COMMAND.output();
15+
const files1 = new Set(await getCoverageFiles());
16+
17+
await COMMAND.output();
18+
const files2 = new Set(await getCoverageFiles());
19+
20+
console.log(files1.size === files2.size);
21+
console.log(files1.intersection(files2).size === 0);
22+
await emptyDir(DIR);
23+
await Deno.remove(DIR);

tests/specs/test/clean_flag/main.out

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
true
2+
true

tests/specs/test/clean_flag/sum.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function sum(a, b) {
2+
return a + b;
3+
}
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { sum } from "./sum.js";
2+
import { assertEquals } from "../../../util/std/assert/assert_equals.ts";
3+
4+
Deno.test("sum()", () => {
5+
assertEquals(sum(1, 2), 3);
6+
});

0 commit comments

Comments
 (0)