@@ -1903,6 +1903,130 @@ mod tests {
1903
1903
check ! ( fs:: remove_file( filename) ) ;
1904
1904
}
1905
1905
1906
+ #[ test]
1907
+ fn file_test_io_eof ( ) {
1908
+ let tmpdir = tmpdir ( ) ;
1909
+ let filename = tmpdir. join ( "file_rt_io_file_test_eof.txt" ) ;
1910
+ let mut buf = [ 0 ; 256 ] ;
1911
+ {
1912
+ let oo = OpenOptions :: new ( ) . create_new ( true ) . write ( true ) . read ( true ) . clone ( ) ;
1913
+ let mut rw = check ! ( oo. open( & filename) ) ;
1914
+ assert_eq ! ( check!( rw. read( & mut buf) ) , 0 ) ;
1915
+ assert_eq ! ( check!( rw. read( & mut buf) ) , 0 ) ;
1916
+ }
1917
+ check ! ( fs:: remove_file( & filename) ) ;
1918
+ }
1919
+
1920
+ #[ test]
1921
+ #[ cfg( unix) ]
1922
+ fn file_test_io_read_write_at ( ) {
1923
+ use os:: unix:: fs:: FileExt ;
1924
+
1925
+ let tmpdir = tmpdir ( ) ;
1926
+ let filename = tmpdir. join ( "file_rt_io_file_test_read_write_at.txt" ) ;
1927
+ let mut buf = [ 0 ; 256 ] ;
1928
+ let write1 = "asdf" ;
1929
+ let write2 = "qwer-" ;
1930
+ let write3 = "-zxcv" ;
1931
+ let content = "qwer-asdf-zxcv" ;
1932
+ {
1933
+ let oo = OpenOptions :: new ( ) . create_new ( true ) . write ( true ) . read ( true ) . clone ( ) ;
1934
+ let mut rw = check ! ( oo. open( & filename) ) ;
1935
+ assert_eq ! ( check!( rw. write_at( write1. as_bytes( ) , 5 ) ) , write1. len( ) ) ;
1936
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 0 ) ;
1937
+ assert_eq ! ( check!( rw. read_at( & mut buf, 5 ) ) , write1. len( ) ) ;
1938
+ assert_eq ! ( str :: from_utf8( & buf[ ..write1. len( ) ] ) , Ok ( write1) ) ;
1939
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 0 ) ;
1940
+ assert_eq ! ( check!( rw. read_at( & mut buf[ ..write2. len( ) ] , 0 ) ) , write2. len( ) ) ;
1941
+ assert_eq ! ( str :: from_utf8( & buf[ ..write2. len( ) ] ) , Ok ( "\0 \0 \0 \0 \0 " ) ) ;
1942
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 0 ) ;
1943
+ assert_eq ! ( check!( rw. write( write2. as_bytes( ) ) ) , write2. len( ) ) ;
1944
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 5 ) ;
1945
+ assert_eq ! ( check!( rw. read( & mut buf) ) , write1. len( ) ) ;
1946
+ assert_eq ! ( str :: from_utf8( & buf[ ..write1. len( ) ] ) , Ok ( write1) ) ;
1947
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
1948
+ assert_eq ! ( check!( rw. read_at( & mut buf[ ..write2. len( ) ] , 0 ) ) , write2. len( ) ) ;
1949
+ assert_eq ! ( str :: from_utf8( & buf[ ..write2. len( ) ] ) , Ok ( write2) ) ;
1950
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
1951
+ assert_eq ! ( check!( rw. write_at( write3. as_bytes( ) , 9 ) ) , write3. len( ) ) ;
1952
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
1953
+ }
1954
+ {
1955
+ let mut read = check ! ( File :: open( & filename) ) ;
1956
+ assert_eq ! ( check!( read. read_at( & mut buf, 0 ) ) , content. len( ) ) ;
1957
+ assert_eq ! ( str :: from_utf8( & buf[ ..content. len( ) ] ) , Ok ( content) ) ;
1958
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 0 ) ;
1959
+ assert_eq ! ( check!( read. seek( SeekFrom :: End ( -5 ) ) ) , 9 ) ;
1960
+ assert_eq ! ( check!( read. read_at( & mut buf, 0 ) ) , content. len( ) ) ;
1961
+ assert_eq ! ( str :: from_utf8( & buf[ ..content. len( ) ] ) , Ok ( content) ) ;
1962
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
1963
+ assert_eq ! ( check!( read. read( & mut buf) ) , write3. len( ) ) ;
1964
+ assert_eq ! ( str :: from_utf8( & buf[ ..write3. len( ) ] ) , Ok ( write3) ) ;
1965
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
1966
+ assert_eq ! ( check!( read. read_at( & mut buf, 0 ) ) , content. len( ) ) ;
1967
+ assert_eq ! ( str :: from_utf8( & buf[ ..content. len( ) ] ) , Ok ( content) ) ;
1968
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
1969
+ assert_eq ! ( check!( read. read_at( & mut buf, 14 ) ) , 0 ) ;
1970
+ assert_eq ! ( check!( read. read_at( & mut buf, 15 ) ) , 0 ) ;
1971
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
1972
+ }
1973
+ check ! ( fs:: remove_file( & filename) ) ;
1974
+ }
1975
+
1976
+ #[ test]
1977
+ #[ cfg( windows) ]
1978
+ fn file_test_io_seek_read_write ( ) {
1979
+ use os:: windows:: fs:: FileExt ;
1980
+
1981
+ let tmpdir = tmpdir ( ) ;
1982
+ let filename = tmpdir. join ( "file_rt_io_file_test_seek_read_write.txt" ) ;
1983
+ let mut buf = [ 0 ; 256 ] ;
1984
+ let write1 = "asdf" ;
1985
+ let write2 = "qwer-" ;
1986
+ let write3 = "-zxcv" ;
1987
+ let content = "qwer-asdf-zxcv" ;
1988
+ {
1989
+ let oo = OpenOptions :: new ( ) . create_new ( true ) . write ( true ) . read ( true ) . clone ( ) ;
1990
+ let mut rw = check ! ( oo. open( & filename) ) ;
1991
+ assert_eq ! ( check!( rw. seek_write( write1. as_bytes( ) , 5 ) ) , write1. len( ) ) ;
1992
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
1993
+ assert_eq ! ( check!( rw. seek_read( & mut buf, 5 ) ) , write1. len( ) ) ;
1994
+ assert_eq ! ( str :: from_utf8( & buf[ ..write1. len( ) ] ) , Ok ( write1) ) ;
1995
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
1996
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Start ( 0 ) ) ) , 0 ) ;
1997
+ assert_eq ! ( check!( rw. write( write2. as_bytes( ) ) ) , write2. len( ) ) ;
1998
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 5 ) ;
1999
+ assert_eq ! ( check!( rw. read( & mut buf) ) , write1. len( ) ) ;
2000
+ assert_eq ! ( str :: from_utf8( & buf[ ..write1. len( ) ] ) , Ok ( write1) ) ;
2001
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 9 ) ;
2002
+ assert_eq ! ( check!( rw. seek_read( & mut buf[ ..write2. len( ) ] , 0 ) ) , write2. len( ) ) ;
2003
+ assert_eq ! ( str :: from_utf8( & buf[ ..write2. len( ) ] ) , Ok ( write2) ) ;
2004
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 5 ) ;
2005
+ assert_eq ! ( check!( rw. seek_write( write3. as_bytes( ) , 9 ) ) , write3. len( ) ) ;
2006
+ assert_eq ! ( check!( rw. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
2007
+ }
2008
+ {
2009
+ let mut read = check ! ( File :: open( & filename) ) ;
2010
+ assert_eq ! ( check!( read. seek_read( & mut buf, 0 ) ) , content. len( ) ) ;
2011
+ assert_eq ! ( str :: from_utf8( & buf[ ..content. len( ) ] ) , Ok ( content) ) ;
2012
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
2013
+ assert_eq ! ( check!( read. seek( SeekFrom :: End ( -5 ) ) ) , 9 ) ;
2014
+ assert_eq ! ( check!( read. seek_read( & mut buf, 0 ) ) , content. len( ) ) ;
2015
+ assert_eq ! ( str :: from_utf8( & buf[ ..content. len( ) ] ) , Ok ( content) ) ;
2016
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
2017
+ assert_eq ! ( check!( read. seek( SeekFrom :: End ( -5 ) ) ) , 9 ) ;
2018
+ assert_eq ! ( check!( read. read( & mut buf) ) , write3. len( ) ) ;
2019
+ assert_eq ! ( str :: from_utf8( & buf[ ..write3. len( ) ] ) , Ok ( write3) ) ;
2020
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
2021
+ assert_eq ! ( check!( read. seek_read( & mut buf, 0 ) ) , content. len( ) ) ;
2022
+ assert_eq ! ( str :: from_utf8( & buf[ ..content. len( ) ] ) , Ok ( content) ) ;
2023
+ assert_eq ! ( check!( read. seek( SeekFrom :: Current ( 0 ) ) ) , 14 ) ;
2024
+ assert_eq ! ( check!( read. seek_read( & mut buf, 14 ) ) , 0 ) ;
2025
+ assert_eq ! ( check!( read. seek_read( & mut buf, 15 ) ) , 0 ) ;
2026
+ }
2027
+ check ! ( fs:: remove_file( & filename) ) ;
2028
+ }
2029
+
1906
2030
#[ test]
1907
2031
fn file_test_stat_is_correct_on_is_file ( ) {
1908
2032
let tmpdir = tmpdir ( ) ;
@@ -2221,8 +2345,8 @@ mod tests {
2221
2345
check ! ( fs:: set_permissions( & out, attr. permissions( ) ) ) ;
2222
2346
}
2223
2347
2224
- #[ cfg( windows) ]
2225
2348
#[ test]
2349
+ #[ cfg( windows) ]
2226
2350
fn copy_file_preserves_streams ( ) {
2227
2351
let tmp = tmpdir ( ) ;
2228
2352
check ! ( check!( File :: create( tmp. join( "in.txt:bunny" ) ) ) . write( "carrot" . as_bytes( ) ) ) ;
0 commit comments