Skip to content

Commit 920527b

Browse files
committed
Fix timestamps in MockFileStream
This fixes setting of the appropriate timestamps in the MockFileData instances, when accessing them via the MockFileStream. This contains the implementation intended in #860.
1 parent 327f4a7 commit 920527b

File tree

2 files changed

+120
-7
lines changed

2 files changed

+120
-7
lines changed

src/System.IO.Abstractions.TestingHelpers/MockFileStream.cs

+22-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class MockFileStream : MemoryStream
88
private readonly string path;
99
private readonly FileAccess access = FileAccess.ReadWrite;
1010
private readonly FileOptions options;
11-
11+
private readonly MockFileData fileData;
1212
private bool disposed;
1313

1414
/// <inheritdoc />
@@ -31,7 +31,8 @@ public MockFileStream(
3131
throw CommonExceptions.FileAlreadyExists(path);
3232
}
3333

34-
var fileData = mockFileDataAccessor.GetFile(path);
34+
fileData = mockFileDataAccessor.GetFile(path);
35+
fileData.LastAccessTime = DateTime.Now;
3536
fileData.CheckFileAccess(path, access);
3637

3738
var existingContents = fileData.Contents;
@@ -40,8 +41,8 @@ public MockFileStream(
4041
mode != FileMode.Truncate && mode != FileMode.Create;
4142
if (keepExistingContents)
4243
{
43-
Write(existingContents, 0, existingContents.Length);
44-
Seek(0, mode == FileMode.Append
44+
base.Write(existingContents, 0, existingContents.Length);
45+
base.Seek(0, mode == FileMode.Append
4546
? SeekOrigin.End
4647
: SeekOrigin.Begin);
4748
}
@@ -59,7 +60,9 @@ public MockFileStream(
5960
throw CommonExceptions.FileNotFound(path);
6061
}
6162

62-
mockFileDataAccessor.AddFile(path, new MockFileData(new byte[] { }));
63+
fileData = new MockFileData(new byte[] { });
64+
fileData.CreationTime = fileData.LastWriteTime = fileData.LastAccessTime = DateTime.Now;
65+
mockFileDataAccessor.AddFile(path, fileData);
6366
}
6467

6568
this.access = access;
@@ -71,6 +74,20 @@ public MockFileStream(
7174
/// <inheritdoc />
7275
public override bool CanWrite => access.HasFlag(FileAccess.Write);
7376

77+
/// <inheritdoc />
78+
public override int Read(byte[] buffer, int offset, int count)
79+
{
80+
fileData.LastAccessTime = DateTime.Now;
81+
return base.Read(buffer, offset, count);
82+
}
83+
84+
/// <inheritdoc />
85+
public override void Write(byte[] buffer, int offset, int count)
86+
{
87+
fileData.LastWriteTime = fileData.LastAccessTime = DateTime.Now;
88+
base.Write(buffer, offset, count);
89+
}
90+
7491
/// <inheritdoc />
7592
protected override void Dispose(bool disposing)
7693
{

tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileOpenTests.cs

+98-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Threading.Tasks;
2+
13
namespace System.IO.Abstractions.TestingHelpers.Tests
24
{
35
using Collections.Generic;
@@ -217,7 +219,7 @@ public void MockFile_OpenText_ShouldRetainLastWriteTime()
217219
}
218220

219221
[Test]
220-
public void MockFile_OpenText_ShouldRetainLastAccessTime()
222+
public void MockFile_OpenText_ShouldUpdateLastAccessTime()
221223
{
222224
// Arrange
223225
var fs = new MockFileSystem();
@@ -234,7 +236,101 @@ public void MockFile_OpenText_ShouldRetainLastAccessTime()
234236
}
235237

236238
// Assert
237-
Assert.AreEqual(lastAccessTime, fs.FileInfo.FromFileName(filepath).LastAccessTime);
239+
Assert.LessOrEqual(DateTime.Now - fs.FileInfo.FromFileName(filepath).LastAccessTime, TimeSpan.FromSeconds(1));
240+
}
241+
242+
[Test]
243+
public void MockFile_Read_ShouldRetainCreationTimeAndUpdateLastAccessTime()
244+
{
245+
// Arrange
246+
var fs = new MockFileSystem();
247+
var filepath = XFS.Path(@"C:\TestData\test.txt");
248+
var file = new MockFileData(new byte[] { 1, 2, 3 });
249+
var lastAccessTime = new DateTime(2012, 03, 21);
250+
file.LastAccessTime = lastAccessTime;
251+
var creationTime = new DateTime(2012, 03, 20);
252+
file.CreationTime = creationTime;
253+
fs.AddFile(filepath, file);
254+
255+
var fi = fs.FileInfo.FromFileName(filepath);
256+
var stream = fi.OpenRead();
257+
var buffer = new byte[16];
258+
stream.Read(buffer, 0, buffer.Length);
259+
fi.Refresh();
260+
// Assert
261+
Assert.AreEqual(creationTime, fi.CreationTime);
262+
Assert.LessOrEqual(DateTime.Now - fi.LastAccessTime, TimeSpan.FromSeconds(1));
263+
}
264+
265+
[Test]
266+
public async Task MockFile_ReadAsync_ShouldRetainCreationTimeAndUpdateLastAccessTime()
267+
{
268+
// Arrange
269+
var fs = new MockFileSystem();
270+
var filepath = XFS.Path(@"C:\TestData\test.txt");
271+
var file = new MockFileData(new byte[] { 1, 2, 3 });
272+
var lastAccessTime = new DateTime(2012, 03, 21);
273+
file.LastAccessTime = lastAccessTime;
274+
var creationTime = new DateTime(2012, 03, 20);
275+
file.CreationTime = creationTime;
276+
fs.AddFile(filepath, file);
277+
278+
var fi = fs.FileInfo.FromFileName(filepath);
279+
var stream = fi.OpenRead();
280+
var buffer = new byte[16];
281+
await stream.ReadAsync(buffer, 0, buffer.Length);
282+
fi.Refresh();
283+
// Assert
284+
Assert.AreEqual(creationTime, fi.CreationTime);
285+
Assert.LessOrEqual(DateTime.Now - fi.LastAccessTime, TimeSpan.FromSeconds(1));
286+
}
287+
288+
[Test]
289+
public void MockFile_Write_ShouldRetainCreationTimeAndUpdateLastAccessTimeAndLastWriteTime()
290+
{
291+
// Arrange
292+
var fs = new MockFileSystem();
293+
var filepath = XFS.Path(@"C:\TestData\test.txt");
294+
var file = new MockFileData(new byte[] { 1, 2, 3 });
295+
var lastAccessTime = new DateTime(2012, 03, 21);
296+
file.LastAccessTime = lastAccessTime;
297+
var creationTime = new DateTime(2012, 03, 20);
298+
file.CreationTime = creationTime;
299+
fs.AddFile(filepath, file);
300+
301+
var fi = fs.FileInfo.FromFileName(filepath);
302+
var stream = fi.OpenWrite();
303+
var buffer = new byte[16];
304+
stream.Write(buffer, 0, buffer.Length);
305+
fi.Refresh();
306+
// Assert
307+
Assert.AreEqual(creationTime, fi.CreationTime);
308+
Assert.LessOrEqual(DateTime.Now - fi.LastAccessTime, TimeSpan.FromSeconds(1));
309+
Assert.LessOrEqual(DateTime.Now - fi.LastWriteTime, TimeSpan.FromSeconds(1));
310+
}
311+
312+
[Test]
313+
public async Task MockFile_WriteAsync_ShouldRetainCreationTimeAndUpdateLastAccessTimeAndLastWriteTime()
314+
{
315+
// Arrange
316+
var fs = new MockFileSystem();
317+
var filepath = XFS.Path(@"C:\TestData\test.txt");
318+
var file = new MockFileData(new byte[] { 1, 2, 3 });
319+
var lastAccessTime = new DateTime(2012, 03, 21);
320+
file.LastAccessTime = lastAccessTime;
321+
var creationTime = new DateTime(2012, 03, 20);
322+
file.CreationTime = creationTime;
323+
fs.AddFile(filepath, file);
324+
325+
var fi = fs.FileInfo.FromFileName(filepath);
326+
var stream = fi.OpenWrite();
327+
var buffer = new byte[16];
328+
await stream.WriteAsync(buffer, 0, buffer.Length);
329+
fi.Refresh();
330+
// Assert
331+
Assert.AreEqual(creationTime, fi.CreationTime);
332+
Assert.LessOrEqual(DateTime.Now - fi.LastAccessTime, TimeSpan.FromSeconds(1));
333+
Assert.LessOrEqual(DateTime.Now - fi.LastWriteTime, TimeSpan.FromSeconds(1));
238334
}
239335

240336
[Test]

0 commit comments

Comments
 (0)