Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions src/CHttp/Performance/Statitics/StatisticsPrinter.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Numerics;
using System.Drawing;
using System.Numerics;
using CHttp.Abstractions;
using CHttp.Data;
using CHttp.Performance.Data;
Expand Down Expand Up @@ -51,11 +52,15 @@ public ValueTask HandleStats(PerformanceMeasurementResults session, Stats stats)
int lineLength = _console.WindowWidth;
var scaleNormalize = (double)lineLength / session.Summaries.Count;
string separator = new string('-', lineLength);

// Histogram
if (session.Summaries.Count >= 100)
{
_console.WriteLine(separator);
PrintHistogram(stats, scaleNormalize);
var oldColor = _console.ForegroundColor;
_console.ForegroundColor = ConsoleColor.Cyan;
PrintHistogram(stats, scaleNormalize);
_console.ForegroundColor = oldColor;
}
_console.WriteLine(separator);
PrintStatusCodes(stats.StatusCodes);
Expand All @@ -65,8 +70,11 @@ public ValueTask HandleStats(PerformanceMeasurementResults session, Stats stats)

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

private void PrintHistogram(Stats stats, double scaleNormalize)
Expand Down
32 changes: 16 additions & 16 deletions tests/CHttp.Tests/Performance/CHttpDiffFunctionalTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,15 @@ public async Task DisplayingMultipleEqualFile()
.InvokeAsync(cancellationToken: TestContext.Current.CancellationToken)
.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken);

Assert.Contains("| Mean: 1.000 s 0 ns |", console.Text);
Assert.Contains("| StdDev: 0.000 ns 0 ns |", console.Text);
Assert.Contains("| Error: 0.000 ns 0 ns |", console.Text);
Assert.Contains("| Median: 1.000 s 0 ns |", console.Text);
Assert.Contains("| Min: 1.000 s 0 ns |", console.Text);
Assert.Contains("| Max: 1.000 s 0 ns |", console.Text);
Assert.Contains("| 95th: 1.000 s 0 ns |", console.Text);
Assert.Contains("| Mean: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| StdDev: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Error: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Median: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Min: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Max: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| 95th: 1.000 s [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Throughput: 100.000 B/s 0 B/s |", console.Text);
Assert.Contains("| Req/Sec: 1 0 |", console.Text);
Assert.Contains("| Req/Sec: 1 [color:Green] 0[color:Black] |", console.Text);
Assert.Contains("1xx: 0 +0, 2xx: 1 +0, 3xx: 0 +0, 4xx: 0 +0, 5xx: 0 +0, Other: 0 +0", console.Text);
}

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

Assert.Contains($"RequestCount: 1, Clients: 1", console.Text);
Assert.Contains("| Mean: 1.000 s +1.000 s |", console.Text);
Assert.Contains("| StdDev: 0.000 ns 0 ns |", console.Text);
Assert.Contains("| Error: 0.000 ns 0 ns |", console.Text);
Assert.Contains("| Median: 1.000 s +1.000 s |", console.Text);
Assert.Contains("| Min: 1.000 s +1.000 s |", console.Text);
Assert.Contains("| Max: 1.000 s +1.000 s |", console.Text);
Assert.Contains("| 95th: 1.000 s +1.000 s |", console.Text);
Assert.Contains("| Mean: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
Assert.Contains("| StdDev: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Error: 0.000 ns [color:Green] 0 ns[color:Black] |", console.Text);
Assert.Contains("| Median: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
Assert.Contains("| Min: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
Assert.Contains("| Max: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
Assert.Contains("| 95th: 1.000 s [color:Red] +1.000 s [color:Black] |", console.Text);
Assert.Contains("| Throughput: 100.000 B/s +100.000 B/s |", console.Text);
Assert.Contains("| Req/Sec: 1 -0.5 |", console.Text);
Assert.Contains("| Req/Sec: 1 [color:Red] -0.5[color:Black] |", console.Text);
Assert.Contains("1xx: 0 +0, 2xx: 1 -1, 3xx: 0 +0, 4xx: 0 +1, 5xx: 0 +0, Other: 0 +0", console.Text);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Globalization;
using System.Net;
using CHttp.Abstractions;
using CHttp.Data;
using CHttp.Performance.Data;
Expand Down Expand Up @@ -159,10 +160,52 @@ public async Task Histogram()
var sut = new StatisticsPrinter(console);
await sut.SummarizeResultsAsync(new PerformanceMeasurementResults() { Summaries = input, TotalBytesRead = 1, MaxConnections = 1, Behavior = new(input.Count, 1, false) });

Assert.Contains(" 1.300 s ##################################################", console.Text);
Assert.Contains("[color:Cyan] 1.300 s ##################################################", console.Text);
Assert.Contains(" 2.200 s ##################################################", console.Text);
Assert.Contains(" 3.100 s ##################################################", console.Text);
Assert.Contains(" 4.000 s ##################################################", console.Text);
Assert.Contains("[color:Black]---", console.Text);
Assert.Contains("[color:Green]HTTP status codes:", console.Text);
Assert.Equal(200, console.Text.Count(x => x == '#'));
}

[Theory]
[InlineData(HttpStatusCode.Continue)] // 100
[InlineData(HttpStatusCode.Ambiguous)] // 300
[InlineData(HttpStatusCode.BadRequest)] // 400
[InlineData(HttpStatusCode.InternalServerError)] // 500
public async Task ErrorCodes_Print_RedStatusLine(HttpStatusCode statusCode)
{
var input = new List<Summary>();
for (int i = 0; i < 100; i++)
{
var summary = new Summary("url", new DateTime(2023, 04, 05, 21, 32, 00, DateTimeKind.Utc), TimeSpan.FromSeconds(1));
summary.RequestCompleted(statusCode);
input.Add(summary);
}
var console = new TestConsoleAsOuput(59);
var sut = new StatisticsPrinter(console);
await sut.SummarizeResultsAsync(new PerformanceMeasurementResults() { Summaries = input, TotalBytesRead = 1, MaxConnections = 1, Behavior = new(input.Count, 1, false) });

Assert.Contains("[color:Red]HTTP status codes:", console.Text);
Assert.Contains("[color:Black]---", console.Text);
}

[Fact]
public async Task OtherError_Print_RedStatusLine()
{
var input = new List<Summary>();
for (int i = 0; i < 100; i++)
{
var summary = new Summary("url", new DateTime(2023, 04, 05, 21, 32, 00, DateTimeKind.Utc), TimeSpan.FromSeconds(1)) { ErrorCode = ErrorType.Other };
summary.RequestCompleted((HttpStatusCode)999);
input.Add(summary);
}
var console = new TestConsoleAsOuput(59);
var sut = new StatisticsPrinter(console);
await sut.SummarizeResultsAsync(new PerformanceMeasurementResults() { Summaries = input, TotalBytesRead = 1, MaxConnections = 1, Behavior = new(input.Count, 1, false) });

Assert.Contains("[color:Red]HTTP status codes:", console.Text);
Assert.Contains("[color:Black]---", console.Text);
}
}
12 changes: 10 additions & 2 deletions tests/CHttp.Tests/TestConsoleAsOuput.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ public TestConsoleAsOuput(int windowWidth)
WindowWidth = windowWidth;
}

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

public int WindowWidth { get; }

public ConsoleColor ForegroundColor { get; set; }
public ConsoleColor ForegroundColor
{
get;
set
{
field = value;
_sb.Append($"[color:{value}]");
}
}

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

Expand Down
Loading