From dbcd4e89f8ea35a543e8eeba067c281980df5b70 Mon Sep 17 00:00:00 2001 From: Henrique Graca <999396+hjgraca@users.noreply.github.com> Date: Wed, 8 Feb 2023 18:35:07 +0000 Subject: [PATCH] fix flaky test, add relaxed json escaping --- .../Internal/PowertoolsLogger.cs | 4 ++ .../PowertoolsLoggerTest.cs | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLogger.cs b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLogger.cs index 072472ab6..c45a75157 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLogger.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/PowertoolsLogger.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Encodings.Web; using System.Text.Json; using AWS.Lambda.Powertools.Common; using AWS.Lambda.Powertools.Logging.Internal.Converters; @@ -355,6 +356,9 @@ private JsonSerializerOptions BuildJsonSerializerOptions() jsonOptions.Converters.Add(new ExceptionConverter()); jsonOptions.Converters.Add(new MemoryStreamConverter()); jsonOptions.Converters.Add(new ConstantClassConverter()); + + jsonOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; + return jsonOptions; } } \ No newline at end of file diff --git a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs index d94585bcf..d962ba2f0 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/PowertoolsLoggerTest.cs @@ -18,6 +18,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Text; using AWS.Lambda.Powertools.Common; using AWS.Lambda.Powertools.Logging.Internal; using Microsoft.Extensions.Logging; @@ -1175,5 +1176,49 @@ public void Log_WhenMemoryStream_LogsBase64String() ) ), Times.Once); } + + [Fact] + public void Log_WhenMemoryStream_LogsBase64String_UnsafeRelaxedJsonEscaping() + { + // Arrange + var loggerName = Guid.NewGuid().ToString(); + var service = Guid.NewGuid().ToString(); + + // This will produce the encoded string dW5zYWZlIHN0cmluZyB+IHRlc3Q= (which has a plus sign to test unsafe escaping) + var bytes = Encoding.UTF8.GetBytes("unsafe string ~ test"); + + var memoryStream = new MemoryStream(bytes) + { + Position = 0 + }; + var logLevel = LogLevel.Information; + var randomSampleRate = 0.5; + + var configurations = new Mock(); + configurations.Setup(c => c.Service).Returns(service); + configurations.Setup(c => c.LogLevel).Returns(logLevel.ToString); + + var systemWrapper = new Mock(); + systemWrapper.Setup(c => c.GetRandom()).Returns(randomSampleRate); + + var logger = new PowertoolsLogger(loggerName, configurations.Object, systemWrapper.Object, () => + new LoggerConfiguration + { + Service = null, + MinimumLevel = null + }); + + // Act + logger.LogInformation(new { Name = "Test Object", Stream = memoryStream }); + + // Assert + systemWrapper.Verify(v => + v.LogLine( + It.Is + (s => + s.Contains("\"stream\":\"" + Convert.ToBase64String(bytes) + "\"") + ) + ), Times.Once); + } } } \ No newline at end of file