@@ -102,6 +102,65 @@ fn flush_file() {
102102 assert_eq ! ( entry. size, 64 * 3 ) ;
103103}
104104
105+ #[ test]
106+ fn random_access_write_file ( ) {
107+ let time_source = utils:: make_time_source ( ) ;
108+ let disk = utils:: make_block_device ( utils:: DISK_SOURCE ) . unwrap ( ) ;
109+ let mut volume_mgr: VolumeManager < utils:: RamDisk < Vec < u8 > > , utils:: TestTimeSource , 4 , 2 , 1 > =
110+ VolumeManager :: new_with_limits ( disk, time_source, 0xAA00_0000 ) ;
111+ let volume = volume_mgr
112+ . open_raw_volume ( VolumeIdx ( 0 ) )
113+ . expect ( "open volume" ) ;
114+ let root_dir = volume_mgr. open_root_dir ( volume) . expect ( "open root dir" ) ;
115+
116+ // Open with string
117+ let f = volume_mgr
118+ . open_file_in_dir ( root_dir, "README.TXT" , Mode :: ReadWriteTruncate )
119+ . expect ( "open file" ) ;
120+
121+ let test_data = vec ! [ 0xCC ; 1024 ] ;
122+ volume_mgr. write ( f, & test_data) . expect ( "file write" ) ;
123+
124+ let length = volume_mgr. file_length ( f) . expect ( "get length" ) ;
125+ assert_eq ! ( length, 1024 ) ;
126+
127+ for seek_offset in [ 100 , 0 ] {
128+ let mut expected_buffer = [ 0u8 ; 4 ] ;
129+
130+ // fetch some data at offset seek_offset
131+ volume_mgr
132+ . file_seek_from_start ( f, seek_offset)
133+ . expect ( "Seeking" ) ;
134+ volume_mgr. read ( f, & mut expected_buffer) . expect ( "read file" ) ;
135+
136+ // modify first byte
137+ expected_buffer[ 0 ] ^= 0xff ;
138+
139+ // write only first byte, expecting the rest to not change
140+ volume_mgr
141+ . file_seek_from_start ( f, seek_offset)
142+ . expect ( "Seeking" ) ;
143+ volume_mgr
144+ . write ( f, & expected_buffer[ 0 ..1 ] )
145+ . expect ( "file write" ) ;
146+ volume_mgr. flush_file ( f) . expect ( "file flush" ) ;
147+
148+ // read and verify
149+ volume_mgr
150+ . file_seek_from_start ( f, seek_offset)
151+ . expect ( "file seek" ) ;
152+ let mut read_buffer = [ 0xffu8 , 0xff , 0xff , 0xff ] ;
153+ volume_mgr. read ( f, & mut read_buffer) . expect ( "file read" ) ;
154+ assert_eq ! (
155+ read_buffer, expected_buffer,
156+ "mismatch seek+write at offset {seek_offset} from start"
157+ ) ;
158+ }
159+
160+ volume_mgr. close_file ( f) . expect ( "close file" ) ;
161+ volume_mgr. close_dir ( root_dir) . expect ( "close dir" ) ;
162+ volume_mgr. close_volume ( volume) . expect ( "close volume" ) ;
163+ }
105164// ****************************************************************************
106165//
107166// End Of File
0 commit comments