public void OpenWrite_WithLargeFile_InParallel_PassesContextCorrectly() { var fixture = DokanOperationsFixture.Instance; var path = fixture.FileName.AsRootedPath(); var context = new object(); #if LOGONLY fixture.SetupAny(); #else fixture.ExpectCreateFile(path, WriteAccess, WriteShare, FileMode.OpenOrCreate, FileOptions.None, context: context); fixture.ExpectWriteFileInChunks(path, largeData, FILE_BUFFER_SIZE, context: context); fixture.PermitProbeFile(path, largeData); #endif var sut = new FileInfo(fixture.FileName.AsDriveBasedPath()); using (var stream = sut.OpenWrite()) { var totalWrittenBytes = 0; Parallel.For(0, DokanOperationsFixture.NumberOfChunks(FILE_BUFFER_SIZE, largeData.Length), i => { var origin = i * FILE_BUFFER_SIZE; var count = Math.Min(FILE_BUFFER_SIZE, largeData.Length - origin); lock (stream) { stream.Seek(origin, SeekOrigin.Begin); stream.Write(largeData, origin, count); totalWrittenBytes += count; } }); } #if !LOGONLY fixture.VerifyContextWriteInvocations(path, 6); #endif }
public void OpenRead_WithLargeFile_InParallel_PassesContextCorrectly() { var fixture = DokanOperationsFixture.Instance; var path = fixture.FileName.AsRootedPath(); var context = new object(); #if LOGONLY fixture.SetupAny(); #else fixture.ExpectCreateFile(path, ReadAccess, ReadOnlyShare, FileMode.Open, FileOptions.None, context: context); fixture.ExpectReadFileInChunks(path, largeData, FILE_BUFFER_SIZE, context: context); #endif var sut = new FileInfo(fixture.FileName.AsDriveBasedPath()); using (var stream = sut.OpenRead()) { var target = new byte[largeData.Length]; var totalReadBytes = 0; Parallel.For(0, DokanOperationsFixture.NumberOfChunks(FILE_BUFFER_SIZE, largeData.Length), i => { var origin = i * FILE_BUFFER_SIZE; var count = Math.Min(FILE_BUFFER_SIZE, target.Length - origin); lock (stream) { stream.Seek(origin, SeekOrigin.Begin); totalReadBytes += stream.Read(target, origin, count); } }); } #if !LOGONLY fixture.VerifyContextReadInvocations(path, 6); #endif }