Skip to content

Commit c3d1a44

Browse files
author
Henri
committed
Fix failing device tests
1 parent 47c4881 commit c3d1a44

File tree

8 files changed

+124
-111
lines changed

8 files changed

+124
-111
lines changed

.github/workflows/rust.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626
run: cargo test --verbose
2727
- name: Doc
2828
run: cargo doc --all-features
29+
- name: Run device tests
30+
run: sudo -E env "PATH=$PATH" cargo test --tests --features device-test
2931

3032
cross-linux:
3133
runs-on: ubuntu-latest

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ rust-version = "1.64"
1313
serde = ["dep:serde"]
1414
tokio = ["dep:tokio"]
1515
stream-trait = ["tokio", "futures-core"]
16+
device-test = []
1617

1718
[dependencies]
1819
libc = { version = "0.2.121", features = ["extra_traits"]}

src/sync_stream.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,6 @@ pub use tokio_stream::EventStream;
889889
#[cfg(test)]
890890
mod tests {
891891
use super::*;
892-
use crate::tests::{get_test_device, key_event};
893892

894893
fn result_events_iter(
895894
events: &[input_event],
@@ -957,23 +956,4 @@ mod tests {
957956
assert_eq!(next(), (Err(false), None));
958957
assert_eq!(next(), (Err(false), None));
959958
}
960-
961-
#[test]
962-
pub fn test_get_key_state() -> Result<(), Box<dyn std::error::Error>> {
963-
let (input, mut output) = get_test_device()?;
964-
965-
output.emit(&[key_event(KeyCode::KEY_DOT, 1)])?;
966-
967-
assert_eq!(1, input.get_key_state()?.iter().count());
968-
assert!(input
969-
.get_key_state()?
970-
.iter()
971-
.all(|e| e.code() == KeyCode::KEY_DOT.code()));
972-
973-
output.emit(&[key_event(KeyCode::KEY_DOT, 0)])?;
974-
975-
assert_eq!(0, input.get_key_state()?.iter().count());
976-
977-
Ok(())
978-
}
979959
}

src/tests/attribute_set.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use crate::tests::get_test_device;
21
use crate::{AttributeSet, KeyCode};
32

43
#[test]
54
pub fn test_iteration_keys() -> std::io::Result<()> {
6-
let (input, _) = get_test_device()?;
5+
let mut keys: AttributeSet<KeyCode> = AttributeSet::new();
76

8-
let keys = input.supported_keys().unwrap();
7+
for code in 1..59 {
8+
keys.insert(KeyCode::new(code));
9+
}
910

1011
assert_eq!(58, keys.iter().count());
1112

src/tests/mod.rs

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1 @@
11
mod attribute_set;
2-
mod compensate;
3-
4-
use crate::uinput::VirtualDevice;
5-
use crate::{AttributeSet, BusType, Device, EventType, InputEvent, InputId, KeyCode, SwitchCode};
6-
use std::path::PathBuf;
7-
use std::thread;
8-
use std::time::Duration;
9-
10-
pub fn key_click(key: KeyCode) -> Vec<InputEvent> {
11-
vec![key_event(key, 1), key_event(key, 0)]
12-
}
13-
14-
pub fn key_event(key: KeyCode, key_state: i32) -> InputEvent {
15-
InputEvent::new(EventType::KEY.0, key.code(), key_state)
16-
}
17-
18-
pub fn get_test_device() -> std::io::Result<(Device, VirtualDevice)> {
19-
let (name, output) = get_device()?;
20-
21-
let mut input = Device::open(&name)?;
22-
23-
input.grab()?;
24-
25-
Ok((input, output))
26-
}
27-
28-
pub fn get_device() -> std::io::Result<(PathBuf, VirtualDevice)> {
29-
let mut keys: AttributeSet<KeyCode> = AttributeSet::new();
30-
for code in 1..59 {
31-
let key = KeyCode::new(code);
32-
let name = format!("{:?}", key);
33-
if name.starts_with("KEY_") {
34-
keys.insert(key);
35-
}
36-
}
37-
38-
let mut sw: AttributeSet<SwitchCode> = AttributeSet::new();
39-
40-
sw.insert(SwitchCode::SW_LID);
41-
sw.insert(SwitchCode::SW_TABLET_MODE);
42-
43-
let mut device = VirtualDevice::builder()?
44-
.input_id(InputId::new(BusType::BUS_USB, 0x1234, 0x5678, 0x111))
45-
.name("test device")
46-
.with_keys(&keys)?
47-
.with_switches(&sw)?
48-
.build()?;
49-
50-
// Fetch name.
51-
let d: Vec<std::path::PathBuf> = device
52-
.enumerate_dev_nodes_blocking()?
53-
.map(|p| p.unwrap())
54-
.collect();
55-
56-
thread::sleep(Duration::from_millis(100)); // To avoid permission denied.
57-
58-
Ok((d.first().unwrap().clone(), device))
59-
}
60-
61-
pub fn final_dot_state(start_state: i32, events: impl Iterator<Item = InputEvent>) -> i32 {
62-
events.fold(start_state, |state, ev| {
63-
if ev.event_type() == EventType::KEY && ev.code() == KeyCode::KEY_DOT.code() {
64-
if ev.value() == 0 {
65-
0
66-
} else {
67-
1
68-
}
69-
} else {
70-
state
71-
}
72-
})
73-
}
74-
75-
pub fn final_event_state(key: KeyCode, events: &Vec<InputEvent>) -> Option<i32> {
76-
events.iter().fold(None, |state, ev| {
77-
if ev.event_type() == EventType::KEY && ev.code() == key.code() {
78-
if ev.value() == 0 {
79-
Some(0)
80-
} else {
81-
Some(1)
82-
}
83-
} else {
84-
state
85-
}
86-
})
87-
}

tests/common/mod.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#![allow(dead_code)]
2+
3+
use evdev::uinput::VirtualDevice;
4+
use evdev::{AttributeSet, BusType, Device, EventType, InputEvent, InputId, KeyCode, SwitchCode};
5+
use std::path::PathBuf;
6+
use std::thread;
7+
use std::time::Duration;
8+
9+
pub fn key_click(key: KeyCode) -> Vec<InputEvent> {
10+
vec![key_event(key, 1), key_event(key, 0)]
11+
}
12+
13+
pub fn key_event(key: KeyCode, key_state: i32) -> InputEvent {
14+
InputEvent::new(EventType::KEY.0, key.code(), key_state)
15+
}
16+
17+
pub fn get_test_device() -> std::io::Result<(Device, VirtualDevice)> {
18+
let (name, output) = get_device()?;
19+
20+
let mut input = Device::open(&name)?;
21+
22+
input.grab()?;
23+
24+
Ok((input, output))
25+
}
26+
27+
pub fn get_device() -> std::io::Result<(PathBuf, VirtualDevice)> {
28+
let mut keys: AttributeSet<KeyCode> = AttributeSet::new();
29+
for code in 1..59 {
30+
let key = KeyCode::new(code);
31+
let name = format!("{:?}", key);
32+
if name.starts_with("KEY_") {
33+
keys.insert(key);
34+
}
35+
}
36+
37+
let mut sw: AttributeSet<SwitchCode> = AttributeSet::new();
38+
39+
sw.insert(SwitchCode::SW_LID);
40+
sw.insert(SwitchCode::SW_TABLET_MODE);
41+
42+
let mut device = VirtualDevice::builder()?
43+
.input_id(InputId::new(BusType::BUS_USB, 0x1234, 0x5678, 0x111))
44+
.name("test device")
45+
.with_keys(&keys)?
46+
.with_switches(&sw)?
47+
.build()?;
48+
49+
// Fetch name.
50+
let d: Vec<std::path::PathBuf> = device
51+
.enumerate_dev_nodes_blocking()?
52+
.map(|p| p.unwrap())
53+
.collect();
54+
55+
thread::sleep(Duration::from_millis(100)); // To avoid permission denied.
56+
57+
Ok((d.first().unwrap().clone(), device))
58+
}
59+
60+
pub fn final_dot_state(start_state: i32, events: impl Iterator<Item = InputEvent>) -> i32 {
61+
events.fold(start_state, |state, ev| {
62+
if ev.event_type() == EventType::KEY && ev.code() == KeyCode::KEY_DOT.code() {
63+
if ev.value() == 0 {
64+
0
65+
} else {
66+
1
67+
}
68+
} else {
69+
state
70+
}
71+
})
72+
}
73+
74+
pub fn final_event_state(key: KeyCode, events: &Vec<InputEvent>) -> Option<i32> {
75+
events.iter().fold(None, |state, ev| {
76+
if ev.event_type() == EventType::KEY && ev.code() == key.code() {
77+
if ev.value() == 0 {
78+
Some(0)
79+
} else {
80+
Some(1)
81+
}
82+
} else {
83+
state
84+
}
85+
})
86+
}

src/tests/compensate.rs renamed to tests/compensate.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
use crate::tests::{final_dot_state, final_event_state, get_test_device, key_click, key_event};
2-
use crate::{EventType, InputEvent, KeyCode, SwitchCode};
1+
#![cfg(feature = "device-test")]
2+
3+
mod common;
4+
5+
use common::{final_dot_state, final_event_state, get_test_device, key_click, key_event};
6+
use evdev::{EventType, InputEvent, KeyCode, SwitchCode};
37

48
#[test]
59
pub fn test_compensate_keys() -> std::io::Result<()> {

tests/device.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#![cfg(feature = "device-test")]
2+
3+
mod common;
4+
5+
use common::{get_test_device, key_event};
6+
use evdev::KeyCode;
7+
8+
#[test]
9+
pub fn test_get_key_state() -> Result<(), Box<dyn std::error::Error>> {
10+
let (input, mut output) = get_test_device()?;
11+
12+
output.emit(&[key_event(KeyCode::KEY_DOT, 1)])?;
13+
14+
assert_eq!(1, input.get_key_state()?.iter().count());
15+
assert!(input
16+
.get_key_state()?
17+
.iter()
18+
.all(|e| e.code() == KeyCode::KEY_DOT.code()));
19+
20+
output.emit(&[key_event(KeyCode::KEY_DOT, 0)])?;
21+
22+
assert_eq!(0, input.get_key_state()?.iter().count());
23+
24+
Ok(())
25+
}

0 commit comments

Comments
 (0)