From 560410a9399ee240f398508efa4884c240b2de87 Mon Sep 17 00:00:00 2001 From: Hadi Eskandari Date: Tue, 21 Jul 2020 21:27:16 +1000 Subject: [PATCH 1/3] add json prettifier for the diagnostic file --- .../HostStartupDiagnosticsWriterFactory.cs | 7 +- .../StartupDiagnostics/JsonPrettyPrinter.cs | 72 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs diff --git a/src/NServiceBus.Core/Hosting/StartupDiagnostics/HostStartupDiagnosticsWriterFactory.cs b/src/NServiceBus.Core/Hosting/StartupDiagnostics/HostStartupDiagnosticsWriterFactory.cs index a156c3b326..407fb038bd 100644 --- a/src/NServiceBus.Core/Hosting/StartupDiagnostics/HostStartupDiagnosticsWriterFactory.cs +++ b/src/NServiceBus.Core/Hosting/StartupDiagnostics/HostStartupDiagnosticsWriterFactory.cs @@ -55,7 +55,12 @@ static Func BuildDefaultDiagnosticsWriter(HostingComponent.Configu var startupDiagnosticsFileName = $"{configuration.EndpointName}-configuration.txt"; var startupDiagnosticsFilePath = Path.Combine(diagnosticsRootPath, startupDiagnosticsFileName); - return data => AsyncFile.WriteText(startupDiagnosticsFilePath, data); + + return data => + { + var prettied = JsonPrettyPrinter.Print(data); + return AsyncFile.WriteText(startupDiagnosticsFilePath, prettied); + }; } static readonly ILog logger = LogManager.GetLogger(); diff --git a/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs b/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs new file mode 100644 index 0000000000..0e57baca1a --- /dev/null +++ b/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs @@ -0,0 +1,72 @@ +namespace NServiceBus +{ + using System.Text; + + static class JsonPrettyPrinter + { + const string LINE_INDENT = " "; + + internal static string Print(string input) + { + var builder = new StringBuilder(input.Length); + var quoted = false; + var indent = 0; + + for (var i = 0; i < input.Length; i++) + { + var ch = input[i]; + switch (ch) + { + case '{': + case '[': + builder.Append(ch); + if (!quoted) PrintIndent(builder, ++indent); + break; + case '}': + case ']': + if(!quoted) PrintIndent(builder, --indent); + builder.Append(ch); + break; + case '"': + builder.Append(ch); + var escaped = IsEscaped(input, i); + if (!escaped) quoted = !quoted; + break; + case ',': + builder.Append(ch); + if (!quoted) PrintIndent(builder, indent); + break; + case ':': + builder.Append(ch); + if (!quoted) builder.Append(" "); + break; + default: + builder.Append(ch); + break; + } + } + + return builder.ToString(); + } + + static bool IsEscaped(string input, int i) + { + var escaped = false; + var index = i; + while (index > 0 && input[--index] == '\\') + { + escaped = !escaped; + } + return escaped; + } + + static void PrintIndent(StringBuilder sb, int indent) + { + sb.AppendLine(); + for (var i = 0; i <= indent; i++) + { + sb.Append(LINE_INDENT); + } + } + } +} \ No newline at end of file From ac8ffb67c77dc93506f76ecf465a3a3cb5ac4aae Mon Sep 17 00:00:00 2001 From: Hadi Eskandari Date: Wed, 22 Jul 2020 17:45:58 +1000 Subject: [PATCH 2/3] fix an edge case with the prettifier --- .../Hosting/StartupDiagnostics/JsonPrettyPrinter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs b/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs index 0e57baca1a..1abfb9c8cf 100644 --- a/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs +++ b/src/NServiceBus.Core/Hosting/StartupDiagnostics/JsonPrettyPrinter.cs @@ -63,7 +63,7 @@ static bool IsEscaped(string input, int i) static void PrintIndent(StringBuilder sb, int indent) { sb.AppendLine(); - for (var i = 0; i <= indent; i++) + for (var i = 0; i < indent; i++) { sb.Append(LINE_INDENT); } From a171d841304737494eeabf7735da36e8bc378f51 Mon Sep 17 00:00:00 2001 From: Hadi Eskandari Date: Wed, 22 Jul 2020 17:46:22 +1000 Subject: [PATCH 3/3] add approval tests --- ...int_ShouldPrettifyCollections.approved.txt | 9 +++++ ..._ShouldPrettifyEscapedStrings.approved.txt | 8 +++++ ...int_ShouldPrettifyJsonContent.approved.txt | 5 +++ .../Diagnostics/JsonPrettifierTests.cs | 33 +++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyCollections.approved.txt create mode 100644 src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyEscapedStrings.approved.txt create mode 100644 src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyJsonContent.approved.txt create mode 100644 src/NServiceBus.Core.Tests/Diagnostics/JsonPrettifierTests.cs diff --git a/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyCollections.approved.txt b/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyCollections.approved.txt new file mode 100644 index 0000000000..a0e6a49ef4 --- /dev/null +++ b/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyCollections.approved.txt @@ -0,0 +1,9 @@ +{ + "Dependencies": [ + "RootFeature", + "DelayedDeliveryFeature" + ], + "StartupTasks": [ + + ] +} \ No newline at end of file diff --git a/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyEscapedStrings.approved.txt b/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyEscapedStrings.approved.txt new file mode 100644 index 0000000000..886ab1ac44 --- /dev/null +++ b/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyEscapedStrings.approved.txt @@ -0,0 +1,8 @@ +{ + "PrerequisiteStatus": { + "IsSatisfied": false, + "Reasons": [ + "Because some \"escaped\" json content" + ] + } +} \ No newline at end of file diff --git a/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyJsonContent.approved.txt b/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyJsonContent.approved.txt new file mode 100644 index 0000000000..6f133cd03c --- /dev/null +++ b/src/NServiceBus.Core.Tests/ApprovalFiles/JsonPrettifierTests.Print_ShouldPrettifyJsonContent.approved.txt @@ -0,0 +1,5 @@ +{ + "Container": { + "Type": "NServiceBus.CommonObjectBuilder" + } +} \ No newline at end of file diff --git a/src/NServiceBus.Core.Tests/Diagnostics/JsonPrettifierTests.cs b/src/NServiceBus.Core.Tests/Diagnostics/JsonPrettifierTests.cs new file mode 100644 index 0000000000..7b7669d041 --- /dev/null +++ b/src/NServiceBus.Core.Tests/Diagnostics/JsonPrettifierTests.cs @@ -0,0 +1,33 @@ +namespace NServiceBus.Core.Tests.Diagnostics +{ + using NUnit.Framework; + using Particular.Approvals; + + [TestFixture] + public class JsonPrettifierTests + { + [TestCase] + public void Print_ShouldPrettifyJsonContent() + { + var json = @"{""Container"":{""Type"":""NServiceBus.CommonObjectBuilder""}}"; + var prettified = JsonPrettyPrinter.Print(json); + Approver.Verify(prettified); + } + + [TestCase] + public void Print_ShouldPrettifyCollections() + { + var json = @"{""Dependencies"":[""RootFeature"",""DelayedDeliveryFeature""],""StartupTasks"":[]}"; + var prettified = JsonPrettyPrinter.Print(json); + Approver.Verify(prettified); + } + + [TestCase] + public void Print_ShouldPrettifyEscapedStrings() + { + var json = @"{""PrerequisiteStatus"": {""IsSatisfied"": false, ""Reasons"": [""Because some \""escaped\"" json content""]}}"; + var prettified = JsonPrettyPrinter.Print(json); + Approver.Verify(prettified); + } + } +} \ No newline at end of file