1use proc_macro::TokenStream;
23use proc_macro2::TokenStream as TokenStream2;
24use quote::quote;
25use syn::{ItemFn, ReturnType, parse_macro_input};
26
27#[proc_macro_attribute]
32pub fn test(attr: TokenStream, item: TokenStream) -> TokenStream {
33 test_impl(attr, item)
34}
35
36fn test_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
38 let args = TokenStream2::from(attr);
39 let item = parse_macro_input!(item as ItemFn);
40
41 let attrs = &item.attrs;
42 let async_ = &item.sig.asyncness;
43 let await_ = if async_.is_some() {
44 quote! {.await}
45 } else {
46 quote! {}
47 };
48 let inputs = &item.sig.inputs;
49 let body = &item.block;
50 let test_name = &item.sig.ident;
51
52 let ret = match &item.sig.output {
55 ReturnType::Default => quote! {},
56 ReturnType::Type(_, type_) => quote! {-> #type_},
57 };
58
59 quote! {
60 #[::mz_ore::test(
61 #args
62 )]
63 #(#attrs)*
64 #async_ fn #test_name() #ret {
65 #async_ fn test_impl(#inputs) #ret {
66 #body
67 }
68
69 let dyncfgs = [
70 {
71 let mut x = ::mz_dyncfg::ConfigUpdates::default();
73 x.add_dynamic("persist_inline_writes_single_max_bytes", ::mz_dyncfg::ConfigVal::Usize(0));
74 x.add_dynamic("persist_inline_writes_total_max_bytes", ::mz_dyncfg::ConfigVal::Usize(0));
75 x
76 },
77 {
78 let mut x = ::mz_dyncfg::ConfigUpdates::default();
80 x.add_dynamic("persist_inline_writes_single_max_bytes", ::mz_dyncfg::ConfigVal::Usize(4 * 1024));
81 x.add_dynamic("persist_inline_writes_total_max_bytes", ::mz_dyncfg::ConfigVal::Usize(1024 * 1024));
82 x
83 },
84 {
85 let mut x = ::mz_dyncfg::ConfigUpdates::default();
87 x.add_dynamic("persist_inline_writes_single_max_bytes", ::mz_dyncfg::ConfigVal::Usize(4 * 1024));
88 x.add_dynamic("persist_inline_writes_total_max_bytes", ::mz_dyncfg::ConfigVal::Usize(0));
89 x
90 },
91 {
92 let mut x = ::mz_dyncfg::ConfigUpdates::default();
94 x.add_dynamic("persist_claim_unclaimed_compactions", ::mz_dyncfg::ConfigVal::Bool(true));
95 x
96 },
97 {
98 let mut x = ::mz_dyncfg::ConfigUpdates::default();
99 x.add_dynamic("persist_record_schema_id", ::mz_dyncfg::ConfigVal::Bool(true));
100 x
101 },
102 {
103 let mut x = ::mz_dyncfg::ConfigUpdates::default();
104 x.add_dynamic("persist_encoding_enable_dictionary", ::mz_dyncfg::ConfigVal::Bool(true));
105 x
106 },
107 {
108 let mut x = ::mz_dyncfg::ConfigUpdates::default();
109 x.add_dynamic("persist_batch_max_run_len", ::mz_dyncfg::ConfigVal::Usize(4));
110 x
111 },
112
113 {
114 let mut x = ::mz_dyncfg::ConfigUpdates::default();
115 x.add_dynamic("persist_enable_incremental_compaction", ::mz_dyncfg::ConfigVal::Bool(true));
116 x
117 },
118 ];
119
120 for (idx, dyncfgs) in dyncfgs.into_iter().enumerate() {
121 let debug = dyncfgs.updates.iter().map(|(name, val)| {
122 format!(" {}={:?}", name, val)
123 }).collect::<String>();
124 eprintln!("mz_persist_proc::test {}{}", idx, debug);
125 test_impl(dyncfgs)#await_
126 }
127 }
128 }
129 .into()
130}