Add test timout

This commit is contained in:
2022-06-16 13:48:08 +00:00
committed by GitHub
parent 8231792bf0
commit e538ee5715
5 changed files with 108 additions and 1 deletions

View File

@@ -11,5 +11,6 @@ path = "proc_macros.rs"
proc-macro = true
[dependencies]
parse_duration = "2"
quote = "1"
syn = "1"
syn = { version = "1", features = ["full"] }

View File

@@ -1,3 +1,4 @@
extern crate parse_duration;
extern crate quote;
extern crate syn;
@@ -5,6 +6,9 @@ use proc_macro::TokenStream;
use quote::quote;
use syn::parse_macro_input;
use syn::Ident;
use syn::ItemFn;
use syn::LitInt;
use syn::LitStr;
#[proc_macro]
pub fn define_struct_reader_fn(item: TokenStream) -> TokenStream {
@@ -79,3 +83,31 @@ pub fn impl_struct_writer_write(item: TokenStream) -> TokenStream {
};
stream.into()
}
#[proc_macro_attribute]
pub fn async_timeout_test(attr: TokenStream, item: TokenStream) -> TokenStream {
let ItemFn {
attrs,
vis,
sig,
block,
} = parse_macro_input!(item as ItemFn);
let meta = parse_macro_input!(attr as LitStr);
let dura = parse_duration::parse(meta.value().as_str()).unwrap();
let secs = LitInt::new(format!("{}", dura.as_secs()).as_str(), sig.ident.span());
let nanos = LitInt::new(
format!("{}", dura.subsec_nanos()).as_str(),
sig.ident.span(),
);
let stmts = &block.stmts;
let stream = quote! {
#(#attrs)* #vis #sig {
let dura = std::time::Duration::new(#secs, #nanos);
let f = async {
#(#stmts)*
};
tokio::time::timeout(dura, f).await.unwrap();
}
};
stream.into()
}