@@ -193,82 +193,92 @@ await reader.ReadToEndAsync(),
193193 await destination . DeleteAsync ( ) ;
194194 }
195195
196-
197196 [ Test ]
198197 public async Task File_OpenWrite_FlushDoesNotCauseUndersizedParts ( )
199198 {
200199 using var fs = GetFileSystem ( ) ;
201200
202- var content = "Hello, World!" ;
201+ const string Content = "Hello, World!" ;
203202
204203 {
205204 await using var stream = await fs . OpenWriteAsync ( "/flush-test.txt" ) ;
206205 await using var writer = new StreamWriter ( stream ) ;
207206
208207 // Write small data and flush multiple times.
209208 // Flush should be a no-op and not upload undersized parts.
210- await writer . WriteAsync ( content [ ..5 ] ) ;
211- await writer . FlushAsync ( ) ;
212- await writer . WriteAsync ( content [ 5 ..] ) ;
213- await writer . FlushAsync ( ) ;
209+ foreach ( var ch in Content )
210+ {
211+ await writer . WriteAsync ( ch ) ;
212+ await writer . FlushAsync ( ) ;
213+ }
214214 }
215-
216215 {
217- var file = fs . GetFile ( "/flush-test.txt" ) ;
218- Assert . That ( await file . ExistsAsync ( ) , Is . True ) ;
219-
220216 // ReSharper disable once UseAwaitUsing
221- using var stream = await file . OpenReadAsync ( ) ;
217+ using var stream = await fs . OpenReadAsync ( "/flush-test.txt" ) ;
222218 using var reader = new StreamReader ( stream ) ;
223- Assert . That ( await reader . ReadToEndAsync ( ) , Is . EqualTo ( content ) ) ;
224219
225- await file . DeleteAsync ( ) ;
220+ Assert . That ( await reader . ReadToEndAsync ( ) , Is . EqualTo ( Content ) ) ;
226221 }
222+
223+ await fs . DeleteFileAsync ( "/flush-test.txt" ) ;
227224 }
228225
229226 [ Test ]
230227 public async Task File_OpenWrite_FlushWithMultipartUpload ( )
231228 {
232229 using var fs = GetFileSystem ( ) ;
233230
234- // Write more than 5 MiB to trigger multipart upload,
235- // with Flush calls between writes.
236- var chunk = new byte [ 2 * 1024 * 1024 ] ;
231+ const int Count = 5 ;
232+ const string FileName = "/flush-multipart-test.bin" ;
233+
234+ var chunk = new byte [ 3 * 1024 * 1024 ] ;
237235 Random . Shared . NextBytes ( chunk ) ;
238236
239237 {
240- await using var stream = await fs . OpenWriteAsync ( "/flush-multipart-test.bin" ) ;
238+ await using var stream = await fs . OpenWriteAsync ( FileName ) ;
239+ for ( var i = 0 ; i < Count ; i ++ )
240+ await stream . WriteAsync ( chunk ) ;
241+ }
242+
243+ {
244+ var file = fs . GetFile ( FileName ) ;
245+
246+ Assert . That ( await file . ExistsAsync ( ) , Is . True ) ;
247+ Assert . That ( await file . GetLengthAsync ( ) , Is . EqualTo ( chunk . Length * Count ) ) ;
241248
242- // Write 4 chunks (8 MiB total) with flushes in between.
243- // Without the fix, each flush would upload an undersized part
244- // and CompleteMultipartUpload would fail.
245- for ( var i = 0 ; i < 4 ; i ++ )
249+ // ReSharper disable once UseAwaitUsing
250+ using var stream = await file . OpenReadAsync ( ) ;
251+
252+ var bytes = new byte [ chunk . Length ] ;
253+
254+ for ( var i = 0 ; i < Count ; i ++ )
246255 {
247- await stream . WriteAsync ( chunk ) ;
248- await stream . FlushAsync ( ) ;
256+ var n = await ReadBlockAsync ( stream , bytes ) ;
257+ Assert . That ( n , Is . EqualTo ( bytes . Length ) ) ;
258+
259+ Assert . That (
260+ bytes . AsSpan ( ) . SequenceEqual ( chunk ) ,
261+ Is . True ) ;
249262 }
250263 }
251264
252- var file = fs . GetFile ( "/flush-multipart-test.bin" ) ;
253- Assert . That ( await file . ExistsAsync ( ) , Is . True ) ;
254- Assert . That ( await file . GetLengthAsync ( ) , Is . EqualTo ( chunk . Length * 4 ) ) ;
255-
256- await file . DeleteAsync ( ) ;
257- }
265+ await fs . DeleteFileAsync ( FileName ) ;
258266
259- [ Test ]
260- public async Task File_OpenWrite_EmptyFileWithFlush ( )
261- {
262- using var fs = GetFileSystem ( ) ;
267+ static async Task < int > ReadBlockAsync ( Stream stream , Memory < byte > memory )
268+ {
269+ var count = memory . Length ;
263270
264- await using ( var stream = await fs . OpenWriteAsync ( "/empty-flush-test.txt" ) )
265- await stream . FlushAsync ( ) ;
271+ while ( ! memory . IsEmpty )
272+ {
273+ var n = await stream . ReadAsync ( memory ) ;
274+ if ( n == 0 )
275+ return 0 ;
266276
267- var file = fs . GetFile ( "/empty-flush-test.txt" ) ;
268- Assert . That ( await file . ExistsAsync ( ) , Is . True ) ;
269- Assert . That ( await file . GetLengthAsync ( ) , Is . EqualTo ( 0 ) ) ;
277+ memory = memory [ n ..] ;
278+ }
270279
271- await file . DeleteAsync ( ) ;
280+ return count ;
281+ }
272282 }
273283
274284 [ Test ]
0 commit comments