lib.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use proc_macro::TokenStream;
  2. use proc_macro2::Span;
  3. use quote::quote;
  4. use syn::{parse_macro_input, Ident, ItemFn};
  5. #[proc_macro_attribute]
  6. pub fn integration_test(_attr: TokenStream, item: TokenStream) -> TokenStream {
  7. let item = parse_macro_input!(item as ItemFn);
  8. let name = &item.sig.ident;
  9. let name_str = &item.sig.ident.to_string();
  10. let expanded = quote! {
  11. #item
  12. inventory::submit!(crate::IntegrationTest {
  13. name: concat!(module_path!(), "::", #name_str),
  14. test_fn: #name,
  15. });
  16. };
  17. TokenStream::from(expanded)
  18. }
  19. #[proc_macro_attribute]
  20. pub fn tokio_integration_test(_attr: TokenStream, item: TokenStream) -> TokenStream {
  21. let item = parse_macro_input!(item as ItemFn);
  22. let name = &item.sig.ident;
  23. let name_str = &item.sig.ident.to_string();
  24. let sync_name_str = format!("sync_{name_str}");
  25. let sync_name = Ident::new(&sync_name_str, Span::call_site());
  26. let expanded = quote! {
  27. #item
  28. fn #sync_name() {
  29. let rt = tokio::runtime::Builder::new_current_thread()
  30. .enable_all()
  31. .build()
  32. .unwrap();
  33. rt.block_on(#name());
  34. }
  35. inventory::submit!(crate::IntegrationTest {
  36. name: concat!(module_path!(), "::", #sync_name_str),
  37. test_fn: #sync_name,
  38. });
  39. };
  40. TokenStream::from(expanded)
  41. }