@@ -102,6 +102,54 @@ fn flush_file() {
102
102
assert_eq ! ( entry. size, 64 * 3 ) ;
103
103
}
104
104
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 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. file_seek_from_start ( f, seek_offset) . expect ( "Seeking" ) ;
132
+ volume_mgr. read ( f, & mut expected_buffer) . expect ( "read file" ) ;
133
+
134
+ // modify first byte
135
+ expected_buffer[ 0 ] ^= 0xff ;
136
+
137
+ // write only first byte, expecting the rest to not change
138
+ volume_mgr. file_seek_from_start ( f, seek_offset) . expect ( "Seeking" ) ;
139
+ volume_mgr. write ( f, & expected_buffer[ 0 ..1 ] ) . expect ( "file write" ) ;
140
+ volume_mgr. flush_file ( f) . expect ( "file flush" ) ;
141
+
142
+ // read and verify
143
+ volume_mgr. file_seek_from_start ( f, seek_offset) . expect ( "file seek" ) ;
144
+ let mut read_buffer = [ 0xffu8 , 0xff , 0xff , 0xff ] ;
145
+ volume_mgr. read ( f, & mut read_buffer) . expect ( "file read" ) ;
146
+ assert_eq ! ( read_buffer, expected_buffer, "mismatch seek+write at offset {seek_offset} from start" ) ;
147
+ }
148
+
149
+ volume_mgr. close_file ( f) . expect ( "close file" ) ;
150
+ volume_mgr. close_dir ( root_dir) . expect ( "close dir" ) ;
151
+ volume_mgr. close_volume ( volume) . expect ( "close volume" ) ;
152
+ }
105
153
// ****************************************************************************
106
154
//
107
155
// End Of File
0 commit comments