[PATCH 5/5] rust: drm: add KUnit tests for panel
Albert Esteve <[email protected]>
| Newsgroups | org.kernel.vger.rust-for-linux,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Add a test module to verify basic data type conversions and layout. The tests covers: - PanelOrientation and ConnectorType: TryFrom conversion for valid values and also out-of-range invalid inputs. - PanelContainer: layout invariants (offset, alignment, size) on which Panel::new relies on for memory access. Tests are gated on CONFIG_RUST_DRM_PANEL_KUNIT_TEST. Signed-off-by: Albert Esteve <[email protected]> --- rust/kernel/Kconfig.test | 10 ++++++ rust/kernel/drm/panel.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/rust/kernel/Kconfig.test b/rust/kernel/Kconfig.test index e6a5c7a795f0f..397b916dca0d4 100644 --- a/rust/kernel/Kconfig.test +++ b/rust/kernel/Kconfig.test @@ -83,4 +83,14 @@ config RUST_BITFIELD_KUNIT_TEST If unsure, say N. +config RUST_DRM_PANEL_KUNIT_TEST + bool "KUnit tests for Rust panel API" if !KUNIT_ALL_TESTS + default KUNIT_ALL_TESTS + help + This option enables KUnit tests for the Rust panel API. + These are only for development and testing, not for regular + kernel use cases. + + If unsure, say N. + endif diff --git a/rust/kernel/drm/panel.rs b/rust/kernel/drm/panel.rs index 8f87774e06ed7..3da203c39edd6 100644 --- a/rust/kernel/drm/panel.rs +++ b/rust/kernel/drm/panel.rs @@ -595,3 +595,90 @@ pub(crate) const fn build() -> &'static bindings::drm_panel_funcs { &Self::VTABLE } } + +#[cfg(CONFIG_RUST_DRM_PANEL_KUNIT_TEST)] +#[macros::kunit_tests(rust_kernel_drm_panel)] +mod tests { + use super::*; + use core::mem::{align_of, offset_of, size_of, ManuallyDrop, MaybeUninit}; + + struct TestData { + _ptr: *const u8, + _byte: u8, + } + + #[test] + fn panel_orientation() { + // Test valid values. + assert!(matches!( + PanelOrientation::try_from(-1), + Ok(PanelOrientation::Unknown) + )); + assert!(matches!( + PanelOrientation::try_from(0), + Ok(PanelOrientation::Normal) + )); + assert!(matches!( + PanelOrientation::try_from(1), + Ok(PanelOrientation::BottomUp) + )); + assert!(matches!( + PanelOrientation::try_from(2), + Ok(PanelOrientation::LeftUp) + )); + assert!(matches!( + PanelOrientation::try_from(3), + Ok(PanelOrientation::RightUp) + )); + + // Test invalid values. + assert!(PanelOrientation::try_from(4).is_err()); + assert!(PanelOrientation::try_from(-2).is_err()); + } + + #[test] + fn connector_type() { + // Test valid values. + assert!(matches!( + ConnectorType::try_from(0), + Ok(ConnectorType::Unknown) + )); + assert!(matches!( + ConnectorType::try_from(10), + Ok(ConnectorType::DisplayPort) + )); + assert!(matches!( + ConnectorType::try_from(14), + Ok(ConnectorType::eDP) + )); + assert!(matches!( + ConnectorType::try_from(16), + Ok(ConnectorType::DSI) + )); + assert!(matches!( + ConnectorType::try_from(20), + Ok(ConnectorType::USB) + )); + + // Test invalid values. + assert!(ConnectorType::try_from(21).is_err()); + } + + #[test] + fn panel_container_layout() { + assert_eq!(offset_of!(PanelContainer<TestData>, data), 0); + + assert_eq!(size_of::<ManuallyDrop<TestData>>(), size_of::<TestData>()); + + let panel_offset = offset_of!(PanelContainer<TestData>, panel); + assert_eq!( + panel_offset % align_of::<MaybeUninit<bindings::drm_panel>>(), + 0 + ); + + assert!( + size_of::<PanelContainer<TestData>>() + >= panel_offset + size_of::<bindings::drm_panel>() + ); + } +} -- 2.55.0