Skip to content

Commit 6899ebd

Browse files
committed
fix test close file
1 parent 6b0f602 commit 6899ebd

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

monoio/tests/fs_file.rs

+33-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use std::{
22
io::prelude::*,
3-
os::unix::io::{AsRawFd, FromRawFd, RawFd},
3+
os::unix::{
4+
fs::MetadataExt,
5+
io::{AsRawFd, FromRawFd, RawFd},
6+
},
47
};
58

69
use monoio::fs::File;
@@ -21,6 +24,7 @@ async fn read_hello(file: &File) {
2124
async fn basic_read() {
2225
let mut tempfile = tempfile();
2326
tempfile.write_all(HELLO).unwrap();
27+
tempfile.as_file_mut().sync_data().unwrap();
2428

2529
let file = File::open(tempfile.path()).await.unwrap();
2630
read_hello(&file).await;
@@ -30,6 +34,7 @@ async fn basic_read() {
3034
async fn basic_read_exact() {
3135
let mut tempfile = tempfile();
3236
tempfile.write_all(HELLO).unwrap();
37+
tempfile.as_file_mut().sync_data().unwrap();
3338

3439
let file = File::open(tempfile.path()).await.unwrap();
3540
let buf = Vec::with_capacity(HELLO.len());
@@ -48,6 +53,7 @@ async fn basic_write() {
4853

4954
let file = File::create(tempfile.path()).await.unwrap();
5055
file.write_at(HELLO, 0).await.0.unwrap();
56+
file.sync_all().await.unwrap();
5157

5258
let file = std::fs::read(tempfile.path()).unwrap();
5359
assert_eq!(file, HELLO);
@@ -59,6 +65,7 @@ async fn basic_write_all() {
5965

6066
let file = File::create(tempfile.path()).await.unwrap();
6167
file.write_all_at(HELLO, 0).await.0.unwrap();
68+
file.sync_all().await.unwrap();
6269

6370
let file = std::fs::read(tempfile.path()).unwrap();
6471
assert_eq!(file, HELLO);
@@ -68,6 +75,7 @@ async fn basic_write_all() {
6875
async fn cancel_read() {
6976
let mut tempfile = tempfile();
7077
tempfile.write_all(HELLO).unwrap();
78+
tempfile.as_file_mut().sync_data().unwrap();
7179

7280
let file = File::open(tempfile.path()).await.unwrap();
7381

@@ -81,13 +89,14 @@ async fn cancel_read() {
8189
async fn explicit_close() {
8290
let mut tempfile = tempfile();
8391
tempfile.write_all(HELLO).unwrap();
92+
tempfile.as_file_mut().sync_data().unwrap();
8493

8594
let file = File::open(tempfile.path()).await.unwrap();
8695
let fd = file.as_raw_fd();
8796

8897
file.close().await.unwrap();
8998

90-
assert_invalid_fd(fd);
99+
assert_invalid_fd(fd, tempfile.as_file().metadata().unwrap());
91100
}
92101

93102
#[monoio::test_all]
@@ -97,6 +106,7 @@ async fn drop_open() {
97106
// Do something else
98107
let file_w = File::create(tempfile.path()).await.unwrap();
99108
file_w.write_at(HELLO, 0).await.0.unwrap();
109+
file_w.sync_all().await.unwrap();
100110

101111
let file = std::fs::read(tempfile.path()).unwrap();
102112
assert_eq!(file, HELLO);
@@ -118,7 +128,7 @@ fn drop_off_runtime() {
118128
let fd = file.as_raw_fd();
119129
drop(file);
120130

121-
assert_invalid_fd(fd);
131+
assert_invalid_fd(fd, tempfile.as_file().metadata().unwrap());
122132
}
123133

124134
#[monoio::test_all]
@@ -151,11 +161,26 @@ async fn poll_once(future: impl std::future::Future) {
151161
.await;
152162
}
153163

154-
fn assert_invalid_fd(fd: RawFd) {
164+
fn assert_invalid_fd(fd: RawFd, base: std::fs::Metadata) {
155165
use std::fs::File;
156166

157-
let mut f = unsafe { File::from_raw_fd(fd) };
158-
let mut buf = vec![];
159-
160-
assert!(f.read_to_end(&mut buf).is_err());
167+
let f = unsafe { File::from_raw_fd(fd) };
168+
let meta = f.metadata();
169+
// The fd maybe used by others, so we can't close it now.
170+
std::mem::forget(f);
171+
172+
if let Ok(meta) = meta {
173+
if !meta.is_file() {
174+
return;
175+
}
176+
177+
#[cfg(unix)]
178+
{
179+
let inode = meta.ino();
180+
let actual = base.ino();
181+
if inode == actual {
182+
panic!();
183+
}
184+
}
185+
}
161186
}

0 commit comments

Comments
 (0)