public async Task AttachPipeSink_WhenLogModeIsOperations_ShouldWriteToLogFileJustOperations(LogMode logMode) { var timeout = TimeSpan.FromSeconds(10); var name = GetTestName(); var path = NewDataPath(forceCreateDir: true); path = Path.Combine(path, Guid.NewGuid().ToString()); Directory.CreateDirectory(path); var loggingSource = new LoggingSource( logMode, path, "LoggingSource" + name, TimeSpan.MaxValue, long.MaxValue, false); var logger = new Logger(loggingSource, "Source" + name, "Logger" + name); var tcs = new TaskCompletionSource <WebSocketReceiveResult>(TaskCreationOptions.RunContinuationsAsynchronously); await using var stream = new MemoryStream(); //Attach Pipe loggingSource.AttachPipeSink(stream); var beforeDetachOperation = Guid.NewGuid().ToString(); var beforeDetachInformation = Guid.NewGuid().ToString(); var logTasks = Task.WhenAll(logger.OperationsAsync(beforeDetachOperation), logger.InfoAsync(beforeDetachInformation)); await Task.WhenAny(logTasks, Task.Delay(timeout)); Assert.True(logTasks.IsCompleted, $"Waited over {timeout.TotalSeconds} seconds for log tasks to finish"); //Detach Pipe loggingSource.DetachPipeSink(); await stream.FlushAsync(); var afterDetachOperation = Guid.NewGuid().ToString(); var afterDetachInformation = Guid.NewGuid().ToString(); logTasks = Task.WhenAll(logger.OperationsAsync(afterDetachOperation), logger.InfoAsync(afterDetachInformation)); await Task.WhenAny(logTasks, Task.Delay(timeout)); Assert.True(logTasks.IsCompleted || logMode == LogMode.None, $"Waited over {timeout.TotalSeconds} seconds for log tasks to finish"); tcs.SetResult(new WebSocketReceiveResult(1, WebSocketMessageType.Text, true, WebSocketCloseStatus.NormalClosure, "")); loggingSource.EndLogging(); var logsFromPipe = Encodings.Utf8.GetString(stream.ToArray()); Assert.Contains(beforeDetachInformation, logsFromPipe); Assert.Contains(beforeDetachOperation, logsFromPipe); Assert.DoesNotContain(afterDetachInformation, logsFromPipe); Assert.DoesNotContain(afterDetachOperation, logsFromPipe); string logsFileContentAfter = await ReadLogsFileContent(path); AssertContainsLog(LogMode.Information, logMode)(beforeDetachInformation, logsFileContentAfter); AssertContainsLog(LogMode.Operations, logMode)(beforeDetachOperation, logsFileContentAfter); AssertContainsLog(LogMode.Information, logMode)(afterDetachInformation, logsFileContentAfter); AssertContainsLog(LogMode.Operations, logMode)(afterDetachOperation, logsFileContentAfter); }
public async Task Register_WhenLogModeIsOperations_ShouldWriteToLogFileJustAsLogMode(LogMode logMode) { var timeout = TimeSpan.FromSeconds(10); var name = GetTestName(); var path = NewDataPath(forceCreateDir: true); path = Path.Combine(path, Guid.NewGuid().ToString()); Directory.CreateDirectory(path); var loggingSource = new LoggingSource( logMode, path, "LoggingSource" + name, TimeSpan.MaxValue, long.MaxValue, false); var logger = new Logger(loggingSource, "Source" + name, "Logger" + name); var tcs = new TaskCompletionSource <WebSocketReceiveResult>(TaskCreationOptions.RunContinuationsAsynchronously); var socket = new DummyWebSocket(); socket.ReceiveAsyncFunc = () => tcs.Task; var context = new LoggingSource.WebSocketContext(); //Register var _ = loggingSource.Register(socket, context, CancellationToken.None); var beforeCloseOperation = Guid.NewGuid().ToString(); var beforeCloseInformation = Guid.NewGuid().ToString(); var logTasks = Task.WhenAll(logger.OperationsAsync(beforeCloseOperation), logger.InfoAsync(beforeCloseInformation)); await Task.WhenAny(logTasks, Task.Delay(timeout)); Assert.True(logTasks.IsCompleted, $"Waited over {timeout.TotalSeconds} seconds for log tasks to finish"); const int socketTimeout = 5000; var socketContainsLogs = WaitForValue(() => socket.LogsReceived.Contains(beforeCloseInformation) && socket.LogsReceived.Contains(beforeCloseOperation), true, socketTimeout, 100); Assert.True(socketContainsLogs, $"Waited over {socketTimeout} seconds for log to be written to socket"); //Close socket socket.Close(); tcs.SetResult(new WebSocketReceiveResult(1, WebSocketMessageType.Text, true, WebSocketCloseStatus.NormalClosure, string.Empty)); var afterCloseOperation = Guid.NewGuid().ToString(); var afterCloseInformation = Guid.NewGuid().ToString(); logTasks = Task.WhenAll(logger.OperationsAsync(afterCloseOperation), logger.InfoAsync(afterCloseInformation)); await Task.WhenAny(logTasks, Task.Delay(timeout)); Assert.True(logTasks.IsCompleted || logMode == LogMode.None, $"Waited over {timeout.TotalSeconds} seconds for log tasks to finish"); loggingSource.EndLogging(); string logsFileContentAfter = await ReadLogsFileContent(path); AssertContainsLog(LogMode.Information, logMode)(beforeCloseInformation, logsFileContentAfter); AssertContainsLog(LogMode.Operations, logMode)(beforeCloseOperation, logsFileContentAfter); AssertContainsLog(LogMode.Information, logMode)(afterCloseInformation, logsFileContentAfter); AssertContainsLog(LogMode.Operations, logMode)(afterCloseOperation, logsFileContentAfter); }