private Task CreateWriteTask(CancellationToken cancellationToken, NonBlockingFileWriter writer) { return(Task.Run(async() => { int i = 0; while (!cancellationToken.IsCancellationRequested) { writer.Write("test" + i); await Task.Delay(i % 50 + 10); i++; } })); }
public async Task TestFileWriter() { string filename = Guid.NewGuid().ToString(); NonBlockingFileWriter writer = new NonBlockingFileWriter(filename); await AssertInTimeout(() => File.Exists(filename) == false); await AssertInTimeout(() => writer.HasFailed == false); await AssertInTimeout(() => writer.IsEnabled); await AssertInTimeout(() => writer.IsDisposed); await AssertInTimeout(() => writer.IsEmpty); for (int j = 0; j < 3; j++) { writer.IsEnabled = true; for (int i = 0; i < 50; i++) { writer.Write("test" + i); } await AssertInTimeout(() => File.Exists(filename)); await AssertInTimeout(() => writer.HasFailed == false); await AssertInTimeout(() => writer.IsEnabled); await AssertInTimeout(() => writer.IsDisposed == false); await AssertInTimeout(() => writer.IsEmpty); writer.IsEnabled = false; for (int i = 0; i < 50; i++) { writer.Write("test" + i); } await AssertInTimeout(() => writer.HasFailed == false); await AssertInTimeout(() => writer.IsEnabled == false); await AssertInTimeout(() => writer.IsDisposed); await AssertInTimeout(() => writer.IsEmpty); File.Delete(filename); writer.Write("should not write"); await AssertInTimeout(() => writer.HasFailed == false); await AssertInTimeout(() => writer.IsEnabled == false); await AssertInTimeout(() => writer.IsDisposed); await AssertInTimeout(() => writer.IsEmpty); } var cancellationTokenSource = new CancellationTokenSource(); var token = cancellationTokenSource.Token; var concurrentWrites = new[] { CreateWriteTask(token, writer), CreateWriteTask(token, writer), CreateWriteTask(token, writer), CreateWriteTask(token, writer) }; for (int i = 0; i < 3; i++) { writer.IsEnabled = true; await Task.Delay(50); writer.IsEnabled = false; await AssertInTimeout(() => writer.HasFailed == false); await AssertInTimeout(() => writer.IsEnabled == false); await AssertInTimeout(() => writer.IsDisposed); await AssertInTimeout(() => writer.IsEmpty); } writer.IsEnabled = true; writer.ThrowWrite = true; await AssertInTimeout(() => writer.HasFailed); await AssertInTimeout(() => writer.IsEnabled); await AssertInTimeout(() => writer.IsDisposed); cancellationTokenSource.Cancel(); await Task.WhenAll(concurrentWrites); await AssertInTimeout(() => writer.IsEmpty); File.Delete(filename); writer.Write("should not write"); Assert.False(File.Exists(filename)); }