|
5 | 5 | using System.Buffers;
|
6 | 6 | using System.IO;
|
7 | 7 | using System.Linq;
|
8 |
| -using System.Text; |
9 | 8 | using System.Threading.Tasks;
|
10 | 9 | using Moq;
|
11 | 10 | using Xunit;
|
@@ -353,39 +352,49 @@ public async Task FileBufferingReadStream_UsingMemoryStream_RentsAndReturnsRente
|
353 | 352 | [Fact]
|
354 | 353 | public async Task CopyToAsyncWorks()
|
355 | 354 | {
|
356 |
| - var data = Enumerable.Range(0, 1024).Select(b => (byte)b).Reverse().ToArray(); |
| 355 | + // 4K is the lower bound on buffer sizes |
| 356 | + var bufferSize = 4096; |
| 357 | + var mostExpectedWrites = 8; |
| 358 | + var data = Enumerable.Range(0, bufferSize * mostExpectedWrites).Select(b => (byte)b).ToArray(); |
357 | 359 | var inner = new MemoryStream(data);
|
358 | 360 |
|
359 | 361 | using var stream = new FileBufferingReadStream(inner, 1024 * 1024, bufferLimit: null, GetCurrentDirectory());
|
360 | 362 |
|
361 |
| - var withoutBufferMs = new MemoryStream(); |
| 363 | + var withoutBufferMs = new NumberOfWritesMemoryStream(); |
362 | 364 | await stream.CopyToAsync(withoutBufferMs);
|
363 | 365 |
|
364 |
| - var withBufferMs = new MemoryStream(); |
| 366 | + var withBufferMs = new NumberOfWritesMemoryStream(); |
365 | 367 | stream.Position = 0;
|
366 | 368 | await stream.CopyToAsync(withBufferMs);
|
367 | 369 |
|
368 | 370 | Assert.Equal(data, withoutBufferMs.ToArray());
|
| 371 | + Assert.Equal(mostExpectedWrites, withoutBufferMs.NumberOfWrites); |
369 | 372 | Assert.Equal(data, withBufferMs.ToArray());
|
| 373 | + Assert.InRange(withBufferMs.NumberOfWrites, 1, mostExpectedWrites); |
370 | 374 | }
|
371 | 375 |
|
372 | 376 | [Fact]
|
373 | 377 | public async Task CopyToAsyncWorksWithFileThreshold()
|
374 | 378 | {
|
375 |
| - var data = Enumerable.Range(0, 1024).Select(b => (byte)b).Reverse().ToArray(); |
| 379 | + // 4K is the lower bound on buffer sizes |
| 380 | + var bufferSize = 4096; |
| 381 | + var mostExpectedWrites = 8; |
| 382 | + var data = Enumerable.Range(0, bufferSize * mostExpectedWrites).Select(b => (byte)b).Reverse().ToArray(); |
376 | 383 | var inner = new MemoryStream(data);
|
377 | 384 |
|
378 | 385 | using var stream = new FileBufferingReadStream(inner, 100, bufferLimit: null, GetCurrentDirectory());
|
379 | 386 |
|
380 |
| - var withoutBufferMs = new MemoryStream(); |
| 387 | + var withoutBufferMs = new NumberOfWritesMemoryStream(); |
381 | 388 | await stream.CopyToAsync(withoutBufferMs);
|
382 | 389 |
|
383 |
| - var withBufferMs = new MemoryStream(); |
| 390 | + var withBufferMs = new NumberOfWritesMemoryStream(); |
384 | 391 | stream.Position = 0;
|
385 | 392 | await stream.CopyToAsync(withBufferMs);
|
386 | 393 |
|
387 | 394 | Assert.Equal(data, withoutBufferMs.ToArray());
|
| 395 | + Assert.Equal(mostExpectedWrites, withoutBufferMs.NumberOfWrites); |
388 | 396 | Assert.Equal(data, withBufferMs.ToArray());
|
| 397 | + Assert.InRange(withBufferMs.NumberOfWrites, 1, mostExpectedWrites); |
389 | 398 | }
|
390 | 399 |
|
391 | 400 | [Fact]
|
@@ -486,5 +495,22 @@ private static string GetCurrentDirectory()
|
486 | 495 | {
|
487 | 496 | return AppContext.BaseDirectory;
|
488 | 497 | }
|
| 498 | + |
| 499 | + private class NumberOfWritesMemoryStream : MemoryStream |
| 500 | + { |
| 501 | + public int NumberOfWrites { get; set; } |
| 502 | + |
| 503 | + public override void Write(byte[] buffer, int offset, int count) |
| 504 | + { |
| 505 | + NumberOfWrites++; |
| 506 | + base.Write(buffer, offset, count); |
| 507 | + } |
| 508 | + |
| 509 | + public override void Write(ReadOnlySpan<byte> source) |
| 510 | + { |
| 511 | + NumberOfWrites++; |
| 512 | + base.Write(source); |
| 513 | + } |
| 514 | + } |
489 | 515 | }
|
490 | 516 | }
|
0 commit comments