File: hwdb.rs

package info (click to toggle)
rust-udevrs 0.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,240 kB
  • sloc: makefile: 2
file content (115 lines) | stat: -rw-r--r-- 3,071 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use std::sync::Arc;

use udevrs::{Error, Result, Udev, UdevHwdb};

mod common;

//#[test]
fn parse_hwdb() -> Result<()> {
    common::init();

    std::env::set_var("UDEV_HWDB_BIN", "./hwdb.bin");
    let udev = Arc::new(Udev::new());

    let mut hwdb = UdevHwdb::new(udev)?;

    // vendor
    let root_hub = hwdb
        .query("usb:v1D6B")
        .ok_or(Error::UdevHwdb(
            "no matching entry found for usb:v1D6B".into(),
        ))?
        .iter()
        .find(|e| e.name() == "ID_VENDOR_FROM_DATABASE")
        .map(|e| (e.value()));

    assert_eq!(root_hub, Some("Linux Foundation"));

    // pci in example
    let pci = hwdb
        .query("pci:v00008086d00001C2D*")
        .ok_or(Error::UdevHwdb(
            "no matching entry found for pci:v00008086d00001C2D".into(),
        ))?
        .iter()
        .find(|e| e.name() == "ID_VENDOR_FROM_DATABASE")
        .map(|e| (e.value()));

    assert_eq!(pci, Some("Intel Corporation"));

    // vendor and product
    let root_hub_30 = hwdb
        .query("usb:v1D6Bp0003")
        .ok_or(Error::UdevHwdb(
            "no matching entry found for usb:v1D6Bp0003".into(),
        ))?
        .iter()
        .find(|e| e.name() == "ID_MODEL_FROM_DATABASE")
        .map(|e| (e.value()));

    assert_eq!(root_hub_30, Some("3.0 root hub"));

    // class
    let hid = hwdb
        .query("usb:v*p*d*dc03*")
        .ok_or(Error::UdevHwdb(
            "no matching entry found for usb:v*p*d*dc03*".into(),
        ))?
        .iter()
        .find(|e| e.name() == "ID_USB_CLASS_FROM_DATABASE")
        .map(|e| (e.value()));

    assert_eq!(hid, Some("Human Interface Device"));

    // specific class, subclass and protocol
    let query = hwdb
        .query("usb:v*p*d*dc03dsc01dp01dp01")
        .ok_or(Error::UdevHwdb(
            "no matching entry found for usb:v*p*d*dc03*dsc01".into(),
        ))?;
    let subclass = query
        .iter()
        .find(|e| e.name() == "ID_USB_SUBCLASS_FROM_DATABASE")
        .map(|e| (e.value()));
    let protocol = query
        .iter()
        .find(|e| e.name() == "ID_USB_PROTOCOL_FROM_DATABASE")
        .map(|e| (e.value()));

    assert_eq!(subclass, Some("Boot Interface Subclass"));
    assert_eq!(protocol, Some("Keyboard"));

    // class, subclass and protocol wildcard at end
    let at = hwdb
        .query("usb:v*p*d*dc02dsc02dp05*")
        .ok_or(Error::UdevHwdb(
            "no matching entry found for usb:v*p*d*dc02dsc02dp05*".into(),
        ))?
        .iter()
        .find(|e| e.name() == "ID_USB_PROTOCOL_FROM_DATABASE")
        .map(|e| (e.value()));

    assert_eq!(at, Some("AT-commands (3G)"));

    Ok(())
}

#[test]
fn invalid_queries() -> Result<()> {
    common::init();

    std::env::set_var("UDEV_HWDB_BIN", "./hwdb.bin");
    let udev = Arc::new(Udev::new());

    let mut hwdb = UdevHwdb::new(udev)?;
    let query = hwdb.query("");
    assert!(query.is_none());

    let query = hwdb.query("*x*");
    assert!(query.is_none());

    let query = hwdb.query("null:v1D6B");
    assert!(query.is_none());

    Ok(())
}