diff --git a/ext-functional-test-demo/src/main.rs b/ext-functional-test-demo/src/main.rs index 98a554b07e5..4636e115015 100644 --- a/ext-functional-test-demo/src/main.rs +++ b/ext-functional-test-demo/src/main.rs @@ -1,5 +1,5 @@ fn main() { - println!("Hello, world!"); + println!("{} tests were exported", lightning::get_xtests().len()); } #[cfg(test)] diff --git a/ext-test-macro/Cargo.toml b/ext-test-macro/Cargo.toml index c1220431591..6c9de75016d 100644 --- a/ext-test-macro/Cargo.toml +++ b/ext-test-macro/Cargo.toml @@ -12,3 +12,6 @@ proc-macro = true syn = { version = "1.0", features = ["full"] } quote = "1.0" proc-macro2 = "1.0" + +[dev-dependencies] +inventory = "0.3" diff --git a/ext-test-macro/src/lib.rs b/ext-test-macro/src/lib.rs index 08f8b6ecf85..76acca974b2 100644 --- a/ext-test-macro/src/lib.rs +++ b/ext-test-macro/src/lib.rs @@ -74,9 +74,18 @@ pub fn xtest(attrs: TokenStream, item: TokenStream) -> TokenStream { .into(); } + let fn_name = &item_fn.sig.ident; + let fn_name_str = fn_name.to_string(); quote! { #cfg_attr #item_fn + + inventory::submit! { + crate::XTestItem { + test_fn: #fn_name, + test_name: #fn_name_str, + } + } } }, _ => { @@ -91,3 +100,36 @@ pub fn xtest(attrs: TokenStream, item: TokenStream) -> TokenStream { TokenStream::from(expanded) } + +#[proc_macro] +pub fn xtest_inventory(_input: TokenStream) -> TokenStream { + let expanded = quote! { + pub struct XTestItem { + pub test_fn: fn(), + pub test_name: &'static str, + } + + inventory::collect!(XTestItem); + + pub fn get_xtests() -> Vec<&'static XTestItem> { + inventory::iter:: + .into_iter() + .collect() + } + + #[macro_export] + macro_rules! xtest_inventory { + ($test_fn:expr, $test_name:expr) => { + inventory::submit! { + XTestItem { + test_fn: $test_fn, + test_name: $test_name, + } + } + }; + } + }; + + TokenStream::from(expanded) +} + diff --git a/lightning/Cargo.toml b/lightning/Cargo.toml index 40ad96b79eb..1f481f5c0cd 100644 --- a/lightning/Cargo.toml +++ b/lightning/Cargo.toml @@ -17,7 +17,7 @@ rustdoc-args = ["--cfg", "docsrs"] [features] # Internal test utilities exposed to other repo crates -_test_utils = ["regex", "bitcoin/bitcoinconsensus", "ext-test-macro", "lightning-types/_test_utils"] +_test_utils = ["regex", "bitcoin/bitcoinconsensus", "ext-test-macro", "lightning-types/_test_utils", "inventory"] # Unlog messages superior at targeted level. max_level_off = [] max_level_error = [] @@ -51,11 +51,13 @@ backtrace = { version = "0.3", optional = true } libm = { version = "0.2", default-features = false } delegate = "0.12.0" ext-test-macro = { path = "../ext-test-macro", optional = true } +inventory = { version = "0.3", optional = true } [dev-dependencies] regex = "1.5.6" lightning-types = { version = "0.1.0", path = "../lightning-types", features = ["_test_utils"] } ext-test-macro = { path = "../ext-test-macro" } +inventory = { version = "0.3" } [dev-dependencies.bitcoin] version = "0.32.2" diff --git a/lightning/src/lib.rs b/lightning/src/lib.rs index 106a8fdd677..c501c267897 100644 --- a/lightning/src/lib.rs +++ b/lightning/src/lib.rs @@ -149,3 +149,6 @@ mod prelude { extern crate backtrace; mod sync; + +#[cfg(feature = "_test_utils")] +ext_test_macro::xtest_inventory!();