1
1
use std:: {
2
2
io:: prelude:: * ,
3
- os:: unix:: io:: { AsRawFd , FromRawFd , RawFd } ,
3
+ os:: unix:: {
4
+ fs:: MetadataExt ,
5
+ io:: { AsRawFd , FromRawFd , RawFd } ,
6
+ } ,
4
7
} ;
5
8
6
9
use monoio:: fs:: File ;
@@ -21,6 +24,7 @@ async fn read_hello(file: &File) {
21
24
async fn basic_read ( ) {
22
25
let mut tempfile = tempfile ( ) ;
23
26
tempfile. write_all ( HELLO ) . unwrap ( ) ;
27
+ tempfile. as_file_mut ( ) . sync_data ( ) . unwrap ( ) ;
24
28
25
29
let file = File :: open ( tempfile. path ( ) ) . await . unwrap ( ) ;
26
30
read_hello ( & file) . await ;
@@ -30,6 +34,7 @@ async fn basic_read() {
30
34
async fn basic_read_exact ( ) {
31
35
let mut tempfile = tempfile ( ) ;
32
36
tempfile. write_all ( HELLO ) . unwrap ( ) ;
37
+ tempfile. as_file_mut ( ) . sync_data ( ) . unwrap ( ) ;
33
38
34
39
let file = File :: open ( tempfile. path ( ) ) . await . unwrap ( ) ;
35
40
let buf = Vec :: with_capacity ( HELLO . len ( ) ) ;
@@ -48,6 +53,7 @@ async fn basic_write() {
48
53
49
54
let file = File :: create ( tempfile. path ( ) ) . await . unwrap ( ) ;
50
55
file. write_at ( HELLO , 0 ) . await . 0 . unwrap ( ) ;
56
+ file. sync_all ( ) . await . unwrap ( ) ;
51
57
52
58
let file = std:: fs:: read ( tempfile. path ( ) ) . unwrap ( ) ;
53
59
assert_eq ! ( file, HELLO ) ;
@@ -59,6 +65,7 @@ async fn basic_write_all() {
59
65
60
66
let file = File :: create ( tempfile. path ( ) ) . await . unwrap ( ) ;
61
67
file. write_all_at ( HELLO , 0 ) . await . 0 . unwrap ( ) ;
68
+ file. sync_all ( ) . await . unwrap ( ) ;
62
69
63
70
let file = std:: fs:: read ( tempfile. path ( ) ) . unwrap ( ) ;
64
71
assert_eq ! ( file, HELLO ) ;
@@ -68,6 +75,7 @@ async fn basic_write_all() {
68
75
async fn cancel_read ( ) {
69
76
let mut tempfile = tempfile ( ) ;
70
77
tempfile. write_all ( HELLO ) . unwrap ( ) ;
78
+ tempfile. as_file_mut ( ) . sync_data ( ) . unwrap ( ) ;
71
79
72
80
let file = File :: open ( tempfile. path ( ) ) . await . unwrap ( ) ;
73
81
@@ -81,13 +89,14 @@ async fn cancel_read() {
81
89
async fn explicit_close ( ) {
82
90
let mut tempfile = tempfile ( ) ;
83
91
tempfile. write_all ( HELLO ) . unwrap ( ) ;
92
+ tempfile. as_file_mut ( ) . sync_data ( ) . unwrap ( ) ;
84
93
85
94
let file = File :: open ( tempfile. path ( ) ) . await . unwrap ( ) ;
86
95
let fd = file. as_raw_fd ( ) ;
87
96
88
97
file. close ( ) . await . unwrap ( ) ;
89
98
90
- assert_invalid_fd ( fd) ;
99
+ assert_invalid_fd ( fd, tempfile . as_file ( ) . metadata ( ) . unwrap ( ) ) ;
91
100
}
92
101
93
102
#[ monoio:: test_all]
@@ -97,6 +106,7 @@ async fn drop_open() {
97
106
// Do something else
98
107
let file_w = File :: create ( tempfile. path ( ) ) . await . unwrap ( ) ;
99
108
file_w. write_at ( HELLO , 0 ) . await . 0 . unwrap ( ) ;
109
+ file_w. sync_all ( ) . await . unwrap ( ) ;
100
110
101
111
let file = std:: fs:: read ( tempfile. path ( ) ) . unwrap ( ) ;
102
112
assert_eq ! ( file, HELLO ) ;
@@ -118,7 +128,7 @@ fn drop_off_runtime() {
118
128
let fd = file. as_raw_fd ( ) ;
119
129
drop ( file) ;
120
130
121
- assert_invalid_fd ( fd) ;
131
+ assert_invalid_fd ( fd, tempfile . as_file ( ) . metadata ( ) . unwrap ( ) ) ;
122
132
}
123
133
124
134
#[ monoio:: test_all]
@@ -151,11 +161,26 @@ async fn poll_once(future: impl std::future::Future) {
151
161
. await ;
152
162
}
153
163
154
- fn assert_invalid_fd ( fd : RawFd ) {
164
+ fn assert_invalid_fd ( fd : RawFd , base : std :: fs :: Metadata ) {
155
165
use std:: fs:: File ;
156
166
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
+ }
161
186
}
0 commit comments