mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
chore(cli): rename --trace-ops
to --trace-leaks
(#22598)
As we add tracing to more types of runtime activity, `--trace-ops` is less useful of a name. `--trace-leaks` better reflects that this feature traces both ops and timers, and will eventually trace resource opening as well. This keeps `--trace-ops` as an alias for `--trace-leaks`, but prints a warning to the console suggesting migration to `--trace-leaks`. One test continues to use `--trace-ops` to test the deprecation warning. --------- Signed-off-by: Matt Mastracci <matthew@mastracci.com>
This commit is contained in:
parent
c2c4e745a5
commit
a3f982c1d5
8 changed files with 51 additions and 31 deletions
|
@ -275,7 +275,7 @@ pub struct TestFlags {
|
||||||
pub filter: Option<String>,
|
pub filter: Option<String>,
|
||||||
pub shuffle: Option<u64>,
|
pub shuffle: Option<u64>,
|
||||||
pub concurrent_jobs: Option<NonZeroUsize>,
|
pub concurrent_jobs: Option<NonZeroUsize>,
|
||||||
pub trace_ops: bool,
|
pub trace_leaks: bool,
|
||||||
pub watch: Option<WatchFlags>,
|
pub watch: Option<WatchFlags>,
|
||||||
pub reporter: TestReporterConfig,
|
pub reporter: TestReporterConfig,
|
||||||
pub junit_path: Option<String>,
|
pub junit_path: Option<String>,
|
||||||
|
@ -2155,7 +2155,14 @@ Directory arguments are expanded to all contained files matching the glob
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("trace-ops")
|
Arg::new("trace-ops")
|
||||||
.long("trace-ops")
|
.long("trace-ops")
|
||||||
.help("Enable tracing of async ops. Useful when debugging leaking ops in test, but impacts test execution time.")
|
.help("Deprecated alias for --trace-leaks.")
|
||||||
|
.hide(true)
|
||||||
|
.action(ArgAction::SetTrue),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::new("trace-leaks")
|
||||||
|
.long("trace-leaks")
|
||||||
|
.help("Enable tracing of leaks. Useful when debugging leaking ops in test, but impacts test execution time.")
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -3704,7 +3711,18 @@ fn test_parse(flags: &mut Flags, matches: &mut ArgMatches) {
|
||||||
};
|
};
|
||||||
|
|
||||||
let no_run = matches.get_flag("no-run");
|
let no_run = matches.get_flag("no-run");
|
||||||
let trace_ops = matches.get_flag("trace-ops");
|
let trace_leaks =
|
||||||
|
matches.get_flag("trace-ops") || matches.get_flag("trace-leaks");
|
||||||
|
if trace_leaks && matches.get_flag("trace-ops") {
|
||||||
|
// We can't change this to use the log crate because its not configured
|
||||||
|
// yet at this point since the flags haven't been parsed. This flag is
|
||||||
|
// deprecated though so it's not worth changing the code to use the log
|
||||||
|
// crate here and this is only done for testing anyway.
|
||||||
|
eprintln!(
|
||||||
|
"⚠️ {}",
|
||||||
|
crate::colors::yellow("The `--trace-ops` flag is deprecated and will be removed in Deno 2.0.\nUse the `--trace-leaks` flag instead."),
|
||||||
|
);
|
||||||
|
}
|
||||||
let doc = matches.get_flag("doc");
|
let doc = matches.get_flag("doc");
|
||||||
let allow_none = matches.get_flag("allow-none");
|
let allow_none = matches.get_flag("allow-none");
|
||||||
let filter = matches.remove_one::<String>("filter");
|
let filter = matches.remove_one::<String>("filter");
|
||||||
|
@ -3792,7 +3810,7 @@ fn test_parse(flags: &mut Flags, matches: &mut ArgMatches) {
|
||||||
shuffle,
|
shuffle,
|
||||||
allow_none,
|
allow_none,
|
||||||
concurrent_jobs,
|
concurrent_jobs,
|
||||||
trace_ops,
|
trace_leaks,
|
||||||
watch: watch_arg_parse(matches),
|
watch: watch_arg_parse(matches),
|
||||||
reporter,
|
reporter,
|
||||||
junit_path,
|
junit_path,
|
||||||
|
@ -7098,7 +7116,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_with_flags() {
|
fn test_with_flags() {
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
let r = flags_from_vec(svec!["deno", "test", "--unstable", "--no-npm", "--no-remote", "--trace-ops", "--no-run", "--filter", "- foo", "--coverage=cov", "--location", "https:foo", "--allow-net", "--allow-none", "dir1/", "dir2/", "--", "arg1", "arg2"]);
|
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"]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
r.unwrap(),
|
r.unwrap(),
|
||||||
Flags {
|
Flags {
|
||||||
|
@ -7114,7 +7132,7 @@ mod tests {
|
||||||
},
|
},
|
||||||
shuffle: None,
|
shuffle: None,
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: true,
|
trace_leaks: true,
|
||||||
coverage_dir: Some("cov".to_string()),
|
coverage_dir: Some("cov".to_string()),
|
||||||
watch: Default::default(),
|
watch: Default::default(),
|
||||||
reporter: Default::default(),
|
reporter: Default::default(),
|
||||||
|
@ -7196,7 +7214,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: Some(NonZeroUsize::new(4).unwrap()),
|
concurrent_jobs: Some(NonZeroUsize::new(4).unwrap()),
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Default::default(),
|
watch: Default::default(),
|
||||||
junit_path: None,
|
junit_path: None,
|
||||||
|
@ -7229,7 +7247,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Default::default(),
|
watch: Default::default(),
|
||||||
reporter: Default::default(),
|
reporter: Default::default(),
|
||||||
|
@ -7267,7 +7285,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Default::default(),
|
watch: Default::default(),
|
||||||
reporter: Default::default(),
|
reporter: Default::default(),
|
||||||
|
@ -7384,7 +7402,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Default::default(),
|
watch: Default::default(),
|
||||||
reporter: Default::default(),
|
reporter: Default::default(),
|
||||||
|
@ -7415,7 +7433,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Some(Default::default()),
|
watch: Some(Default::default()),
|
||||||
reporter: Default::default(),
|
reporter: Default::default(),
|
||||||
|
@ -7445,7 +7463,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Some(Default::default()),
|
watch: Some(Default::default()),
|
||||||
reporter: Default::default(),
|
reporter: Default::default(),
|
||||||
|
@ -7477,7 +7495,7 @@ mod tests {
|
||||||
ignore: vec![],
|
ignore: vec![],
|
||||||
},
|
},
|
||||||
concurrent_jobs: None,
|
concurrent_jobs: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
coverage_dir: None,
|
coverage_dir: None,
|
||||||
watch: Some(WatchFlags {
|
watch: Some(WatchFlags {
|
||||||
hmr: false,
|
hmr: false,
|
||||||
|
|
|
@ -333,7 +333,7 @@ pub struct TestOptions {
|
||||||
pub filter: Option<String>,
|
pub filter: Option<String>,
|
||||||
pub shuffle: Option<u64>,
|
pub shuffle: Option<u64>,
|
||||||
pub concurrent_jobs: NonZeroUsize,
|
pub concurrent_jobs: NonZeroUsize,
|
||||||
pub trace_ops: bool,
|
pub trace_leaks: bool,
|
||||||
pub reporter: TestReporterConfig,
|
pub reporter: TestReporterConfig,
|
||||||
pub junit_path: Option<String>,
|
pub junit_path: Option<String>,
|
||||||
}
|
}
|
||||||
|
@ -361,7 +361,7 @@ impl TestOptions {
|
||||||
filter: test_flags.filter,
|
filter: test_flags.filter,
|
||||||
no_run: test_flags.no_run,
|
no_run: test_flags.no_run,
|
||||||
shuffle: test_flags.shuffle,
|
shuffle: test_flags.shuffle,
|
||||||
trace_ops: test_flags.trace_ops,
|
trace_leaks: test_flags.trace_leaks,
|
||||||
reporter: test_flags.reporter,
|
reporter: test_flags.reporter,
|
||||||
junit_path: test_flags.junit_path,
|
junit_path: test_flags.junit_path,
|
||||||
})
|
})
|
||||||
|
|
|
@ -296,7 +296,7 @@ impl TestRun {
|
||||||
test::TestSpecifierOptions {
|
test::TestSpecifierOptions {
|
||||||
filter,
|
filter,
|
||||||
shuffle: None,
|
shuffle: None,
|
||||||
trace_ops: false,
|
trace_leaks: false,
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,7 @@ impl TestRun {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|s| s.as_str()),
|
.map(|s| s.as_str()),
|
||||||
);
|
);
|
||||||
args.push("--trace-ops");
|
args.push("--trace-leaks");
|
||||||
if self.workspace_settings.unstable && !args.contains(&"--unstable") {
|
if self.workspace_settings.unstable && !args.contains(&"--unstable") {
|
||||||
args.push("--unstable");
|
args.push("--unstable");
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,7 +107,7 @@ fn format_sanitizer_accum(
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut output = vec![];
|
let mut output = vec![];
|
||||||
let mut needs_trace_ops = false;
|
let mut needs_trace_leaks = false;
|
||||||
for ((item_type, item_name, trace), count) in accum.into_iter() {
|
for ((item_type, item_name, trace), count) in accum.into_iter() {
|
||||||
if item_type == RuntimeActivityType::Resource {
|
if item_type == RuntimeActivityType::Resource {
|
||||||
let (name, action1, action2) = pretty_resource_name(&item_name);
|
let (name, action1, action2) = pretty_resource_name(&item_name);
|
||||||
|
@ -143,7 +143,7 @@ fn format_sanitizer_accum(
|
||||||
value += &if let Some(trace) = trace {
|
value += &if let Some(trace) = trace {
|
||||||
format!(" The operation {tense} started here:\n{trace}")
|
format!(" The operation {tense} started here:\n{trace}")
|
||||||
} else {
|
} else {
|
||||||
needs_trace_ops = true;
|
needs_trace_leaks = true;
|
||||||
String::new()
|
String::new()
|
||||||
};
|
};
|
||||||
output.push(value);
|
output.push(value);
|
||||||
|
@ -157,8 +157,8 @@ fn format_sanitizer_accum(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if needs_trace_ops {
|
if needs_trace_leaks {
|
||||||
(output, vec!["To get more details where ops were leaked, run again with --trace-ops flag.".to_owned()])
|
(output, vec!["To get more details where leaks occurred, run again with the --trace-leaks flag.".to_owned()])
|
||||||
} else {
|
} else {
|
||||||
(output, vec![])
|
(output, vec![])
|
||||||
}
|
}
|
||||||
|
@ -360,5 +360,5 @@ mod tests {
|
||||||
// https://github.com/denoland/deno/issues/13938
|
// https://github.com/denoland/deno/issues/13938
|
||||||
leak_format_test!(op_unknown, true, [RuntimeActivity::AsyncOp(0, None, "op_unknown")],
|
leak_format_test!(op_unknown, true, [RuntimeActivity::AsyncOp(0, None, "op_unknown")],
|
||||||
" - An async call to op_unknown was started in this test, but never completed.\n\
|
" - An async call to op_unknown was started in this test, but never completed.\n\
|
||||||
To get more details where ops were leaked, run again with --trace-ops flag.\n");
|
To get more details where leaks occurred, run again with the --trace-leaks flag.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -440,7 +440,7 @@ struct TestSpecifiersOptions {
|
||||||
pub struct TestSpecifierOptions {
|
pub struct TestSpecifierOptions {
|
||||||
pub shuffle: Option<u64>,
|
pub shuffle: Option<u64>,
|
||||||
pub filter: TestFilter,
|
pub filter: TestFilter,
|
||||||
pub trace_ops: bool,
|
pub trace_leaks: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestSummary {
|
impl TestSummary {
|
||||||
|
@ -559,7 +559,7 @@ async fn test_specifier_inner(
|
||||||
|
|
||||||
let mut coverage_collector = worker.maybe_setup_coverage_collector().await?;
|
let mut coverage_collector = worker.maybe_setup_coverage_collector().await?;
|
||||||
|
|
||||||
if options.trace_ops {
|
if options.trace_leaks {
|
||||||
worker.execute_script_static(
|
worker.execute_script_static(
|
||||||
located_script_name!(),
|
located_script_name!(),
|
||||||
"Deno[Deno.internal].core.setLeakTracingEnabled(true);",
|
"Deno[Deno.internal].core.setLeakTracingEnabled(true);",
|
||||||
|
@ -1503,7 +1503,7 @@ pub async fn run_tests(
|
||||||
specifier: TestSpecifierOptions {
|
specifier: TestSpecifierOptions {
|
||||||
filter: TestFilter::from_flag(&test_options.filter),
|
filter: TestFilter::from_flag(&test_options.filter),
|
||||||
shuffle: test_options.shuffle,
|
shuffle: test_options.shuffle,
|
||||||
trace_ops: test_options.trace_ops,
|
trace_leaks: test_options.trace_leaks,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1647,7 +1647,7 @@ pub async fn run_tests_with_watch(
|
||||||
specifier: TestSpecifierOptions {
|
specifier: TestSpecifierOptions {
|
||||||
filter: TestFilter::from_flag(&test_options.filter),
|
filter: TestFilter::from_flag(&test_options.filter),
|
||||||
shuffle: test_options.shuffle,
|
shuffle: test_options.shuffle,
|
||||||
trace_ops: test_options.trace_ops,
|
trace_leaks: test_options.trace_leaks,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -231,7 +231,7 @@ itest!(ops_sanitizer_timeout_failure {
|
||||||
|
|
||||||
itest!(ops_sanitizer_multiple_timeout_tests {
|
itest!(ops_sanitizer_multiple_timeout_tests {
|
||||||
args:
|
args:
|
||||||
"test --trace-ops test/sanitizer/ops_sanitizer_multiple_timeout_tests.ts",
|
"test --trace-leaks test/sanitizer/ops_sanitizer_multiple_timeout_tests.ts",
|
||||||
exit_code: 1,
|
exit_code: 1,
|
||||||
output: "test/sanitizer/ops_sanitizer_multiple_timeout_tests.out",
|
output: "test/sanitizer/ops_sanitizer_multiple_timeout_tests.out",
|
||||||
});
|
});
|
||||||
|
@ -243,13 +243,13 @@ itest!(ops_sanitizer_multiple_timeout_tests_no_trace {
|
||||||
});
|
});
|
||||||
|
|
||||||
itest!(sanitizer_trace_ops_catch_error {
|
itest!(sanitizer_trace_ops_catch_error {
|
||||||
args: "test -A --trace-ops test/sanitizer/trace_ops_caught_error/main.ts",
|
args: "test -A --trace-leaks test/sanitizer/trace_ops_caught_error/main.ts",
|
||||||
exit_code: 0,
|
exit_code: 0,
|
||||||
output: "test/sanitizer/trace_ops_caught_error/main.out",
|
output: "test/sanitizer/trace_ops_caught_error/main.out",
|
||||||
});
|
});
|
||||||
|
|
||||||
itest!(ops_sanitizer_closed_inside_started_before {
|
itest!(ops_sanitizer_closed_inside_started_before {
|
||||||
args: "test --trace-ops test/sanitizer/ops_sanitizer_closed_inside_started_before.ts",
|
args: "test --trace-leaks test/sanitizer/ops_sanitizer_closed_inside_started_before.ts",
|
||||||
exit_code: 1,
|
exit_code: 1,
|
||||||
output: "test/sanitizer/ops_sanitizer_closed_inside_started_before.out",
|
output: "test/sanitizer/ops_sanitizer_closed_inside_started_before.out",
|
||||||
});
|
});
|
||||||
|
|
|
@ -8,12 +8,12 @@ test 2 ... FAILED ([WILDCARD])
|
||||||
test 1 => [WILDCARD]/ops_sanitizer_multiple_timeout_tests.ts:[WILDCARD]
|
test 1 => [WILDCARD]/ops_sanitizer_multiple_timeout_tests.ts:[WILDCARD]
|
||||||
error: Leaks detected:
|
error: Leaks detected:
|
||||||
- 2 async operations to sleep for a duration were started in this test, but never completed. This is often caused by not cancelling a `setTimeout` or `setInterval` call.
|
- 2 async operations to sleep for a duration were started in this test, but never completed. This is often caused by not cancelling a `setTimeout` or `setInterval` call.
|
||||||
To get more details where ops were leaked, run again with --trace-ops flag.
|
To get more details where leaks occurred, run again with the --trace-leaks flag.
|
||||||
|
|
||||||
test 2 => [WILDCARD]/ops_sanitizer_multiple_timeout_tests.ts:[WILDCARD]
|
test 2 => [WILDCARD]/ops_sanitizer_multiple_timeout_tests.ts:[WILDCARD]
|
||||||
error: Leaks detected:
|
error: Leaks detected:
|
||||||
- 2 async operations to sleep for a duration were started in this test, but never completed. This is often caused by not cancelling a `setTimeout` or `setInterval` call.
|
- 2 async operations to sleep for a duration were started in this test, but never completed. This is often caused by not cancelling a `setTimeout` or `setInterval` call.
|
||||||
To get more details where ops were leaked, run again with --trace-ops flag.
|
To get more details where leaks occurred, run again with the --trace-leaks flag.
|
||||||
|
|
||||||
FAILURES
|
FAILURES
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
⚠️ The `--trace-ops` flag is deprecated and will be removed in Deno 2.0.
|
||||||
|
Use the `--trace-leaks` flag instead.
|
||||||
Check [WILDCARD]/ops_sanitizer_unstable.ts
|
Check [WILDCARD]/ops_sanitizer_unstable.ts
|
||||||
running 2 tests from [WILDCARD]/ops_sanitizer_unstable.ts
|
running 2 tests from [WILDCARD]/ops_sanitizer_unstable.ts
|
||||||
no-op ... ok ([WILDCARD])
|
no-op ... ok ([WILDCARD])
|
||||||
|
|
Loading…
Reference in a new issue