Skip to content
This repository was archived by the owner on Mar 7, 2021. It is now read-only.

Commit 1ccec76

Browse files
committed
tests: Move device-node code into testlib
1 parent 93ce02d commit 1ccec76

File tree

4 files changed

+59
-62
lines changed

4 files changed

+59
-62
lines changed

testlib/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ authors = ["Alex Gaynor <[email protected]>"]
55
edition = "2018"
66

77
[dependencies]
8+
tempfile = "3"
9+
libc = "0.2.58"

testlib/src/lib.rs

+46
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use std::env;
2+
use std::fs;
3+
use std::path::PathBuf;
24
use std::process::Command;
35

6+
use tempfile::TempDir;
7+
48
struct LoadedModule {
59
name: String,
610
}
@@ -50,3 +54,45 @@ pub fn assert_dmesg_contains(msgs: &[&[u8]]) {
5054
lines = &lines[pos.unwrap()..];
5155
}
5256
}
57+
58+
pub fn get_device_major_number(name: &str) -> libc::dev_t {
59+
let devices = fs::read_to_string("/proc/devices").unwrap();
60+
let dev_no_line = devices.lines().find(|l| l.ends_with(name)).unwrap();
61+
let elements = dev_no_line.rsplitn(2, " ").collect::<Vec<_>>();
62+
assert_eq!(elements.len(), 2);
63+
assert_eq!(elements[0], name);
64+
return elements[1].trim().parse().unwrap();
65+
}
66+
67+
pub fn temporary_file_path() -> PathBuf {
68+
let mut p = TempDir::new().unwrap().into_path();
69+
p.push("device");
70+
return p;
71+
}
72+
73+
pub struct UnlinkOnDrop<'a> {
74+
path: &'a PathBuf,
75+
}
76+
77+
impl Drop for UnlinkOnDrop<'_> {
78+
fn drop(&mut self) {
79+
Command::new("sudo")
80+
.arg("rm")
81+
.arg(self.path.to_str().unwrap())
82+
.status()
83+
.unwrap();
84+
}
85+
}
86+
87+
pub fn mknod(path: &PathBuf, major: libc::dev_t, minor: libc::dev_t) -> UnlinkOnDrop {
88+
Command::new("sudo")
89+
.arg("mknod")
90+
.arg("--mode=a=rw")
91+
.arg(path.to_str().unwrap())
92+
.arg("c")
93+
.arg(major.to_string())
94+
.arg(minor.to_string())
95+
.status()
96+
.unwrap();
97+
return UnlinkOnDrop { path };
98+
}

tests/chrdev/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,3 @@ linux-kernel-module = { path = "../..", optional = true }
1717
[dev-dependencies]
1818
kernel-module-testlib = { path = "../../testlib" }
1919
libc = "0.2.58"
20-
tempfile = "3"

tests/chrdev/tests/tests.rs

+11-61
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,26 @@
11
use std::fs;
22
use std::io::{Read, Seek, SeekFrom, Write};
33
use std::os::unix::prelude::FileExt;
4-
use std::path::PathBuf;
5-
use std::process::Command;
64

7-
use libc;
8-
9-
use tempfile::TempDir;
10-
11-
use kernel_module_testlib::with_kernel_module;
12-
13-
fn get_device_major_number() -> libc::dev_t {
14-
let devices = fs::read_to_string("/proc/devices").unwrap();
15-
let dev_no_line = devices
16-
.lines()
17-
.find(|l| l.ends_with("chrdev-tests"))
18-
.unwrap();
19-
let elements = dev_no_line.rsplitn(2, " ").collect::<Vec<_>>();
20-
assert_eq!(elements.len(), 2);
21-
assert_eq!(elements[0], "chrdev-tests");
22-
return elements[1].trim().parse().unwrap();
23-
}
24-
25-
fn temporary_file_path() -> PathBuf {
26-
let mut p = TempDir::new().unwrap().into_path();
27-
p.push("device");
28-
return p;
29-
}
30-
31-
struct UnlinkOnDrop<'a> {
32-
path: &'a PathBuf,
33-
}
34-
35-
impl Drop for UnlinkOnDrop<'_> {
36-
fn drop(&mut self) {
37-
Command::new("sudo")
38-
.arg("rm")
39-
.arg(self.path.to_str().unwrap())
40-
.status()
41-
.unwrap();
42-
}
43-
}
44-
45-
fn mknod(path: &PathBuf, major: libc::dev_t, minor: libc::dev_t) -> UnlinkOnDrop {
46-
Command::new("sudo")
47-
.arg("mknod")
48-
.arg("--mode=a=rw")
49-
.arg(path.to_str().unwrap())
50-
.arg("c")
51-
.arg(major.to_string())
52-
.arg(minor.to_string())
53-
.status()
54-
.unwrap();
55-
return UnlinkOnDrop { path };
56-
}
5+
use kernel_module_testlib::*;
576

7+
const DEVICE_NAME: &'static str = "chrdev-tests";
588
const READ_FILE_MINOR: libc::dev_t = 0;
599
const SEEK_FILE_MINOR: libc::dev_t = 1;
6010
const WRITE_FILE_MINOR: libc::dev_t = 2;
6111

6212
#[test]
6313
fn test_mknod() {
6414
with_kernel_module(|| {
65-
let device_number = get_device_major_number();
15+
let device_number = get_device_major_number(DEVICE_NAME);
6616
mknod(&temporary_file_path(), device_number, READ_FILE_MINOR);
6717
});
6818
}
6919

7020
#[test]
7121
fn test_read() {
7222
with_kernel_module(|| {
73-
let device_number = get_device_major_number();
23+
let device_number = get_device_major_number(DEVICE_NAME);
7424
let p = temporary_file_path();
7525
let _u = mknod(&p, device_number, READ_FILE_MINOR);
7626

@@ -84,7 +34,7 @@ fn test_read() {
8434
#[test]
8535
fn test_read_offset() {
8636
with_kernel_module(|| {
87-
let device_number = get_device_major_number();
37+
let device_number = get_device_major_number(DEVICE_NAME);
8838
let p = temporary_file_path();
8939
let _u = mknod(&p, device_number, READ_FILE_MINOR);
9040

@@ -100,7 +50,7 @@ fn test_read_offset() {
10050
#[test]
10151
fn test_read_at() {
10252
with_kernel_module(|| {
103-
let device_number = get_device_major_number();
53+
let device_number = get_device_major_number(DEVICE_NAME);
10454
let p = temporary_file_path();
10555
let _u = mknod(&p, device_number, READ_FILE_MINOR);
10656

@@ -114,7 +64,7 @@ fn test_read_at() {
11464
#[test]
11565
fn test_read_unimplemented() {
11666
with_kernel_module(|| {
117-
let device_number = get_device_major_number();
67+
let device_number = get_device_major_number(DEVICE_NAME);
11868
let p = temporary_file_path();
11969
let _u = mknod(&p, device_number, SEEK_FILE_MINOR);
12070

@@ -130,7 +80,7 @@ fn test_read_unimplemented() {
13080
#[test]
13181
fn test_lseek_unimplemented() {
13282
with_kernel_module(|| {
133-
let device_number = get_device_major_number();
83+
let device_number = get_device_major_number(DEVICE_NAME);
13484
let p = temporary_file_path();
13585
let _u = mknod(&p, device_number, READ_FILE_MINOR);
13686

@@ -162,7 +112,7 @@ fn test_lseek_unimplemented() {
162112
#[test]
163113
fn test_lseek() {
164114
with_kernel_module(|| {
165-
let device_number = get_device_major_number();
115+
let device_number = get_device_major_number(DEVICE_NAME);
166116
let p = temporary_file_path();
167117
let _u = mknod(&p, device_number, SEEK_FILE_MINOR);
168118

@@ -184,7 +134,7 @@ fn test_lseek() {
184134
#[test]
185135
fn test_write_unimplemented() {
186136
with_kernel_module(|| {
187-
let device_number = get_device_major_number();
137+
let device_number = get_device_major_number(DEVICE_NAME);
188138
let p = temporary_file_path();
189139
let _u = mknod(&p, device_number, READ_FILE_MINOR);
190140

@@ -199,7 +149,7 @@ fn test_write_unimplemented() {
199149
#[test]
200150
fn test_write() {
201151
with_kernel_module(|| {
202-
let device_number = get_device_major_number();
152+
let device_number = get_device_major_number(DEVICE_NAME);
203153
let p = temporary_file_path();
204154
let _u = mknod(&p, device_number, WRITE_FILE_MINOR);
205155

0 commit comments

Comments
 (0)