`FlushAsync` doesn't update file contents
cryocz opened this issue · 3 comments
cryocz commented
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]);
fgreinacher commented
Thanks for reporting!
Probably we need to override FlushAsync
similar to how we override Flush
.
cryocz commented
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 MockFileStream
s, opened on the same file, do not behave like real streams at all.
github-actions commented
This is addressed in release v19.2.4.