mirror of
https://github.com/denoland/deno.git
synced 2025-10-02 23:24:37 +00:00
chore: Add timeout!
macro to test_util
(#22539)
Our `itest` macros will occasionally run away and fail ~2 hours later. This aborts all testcases after 2 minutes.
This commit is contained in:
parent
118445103b
commit
e8b1925172
1 changed files with 41 additions and 0 deletions
|
@ -1,10 +1,50 @@
|
||||||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
// https://stackoverflow.com/questions/38088067/equivalent-of-func-or-function-in-rust
|
||||||
|
macro_rules! function {
|
||||||
|
() => {{
|
||||||
|
fn f() {}
|
||||||
|
fn type_name_of<T>(_: T) -> &'static str {
|
||||||
|
::std::any::type_name::<T>()
|
||||||
|
}
|
||||||
|
let name = type_name_of(f);
|
||||||
|
let name = name.strip_suffix("::f").unwrap_or(name);
|
||||||
|
let name = name.strip_suffix("::{{closure}}").unwrap_or(name);
|
||||||
|
name
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Detect a test timeout and panic with a message that includes the test name.
|
||||||
|
/// By default, the test timeout is 300 seconds (5 minutes), but any value may
|
||||||
|
/// be specified as an argument to this function.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! timeout {
|
||||||
|
( $($timeout:literal)? ) => {
|
||||||
|
struct TestTimeoutHolder(::std::sync::mpsc::Sender<()>);
|
||||||
|
|
||||||
|
let _test_timeout_holder = {
|
||||||
|
let function = $crate::function!();
|
||||||
|
let (tx, rx) = ::std::sync::mpsc::channel::<()>();
|
||||||
|
let timeout: &[u64] = &[$($timeout)?];
|
||||||
|
let timeout = *timeout.get(0).unwrap_or(&300);
|
||||||
|
::std::thread::spawn(move || {
|
||||||
|
if rx.recv_timeout(::std::time::Duration::from_secs(timeout)) == Err(::std::sync::mpsc::RecvTimeoutError::Timeout) {
|
||||||
|
eprintln!("Test {function} timed out after {timeout} seconds, aborting");
|
||||||
|
::std::process::exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
TestTimeoutHolder(tx)
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! itest(
|
macro_rules! itest(
|
||||||
($name:ident {$( $key:ident: $value:expr,)*}) => {
|
($name:ident {$( $key:ident: $value:expr,)*}) => {
|
||||||
#[test]
|
#[test]
|
||||||
fn $name() {
|
fn $name() {
|
||||||
|
$crate::timeout!();
|
||||||
let test = $crate::CheckOutputIntegrationTest {
|
let test = $crate::CheckOutputIntegrationTest {
|
||||||
$(
|
$(
|
||||||
$key: $value,
|
$key: $value,
|
||||||
|
@ -28,6 +68,7 @@ macro_rules! itest_flaky(
|
||||||
($name:ident {$( $key:ident: $value:expr,)*}) => {
|
($name:ident {$( $key:ident: $value:expr,)*}) => {
|
||||||
#[flaky_test::flaky_test]
|
#[flaky_test::flaky_test]
|
||||||
fn $name() {
|
fn $name() {
|
||||||
|
$crate::timeout!();
|
||||||
let test = $crate::CheckOutputIntegrationTest {
|
let test = $crate::CheckOutputIntegrationTest {
|
||||||
$(
|
$(
|
||||||
$key: $value,
|
$key: $value,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue