#usb-device #testing #embedded

usbd-class-tester

用于测试 usb-device 设备类的库

4 个版本 (2 个破坏性更新)

0.3.0 2024年4月21日
0.2.1 2024年4月12日
0.2.0 2024年4月12日
0.1.0 2024年4月6日

#743 in 硬件支持

MIT 许可证

54KB
1K SLoC

usbd-class-tester

Crates.io Docs.rs

用于在开发者的系统上本地运行对 usb-device 类进行测试的库。

关于

测试很困难,如果涉及到专用硬件和手动测试,则更困难。通常,即使在进行小的代码更改后,也需要重新测试许多内容。

此库旨在通过提供一种模拟主机对设备的访问手段,帮助测试基于 usb-device crate 的 USB 设备中协议的实现。

初始实现是为了在 usbd-dfu crate 中的测试而完成的。此库基于该想法,但扩展了很多。例如,它添加了一组方便的函数,用于控制传输,而最初这仅通过普通的 u8 数组来完成。

支持的操作

  • IN 和 OUT EP0 控制传输
  • 其他端点的传输(例如,中断)

不支持的操作

几乎所有其他内容,包括但不限于

  • 重置
  • 挂起和恢复
  • 批量传输
  • 等时传输
  • ...

许可证

本项目根据 MIT 许可证 (LICENSE) 许可。

贡献

除非您明确声明,否则您提交的任何有意提交到作品中并由您提交的贡献均应按上述方式许可,不附加任何额外条款或条件。

示例

该示例定义了一个空的 UsbClass 实现,用于 TestUsbClass。通常,这还包括诸如端点分配、特定于设备的描述符生成以及处理所有内容的代码。这不在本例的范围内。

一个最小的 TestCtx 创建 TestUsbClass,它将被传递到测试用例中。一般来说,TestCtx 允许一定程度的自定义环境,例如选择 EP0 传输大小,或重新定义如何创建 UsbDevice

检查 crate 测试目录以获取更多示例。

请参阅 usb-device 的文档。

use usb_device::class_prelude::*;
use usbd_class_tester::prelude::*;

// `UsbClass` under the test.
pub struct TestUsbClass {}
impl<B: UsbBus> UsbClass<B> for TestUsbClass {}

// Context to create a testable instance of `TestUsbClass`
struct TestCtx {}
impl UsbDeviceCtx for TestCtx {
    type C<'c> = TestUsbClass;
    fn create_class<'a>(
        &mut self,
        alloc: &'a UsbBusAllocator<EmulatedUsbBus>,
    ) -> AnyResult<TestUsbClass> {
        Ok(TestUsbClass {})
    }
}

#[test]
fn test_interface_get_status() {
    TestCtx {}
        .with_usb(|mut cls, mut dev| {
            let st = dev.interface_get_status(&mut cls, 0).expect("status");
            assert_eq!(st, 0);
        })
        .expect("with_usb");
}

可以通过运行测试来启用 USB 调试日志,例如:通过以下命令运行测试:$ RUST_LOG=trace cargo test -- --nocapture

依赖关系

~1.5MB
~30K SLoC