From 0fd57e5bd988292310cc299ff9bdce956c529753 Mon Sep 17 00:00:00 2001 From: liye Date: Tue, 19 Aug 2025 16:28:27 +0800 Subject: [PATCH] hid-devices: add unit test --- devices/src/usb/keyboard.rs | 73 ++++++++++++++++++++++++ devices/src/usb/tablet.rs | 108 ++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) diff --git a/devices/src/usb/keyboard.rs b/devices/src/usb/keyboard.rs index 418d6043..cc05e241 100644 --- a/devices/src/usb/keyboard.rs +++ b/devices/src/usb/keyboard.rs @@ -262,3 +262,76 @@ impl UsbDevice for UsbKeyboard { self.cntlr.clone() } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_keyboard_interface() { + let interface_descriptor = &DESC_IFACE_KEYBOARD.clone().interface_desc; + // bInterfaceClass: 3(HID) + assert_eq!(interface_descriptor.bInterfaceClass, 3); + // bInterfaceSubClass: 0(No Subclass) 1(Boot Interface Subclass) 2-255(Reserved) + assert_eq!(interface_descriptor.bInterfaceSubClass, 1); + // bInterfaceProtocol: 0(None) 1(Keyboard) 2(Mouse) 3-255(Reserved) + assert_eq!(interface_descriptor.bInterfaceProtocol, 1); + } + + #[test] + fn test_usb_device_method() { + let mut keyboard = UsbKeyboard::new(UsbKeyboardConfig { + classtype: "usb-keyboard".to_string(), + id: "keyboard".to_string(), + bus: None, + port: None, + }); + + let _ = &keyboard.reset(); + let _ = &keyboard.unrealize(); + let _ = &keyboard.get_controller(); + let device_req = UsbDeviceRequest { + request_type: USB_DEVICE_OUT_REQUEST, + request: USB_REQUEST_SET_ADDRESS, + value: 0, + index: 0, + length: 0, + }; + let target_dev = + Arc::downgrade(&Arc::new(Mutex::new(keyboard))) as Weak>; + let packet = Arc::new(Mutex::new(UsbPacket::new( + 1, + u32::from(USB_TOKEN_OUT), + 0, + 0, + Vec::new(), + None, + Some(target_dev), + ))); + let mut keyboard = UsbKeyboard::new(UsbKeyboardConfig { + classtype: "usb-keyboard".to_string(), + id: "keyboard".to_string(), + bus: None, + port: None, + }); + let _ = &keyboard.handle_control(&packet, &device_req); + let _ = &keyboard.handle_data(&packet); + let _ = &keyboard.cancel_packet(&packet); + let _ = &keyboard.realize(); + } + + #[test] + fn test_key_event() { + let mut usb_adapter = UsbKeyboardAdapter { + usb_kbd: Arc::new(Mutex::new(UsbKeyboard::new(UsbKeyboardConfig { + classtype: "usb-keyboard".to_string(), + id: "keyboard".to_string(), + bus: None, + port: None, + }))), + }; + // 0x0057: scancode of F11 + let _ = usb_adapter.do_key_event(0x0057, true); + let _ = usb_adapter.do_key_event(0x0057, false); + } +} diff --git a/devices/src/usb/tablet.rs b/devices/src/usb/tablet.rs index b9c54fc9..a7a17bee 100644 --- a/devices/src/usb/tablet.rs +++ b/devices/src/usb/tablet.rs @@ -303,3 +303,111 @@ impl UsbDevice for UsbTablet { self.cntlr.clone() } } + +#[cfg(test)] +mod tests { + use super::*; + use ui::input::{ButtonEvent, KeyEvent, MoveEvent}; + + #[test] + fn test_tablet_interface() { + let interface_descriptor = &DESC_IFACE_TABLET.clone().interface_desc; + // bInterfaceClass: 3(HID) + assert_eq!(interface_descriptor.bInterfaceClass, 3); + // bInterfaceSubClass: 0(No Subclass) 1(Boot Interface Subclass) 2-255(Reserved) + assert_eq!(interface_descriptor.bInterfaceSubClass, 0); + // bInterfaceProtocol: 0(None) 1(Keyboard) 2(Mouse) 3-255(Reserved) + assert_eq!(interface_descriptor.bInterfaceProtocol, 0); + } + + #[test] + fn test_usb_device_method() { + let mut tablet = UsbTablet::new(UsbTabletConfig { + classtype: "usb-tablet".to_string(), + id: "tablet".to_string(), + bus: None, + port: None, + }); + + let _ = &tablet.reset(); + let _ = &tablet.unrealize(); + let _ = &tablet.get_controller(); + let device_req = UsbDeviceRequest { + request_type: USB_DEVICE_OUT_REQUEST, + request: USB_REQUEST_SET_ADDRESS, + value: 0, + index: 0, + length: 0, + }; + let target_dev = + Arc::downgrade(&Arc::new(Mutex::new(tablet))) as Weak>; + let packet = Arc::new(Mutex::new(UsbPacket::new( + 1, + u32::from(USB_TOKEN_OUT), + 0, + 0, + Vec::new(), + None, + Some(target_dev), + ))); + let mut tablet = UsbTablet::new(UsbTabletConfig { + classtype: "usb-tablet".to_string(), + id: "tablet".to_string(), + bus: None, + port: None, + }); + let _ = &tablet.handle_control(&packet, &device_req); + let _ = &tablet.handle_data(&packet); + let _ = &tablet.cancel_packet(&packet); + let _ = &tablet.realize(); + } + + #[test] + fn test_tablet_event() { + let mut usb_adapter = UsbTabletAdapter { + tablet: Arc::new(Mutex::new(UsbTablet::new(UsbTabletConfig { + classtype: "usb-tablet".to_string(), + id: "tablet".to_string(), + bus: None, + port: None, + }))), + }; + + // test button event + let press_button_event = InputEvent { + input_type: InputType::ButtonEvent, + move_event: MoveEvent::default(), + button_event: ButtonEvent { + button: INPUT_BUTTON_WHEEL_UP, + down: true, + }, + key_event: KeyEvent::default(), + }; + let _ = usb_adapter.update_point_state(press_button_event); + + let release_button_event = InputEvent { + input_type: InputType::ButtonEvent, + move_event: MoveEvent::default(), + button_event: ButtonEvent { + button: INPUT_BUTTON_WHEEL_UP, + down: false, + }, + key_event: KeyEvent::default(), + }; + let _ = usb_adapter.update_point_state(release_button_event); + + // test move event + let move_event = InputEvent { + input_type: InputType::MoveEvent, + move_event: MoveEvent::default(), + button_event: ButtonEvent::default(), + key_event: KeyEvent::default(), + }; + let _ = usb_adapter.update_point_state(move_event); + + match usb_adapter.sync() { + Ok(_) => true, + Err(_) => false, + }; + } +} -- Gitee