Hi David, On Tue, Oct 29, 2024 at 05:24:18PM +0800, David Gow wrote: > From: José Expósito <jose.exposito89@xxxxxxxxx> > > Add a new procedural macro (`#[kunit_tests(kunit_test_suit_name)]`) to > run KUnit tests using a user-space like syntax. > > The macro, that should be used on modules, transforms every `#[test]` > in a `kunit_case!` and adds a `kunit_unsafe_test_suite!` registering > all of them. > > The only difference with user-space tests is that instead of using > `#[cfg(test)]`, `#[kunit_tests(kunit_test_suit_name)]` is used. > > Note that `#[cfg(CONFIG_KUNIT)]` is added so the test module is not > compiled when `CONFIG_KUNIT` is set to `n`. > > Reviewed-by: David Gow <davidgow@xxxxxxxxxx> > Signed-off-by: José Expósito <jose.exposito89@xxxxxxxxx> > [Updated to use new const fn.] > Signed-off-by: David Gow <davidgow@xxxxxxxxxx> > --- > > Changes since v1: > https://lore.kernel.org/lkml/20230720-rustbind-v1-2-c80db349e3b5@xxxxxxxxxx/ > - Rebased on top of rust-next > - Make use of the new const functions, rather than the kunit_case!() > macro. > > --- > MAINTAINERS | 1 + > rust/kernel/kunit.rs | 11 +++++++++++ > rust/macros/lib.rs | 29 +++++++++++++++++++++++++++++ > 3 files changed, 41 insertions(+) > > diff --git a/MAINTAINERS b/MAINTAINERS > index b77f4495dcf4..b65035ede675 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -12433,6 +12433,7 @@ F: Documentation/dev-tools/kunit/ > F: include/kunit/ > F: lib/kunit/ > F: rust/kernel/kunit.rs > +F: rust/macros/kunit.rs I cannot find this file in this series, and it's not in the current rust-next either. (Did you do the same thing as I sometimes did: forget to `git add` a new file?) Regards, Boqun > F: scripts/rustdoc_test_* > F: tools/testing/kunit/ > > diff --git a/rust/kernel/kunit.rs b/rust/kernel/kunit.rs > index fc2d259db458..abcf0229ffee 100644 > --- a/rust/kernel/kunit.rs > +++ b/rust/kernel/kunit.rs > @@ -40,6 +40,8 @@ pub fn info(args: fmt::Arguments<'_>) { > } > } > > +use macros::kunit_tests; > + > /// Asserts that a boolean expression is `true` at runtime. > /// > /// Public but hidden since it should only be used from generated tests. > @@ -269,3 +271,12 @@ macro_rules! kunit_unsafe_test_suite { > }; > }; > } > + > +#[kunit_tests(rust_kernel_kunit)] > +mod tests { > + #[test] > + fn rust_test_kunit_kunit_tests() { > + let running = true; > + assert_eq!(running, true); > + } > +} > diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs > index 939ae00b723a..098925b99982 100644 > --- a/rust/macros/lib.rs > +++ b/rust/macros/lib.rs > @@ -10,6 +10,7 @@ > mod quote; > mod concat_idents; > mod helpers; > +mod kunit; > mod module; > mod paste; > mod pin_data; > @@ -430,3 +431,31 @@ pub fn paste(input: TokenStream) -> TokenStream { > pub fn derive_zeroable(input: TokenStream) -> TokenStream { > zeroable::derive(input) > } > + > +/// Registers a KUnit test suite and its test cases using a user-space like syntax. > +/// > +/// This macro should be used on modules. If `CONFIG_KUNIT` (in `.config`) is `n`, the target module > +/// is ignored. > +/// > +/// # Examples > +/// > +/// ```ignore > +/// # use macros::kunit_tests; > +/// > +/// #[kunit_tests(kunit_test_suit_name)] > +/// mod tests { > +/// #[test] > +/// fn foo() { > +/// assert_eq!(1, 1); > +/// } > +/// > +/// #[test] > +/// fn bar() { > +/// assert_eq!(2, 2); > +/// } > +/// } > +/// ``` > +#[proc_macro_attribute] > +pub fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream { > + kunit::kunit_tests(attr, ts) > +} > -- > 2.47.0.163.g1226f6d8fa-goog > >