TestableIO/System.IO.Abstractions

`FlushAsync` doesn't update file contents

cryocz opened this issue · 3 comments

Describe the bug
While Flush does update the contents of the file, allowing other streams to read it later, FlushAsync does not.

To Reproduce

var fs = new MockFileSystem();
var file = fs.FileInfo.New("/file");
await using var first = file.OpenWrite();
await first.WriteAsync(new byte[] { 42 });
await first.FlushAsync();

await using var second = file.OpenRead();
var buffer = new byte[1];
Assert.Equal(1, await second.ReadAsync(buffer));
Assert.Equal(42, buffer[0]);

Expected behavior
Behave identically to the synchronous version, which does successfully pass.

var fs = new MockFileSystem();
var file = fs.FileInfo.New("/file");
using var first = file.OpenWrite();
first.Write(new byte[] { 42 });
first.Flush();

using var second = file.OpenRead();
var buffer = new byte[1];
Assert.Equal(1, second.Read(buffer));
Assert.Equal(42, buffer[0]);

Thanks for reporting!

Probably we need to override FlushAsync similar to how we override Flush.

I'll be submitting a PR for this in just a bit. It should be noted that correctly implementing FlushAsync is more of a band-aid over the fundamental underlying issue: mocked file streams do not share their data buffer. This means that concurrent MockFileStreams, opened on the same file, do not behave like real streams at all.

This is addressed in release v19.2.4.