Skip to content

Commit 0dfcf32

Browse files
authored
test: tweak test_fanotify to monitor ONLY 1 file (#2294)
1 parent 0fb3460 commit 0dfcf32

File tree

1 file changed

+42
-47
lines changed

1 file changed

+42
-47
lines changed

test/sys/test_fanotify.rs

+42-47
Original file line numberDiff line numberDiff line change
@@ -23,43 +23,31 @@ fn test_fanotify_notifications() {
2323
Fanotify::init(InitFlags::FAN_CLASS_NOTIF, EventFFlags::O_RDONLY)
2424
.unwrap();
2525
let tempdir = tempfile::tempdir().unwrap();
26+
let tempfile = tempdir.path().join("test");
27+
OpenOptions::new()
28+
.write(true)
29+
.create_new(true)
30+
.open(&tempfile)
31+
.unwrap();
2632

2733
group
2834
.mark(
29-
MarkFlags::FAN_MARK_ADD | MarkFlags::FAN_MARK_MOUNT,
35+
MarkFlags::FAN_MARK_ADD,
3036
MaskFlags::FAN_OPEN | MaskFlags::FAN_MODIFY | MaskFlags::FAN_CLOSE,
3137
None,
32-
Some(tempdir.path()),
38+
Some(&tempfile),
3339
)
3440
.unwrap();
3541

36-
let tempfile = tempdir.path().join("test");
37-
38-
// create test file
39-
File::create(&tempfile).unwrap();
40-
41-
let [event] = &group.read_events().unwrap()[..] else {
42-
panic!("should have read exactly one event");
43-
};
44-
assert!(event.check_version());
45-
assert_eq!(
46-
event.mask(),
47-
MaskFlags::FAN_OPEN | MaskFlags::FAN_CLOSE_WRITE
48-
);
49-
let fd_opt = event.fd();
50-
let fd = fd_opt.as_ref().unwrap();
51-
let path = read_link(format!("/proc/self/fd/{}", fd.as_raw_fd())).unwrap();
52-
assert_eq!(path, tempfile);
53-
5442
// modify test file
5543
{
5644
let mut f = OpenOptions::new().write(true).open(&tempfile).unwrap();
5745
f.write_all(b"hello").unwrap();
5846
}
5947

60-
let [event] = &group.read_events().unwrap()[..] else {
61-
panic!("should have read exactly one event");
62-
};
48+
let mut events = group.read_events().unwrap();
49+
assert_eq!(events.len(), 1, "should have read exactly one event");
50+
let event = events.pop().unwrap();
6351
assert!(event.check_version());
6452
assert_eq!(
6553
event.mask(),
@@ -79,9 +67,9 @@ fn test_fanotify_notifications() {
7967
f.read_to_string(&mut s).unwrap();
8068
}
8169

82-
let [event] = &group.read_events().unwrap()[..] else {
83-
panic!("should have read exactly one event");
84-
};
70+
let mut events = group.read_events().unwrap();
71+
assert_eq!(events.len(), 1, "should have read exactly one event");
72+
let event = events.pop().unwrap();
8573
assert!(event.check_version());
8674
assert_eq!(
8775
event.mask(),
@@ -98,54 +86,61 @@ fn test_fanotify_responses() {
9886
Fanotify::init(InitFlags::FAN_CLASS_CONTENT, EventFFlags::O_RDONLY)
9987
.unwrap();
10088
let tempdir = tempfile::tempdir().unwrap();
89+
let tempfile = tempdir.path().join("test");
90+
OpenOptions::new()
91+
.write(true)
92+
.create_new(true)
93+
.open(&tempfile)
94+
.unwrap();
10195

10296
group
10397
.mark(
104-
MarkFlags::FAN_MARK_ADD | MarkFlags::FAN_MARK_MOUNT,
98+
MarkFlags::FAN_MARK_ADD,
10599
MaskFlags::FAN_OPEN_PERM,
106100
None,
107-
Some(tempdir.path()),
101+
Some(&tempfile),
108102
)
109103
.unwrap();
110104

111-
let tempfile = tempdir.path().join("test");
112-
let tempfname = tempfile.clone();
105+
let file_thread = thread::spawn({
106+
let tempfile = tempfile.clone();
113107

114-
let file_thread = thread::spawn(move || {
115-
// first try, should fail
116-
let Err(err) = File::create(&tempfile) else {
117-
panic!("first open is denied, should return error");
118-
};
119-
assert_eq!(err.kind(), ErrorKind::PermissionDenied);
108+
move || {
109+
// first open, should fail
110+
let Err(e) = File::open(&tempfile) else {
111+
panic!("The first open should fail");
112+
};
113+
assert_eq!(e.kind(), ErrorKind::PermissionDenied);
120114

121-
// second try, should succeed
122-
File::create(&tempfile).unwrap();
115+
// second open, should succeed
116+
File::open(&tempfile).unwrap();
117+
}
123118
});
124119

125120
// Deny the first open try
126-
let [event] = &group.read_events().unwrap()[..] else {
127-
panic!("should have read exactly one event");
128-
};
121+
let mut events = group.read_events().unwrap();
122+
assert_eq!(events.len(), 1, "should have read exactly one event");
123+
let event = events.pop().unwrap();
129124
assert!(event.check_version());
130125
assert_eq!(event.mask(), MaskFlags::FAN_OPEN_PERM);
131126
let fd_opt = event.fd();
132127
let fd = fd_opt.as_ref().unwrap();
133128
let path = read_link(format!("/proc/self/fd/{}", fd.as_raw_fd())).unwrap();
134-
assert_eq!(path, tempfname);
129+
assert_eq!(path, tempfile);
135130
group
136131
.write_response(FanotifyResponse::new(*fd, Response::FAN_DENY))
137132
.unwrap();
138133

139-
//// Allow the second open try
140-
let [event] = &group.read_events().unwrap()[..] else {
141-
panic!("should have read exactly one event");
142-
};
134+
// Allow the second open try
135+
let mut events = group.read_events().unwrap();
136+
assert_eq!(events.len(), 1, "should have read exactly one event");
137+
let event = events.pop().unwrap();
143138
assert!(event.check_version());
144139
assert_eq!(event.mask(), MaskFlags::FAN_OPEN_PERM);
145140
let fd_opt = event.fd();
146141
let fd = fd_opt.as_ref().unwrap();
147142
let path = read_link(format!("/proc/self/fd/{}", fd.as_raw_fd())).unwrap();
148-
assert_eq!(path, tempfname);
143+
assert_eq!(path, tempfile);
149144
group
150145
.write_response(FanotifyResponse::new(*fd, Response::FAN_ALLOW))
151146
.unwrap();

0 commit comments

Comments
 (0)