Skip to content

Commit 2b8bd0e

Browse files
authored
Merge pull request #55 from ladeak/colors_perf
Add color annotations to statistics printer output
2 parents 5d2f669 + dc715e2 commit 2b8bd0e

4 files changed

Lines changed: 80 additions & 21 deletions

File tree

src/CHttp/Performance/Statitics/StatisticsPrinter.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Numerics;
1+
using System.Drawing;
2+
using System.Numerics;
23
using CHttp.Abstractions;
34
using CHttp.Data;
45
using CHttp.Performance.Data;
@@ -51,11 +52,15 @@ public ValueTask HandleStats(PerformanceMeasurementResults session, Stats stats)
5152
int lineLength = _console.WindowWidth;
5253
var scaleNormalize = (double)lineLength / session.Summaries.Count;
5354
string separator = new string('-', lineLength);
55+
5456
// Histogram
5557
if (session.Summaries.Count >= 100)
5658
{
5759
_console.WriteLine(separator);
58-
PrintHistogram(stats, scaleNormalize);
60+
var oldColor = _console.ForegroundColor;
61+
_console.ForegroundColor = ConsoleColor.Cyan;
62+
PrintHistogram(stats, scaleNormalize);
63+
_console.ForegroundColor = oldColor;
5964
}
6065
_console.WriteLine(separator);
6166
PrintStatusCodes(stats.StatusCodes);
@@ -65,8 +70,11 @@ public ValueTask HandleStats(PerformanceMeasurementResults session, Stats stats)
6570

6671
private void PrintStatusCodes(int[] statusCodes)
6772
{
73+
var oldColor = _console.ForegroundColor;
74+
_console.ForegroundColor = statusCodes[0] + statusCodes[2]+ statusCodes[3]+ statusCodes[4]+ statusCodes[5] > 0 ? ConsoleColor.Red : ConsoleColor.Green;
6875
_console.WriteLine("HTTP status codes:");
6976
_console.WriteLine($"1xx: {statusCodes[0]}, 2xx: {statusCodes[1]}, 3xx: {statusCodes[2]}, 4xx: {statusCodes[3]}, 5xx: {statusCodes[4]}, Other: {statusCodes[5]}");
77+
_console.ForegroundColor = oldColor;
7078
}
7179

7280
private void PrintHistogram(Stats stats, double scaleNormalize)

tests/CHttp.Tests/Performance/CHttpDiffFunctionalTests.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ public async Task DisplayingMultipleEqualFile()
8787
.InvokeAsync(cancellationToken: TestContext.Current.CancellationToken)
8888
.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken);
8989

90-
Assert.Contains("| Mean: 1.000 s 0 ns |", console.Text);
91-
Assert.Contains("| StdDev: 0.000 ns 0 ns |", console.Text);
92-
Assert.Contains("| Error: 0.000 ns 0 ns |", console.Text);
93-
Assert.Contains("| Median: 1.000 s 0 ns |", console.Text);
94-
Assert.Contains("| Min: 1.000 s 0 ns |", console.Text);
95-
Assert.Contains("| Max: 1.000 s 0 ns |", console.Text);
96-
Assert.Contains("| 95th: 1.000 s 0 ns |", console.Text);
90+
Assert.Contains("| Mean: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
91+
Assert.Contains("| StdDev: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
92+
Assert.Contains("| Error: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
93+
Assert.Contains("| Median: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
94+
Assert.Contains("| Min: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
95+
Assert.Contains("| Max: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
96+
Assert.Contains("| 95th: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
9797
Assert.Contains("| Throughput: 100.000 B/s 0 B/s |", console.Text);
98-
Assert.Contains("| Req/Sec: 1 0 |", console.Text);
98+
Assert.Contains("| Req/Sec: 1 [color:Green] 0[color:Black] |", console.Text);
9999
Assert.Contains("1xx: 0 +0, 2xx: 1 +0, 3xx: 0 +0, 4xx: 0 +0, 5xx: 0 +0, Other: 0 +0", console.Text);
100100
}
101101

@@ -128,15 +128,15 @@ public async Task DisplayingMultipleDifferentFile()
128128
.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken);
129129

130130
Assert.Contains($"RequestCount: 1, Clients: 1", console.Text);
131-
Assert.Contains("| Mean: 1.000 s +1.000 s |", console.Text);
132-
Assert.Contains("| StdDev: 0.000 ns 0 ns |", console.Text);
133-
Assert.Contains("| Error: 0.000 ns 0 ns |", console.Text);
134-
Assert.Contains("| Median: 1.000 s +1.000 s |", console.Text);
135-
Assert.Contains("| Min: 1.000 s +1.000 s |", console.Text);
136-
Assert.Contains("| Max: 1.000 s +1.000 s |", console.Text);
137-
Assert.Contains("| 95th: 1.000 s +1.000 s |", console.Text);
131+
Assert.Contains("| Mean: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
132+
Assert.Contains("| StdDev: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
133+
Assert.Contains("| Error: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
134+
Assert.Contains("| Median: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
135+
Assert.Contains("| Min: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
136+
Assert.Contains("| Max: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
137+
Assert.Contains("| 95th: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
138138
Assert.Contains("| Throughput: 100.000 B/s +100.000 B/s |", console.Text);
139-
Assert.Contains("| Req/Sec: 1 -0.5 |", console.Text);
139+
Assert.Contains("| Req/Sec: 1 [color:Red] -0.5[color:Black] |", console.Text);
140140
Assert.Contains("1xx: 0 +0, 2xx: 1 -1, 3xx: 0 +0, 4xx: 0 +1, 5xx: 0 +0, Other: 0 +0", console.Text);
141141
}
142142

tests/CHttp.Tests/Performance/Statistics/StatisticsPrinterTests.cs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Globalization;
2+
using System.Net;
23
using CHttp.Abstractions;
34
using CHttp.Data;
45
using CHttp.Performance.Data;
@@ -159,10 +160,52 @@ public async Task Histogram()
159160
var sut = new StatisticsPrinter(console);
160161
await sut.SummarizeResultsAsync(new PerformanceMeasurementResults() { Summaries = input, TotalBytesRead = 1, MaxConnections = 1, Behavior = new(input.Count, 1, false) });
161162

162-
Assert.Contains(" 1.300 s ##################################################", console.Text);
163+
Assert.Contains("[color:Cyan] 1.300 s ##################################################", console.Text);
163164
Assert.Contains(" 2.200 s ##################################################", console.Text);
164165
Assert.Contains(" 3.100 s ##################################################", console.Text);
165166
Assert.Contains(" 4.000 s ##################################################", console.Text);
167+
Assert.Contains("[color:Black]---", console.Text);
168+
Assert.Contains("[color:Green]HTTP status codes:", console.Text);
166169
Assert.Equal(200, console.Text.Count(x => x == '#'));
167170
}
171+
172+
[Theory]
173+
[InlineData(HttpStatusCode.Continue)] // 100
174+
[InlineData(HttpStatusCode.Ambiguous)] // 300
175+
[InlineData(HttpStatusCode.BadRequest)] // 400
176+
[InlineData(HttpStatusCode.InternalServerError)] // 500
177+
public async Task ErrorCodes_Print_RedStatusLine(HttpStatusCode statusCode)
178+
{
179+
var input = new List<Summary>();
180+
for (int i = 0; i < 100; i++)
181+
{
182+
var summary = new Summary("url", new DateTime(2023, 04, 05, 21, 32, 00, DateTimeKind.Utc), TimeSpan.FromSeconds(1));
183+
summary.RequestCompleted(statusCode);
184+
input.Add(summary);
185+
}
186+
var console = new TestConsoleAsOuput(59);
187+
var sut = new StatisticsPrinter(console);
188+
await sut.SummarizeResultsAsync(new PerformanceMeasurementResults() { Summaries = input, TotalBytesRead = 1, MaxConnections = 1, Behavior = new(input.Count, 1, false) });
189+
190+
Assert.Contains("[color:Red]HTTP status codes:", console.Text);
191+
Assert.Contains("[color:Black]---", console.Text);
192+
}
193+
194+
[Fact]
195+
public async Task OtherError_Print_RedStatusLine()
196+
{
197+
var input = new List<Summary>();
198+
for (int i = 0; i < 100; i++)
199+
{
200+
var summary = new Summary("url", new DateTime(2023, 04, 05, 21, 32, 00, DateTimeKind.Utc), TimeSpan.FromSeconds(1)) { ErrorCode = ErrorType.Other };
201+
summary.RequestCompleted((HttpStatusCode)999);
202+
input.Add(summary);
203+
}
204+
var console = new TestConsoleAsOuput(59);
205+
var sut = new StatisticsPrinter(console);
206+
await sut.SummarizeResultsAsync(new PerformanceMeasurementResults() { Summaries = input, TotalBytesRead = 1, MaxConnections = 1, Behavior = new(input.Count, 1, false) });
207+
208+
Assert.Contains("[color:Red]HTTP status codes:", console.Text);
209+
Assert.Contains("[color:Black]---", console.Text);
210+
}
168211
}

tests/CHttp.Tests/TestConsoleAsOuput.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,19 @@ public TestConsoleAsOuput(int windowWidth)
1818
WindowWidth = windowWidth;
1919
}
2020

21-
public string Text { get => _sb.ToString(); }
21+
public string Text => field ??= _sb.ToString();
2222

2323
public int WindowWidth { get; }
2424

25-
public ConsoleColor ForegroundColor { get; set; }
25+
public ConsoleColor ForegroundColor
26+
{
27+
get;
28+
set
29+
{
30+
field = value;
31+
_sb.Append($"[color:{value}]");
32+
}
33+
}
2634

2735
public (int Left, int Top) GetCursorPosition() => (0, 0);
2836

0 commit comments

Comments
 (0)