@@ -1903,6 +1903,130 @@ mod tests {
19031903 check ! ( fs:: remove_file( filename) ) ;
19041904 }
19051905
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+
19062030 #[ test]
19072031 fn file_test_stat_is_correct_on_is_file ( ) {
19082032 let tmpdir = tmpdir ( ) ;
@@ -2221,8 +2345,8 @@ mod tests {
22212345 check ! ( fs:: set_permissions( & out, attr. permissions( ) ) ) ;
22222346 }
22232347
2224- #[ cfg( windows) ]
22252348 #[ test]
2349+ #[ cfg( windows) ]
22262350 fn copy_file_preserves_streams ( ) {
22272351 let tmp = tmpdir ( ) ;
22282352 check ! ( check!( File :: create( tmp. join( "in.txt:bunny" ) ) ) . write( "carrot" . as_bytes( ) ) ) ;
0 commit comments