Thanks to visit codestin.com
Credit goes to github.com

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
Original file line number Diff line number Diff line change
Expand Up @@ -26,60 +26,78 @@ public void AppendTestWorkerProgress(TestProgressState progress, RenderedProgres

int nonReservedWidth = Width - (durationString.Length + 2);

int discovered = progress.DiscoveredTests;
int passed = progress.PassedTests;
int failed = progress.FailedTests;
int skipped = progress.SkippedTests;
int retried = progress.RetriedFailedTests;
int charsTaken = 0;

terminal.Append('[');
charsTaken++;
terminal.SetColor(TerminalColor.DarkGreen);
terminal.Append('✓');
charsTaken++;
string passedText = passed.ToString(CultureInfo.CurrentCulture);
terminal.Append(passedText);
charsTaken += passedText.Length;
terminal.ResetColor();
if (!progress.IsDiscovery)
{
terminal.Append('[');
charsTaken++;
terminal.SetColor(TerminalColor.DarkGreen);
terminal.Append('✓');
charsTaken++;
string passedText = passed.ToString(CultureInfo.CurrentCulture);
terminal.Append(passedText);
charsTaken += passedText.Length;
terminal.ResetColor();

terminal.Append('/');
charsTaken++;
terminal.Append('/');
charsTaken++;

terminal.SetColor(TerminalColor.DarkRed);
terminal.Append('x');
charsTaken++;
string failedText = failed.ToString(CultureInfo.CurrentCulture);
terminal.Append(failedText);
charsTaken += failedText.Length;
terminal.ResetColor();
terminal.SetColor(TerminalColor.DarkRed);
terminal.Append('x');
charsTaken++;
string failedText = failed.ToString(CultureInfo.CurrentCulture);
terminal.Append(failedText);
charsTaken += failedText.Length;
terminal.ResetColor();

terminal.Append('/');
charsTaken++;
terminal.Append('/');
charsTaken++;

terminal.SetColor(TerminalColor.DarkYellow);
terminal.Append('↓');
charsTaken++;
string skippedText = skipped.ToString(CultureInfo.CurrentCulture);
terminal.Append(skippedText);
charsTaken += skippedText.Length;
terminal.ResetColor();
terminal.SetColor(TerminalColor.DarkYellow);
terminal.Append('↓');
charsTaken++;
string skippedText = skipped.ToString(CultureInfo.CurrentCulture);
terminal.Append(skippedText);
charsTaken += skippedText.Length;
terminal.ResetColor();

if (retried > 0)
{
terminal.Append('/');
charsTaken++;
terminal.SetColor(TerminalColor.Gray);
terminal.Append('r');
charsTaken++;
string retriedText = retried.ToString(CultureInfo.CurrentCulture);
terminal.Append(retriedText);
charsTaken += retriedText.Length;
terminal.ResetColor();
}

if (retried > 0)
terminal.Append(']');
charsTaken++;
}
else
{
terminal.Append('/');
string discoveredText = progress.DiscoveredTests.ToString(CultureInfo.CurrentCulture);
terminal.Append('[');
charsTaken++;
terminal.SetColor(TerminalColor.Gray);
terminal.Append('r');
terminal.SetColor(TerminalColor.DarkMagenta);
terminal.Append('+');
charsTaken++;
string retriedText = retried.ToString(CultureInfo.CurrentCulture);
terminal.Append(retriedText);
charsTaken += retriedText.Length;
terminal.Append(discoveredText);
charsTaken += discoveredText.Length;
terminal.ResetColor();
terminal.Append(']');
charsTaken++;
}

terminal.Append(']');
charsTaken++;

terminal.Append(' ');
charsTaken++;
AppendToWidth(terminal, progress.AssemblyName, nonReservedWidth, ref charsTaken);
Expand Down
53 changes: 35 additions & 18 deletions src/Cli/dotnet/Commands/Test/MTP/Terminal/SimpleTerminalBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,32 +67,49 @@ public void RenderProgress(TestProgressState?[] progress)

string durationString = HumanReadableDurationFormatter.Render(p.Stopwatch.Elapsed);

int discovered = p.DiscoveredTests;
int passed = p.PassedTests;
int failed = p.FailedTests;
int skipped = p.SkippedTests;

// Use just ascii here, so we don't put too many restrictions on fonts needing to
// properly show unicode, or logs being saved in particular encoding.
Append('[');
SetColor(TerminalColor.DarkGreen);
Append('+');
Append(passed.ToString(CultureInfo.CurrentCulture));
ResetColor();
if (!p.IsDiscovery)
{
// Use just ascii here, so we don't put too many restrictions on fonts needing to
// properly show unicode, or logs being saved in particular encoding.
Append('[');
SetColor(TerminalColor.DarkGreen);
Append('+');
Append(passed.ToString(CultureInfo.CurrentCulture));
ResetColor();

Append('/');

Append('/');
SetColor(TerminalColor.DarkRed);
Append('x');
Append(failed.ToString(CultureInfo.CurrentCulture));
ResetColor();

SetColor(TerminalColor.DarkRed);
Append('x');
Append(failed.ToString(CultureInfo.CurrentCulture));
ResetColor();
Append('/');

Append('/');
SetColor(TerminalColor.DarkYellow);
Append('?');
Append(skipped.ToString(CultureInfo.CurrentCulture));
ResetColor();

SetColor(TerminalColor.DarkYellow);
Append('?');
Append(skipped.ToString(CultureInfo.CurrentCulture));
ResetColor();
Append(']');
Append(']');
}
else
{
// Use just ascii here, so we don't put too many restrictions on fonts needing to
// properly show unicode, or logs being saved in particular encoding.
Append('[');
SetColor(TerminalColor.DarkMagenta);
Append('+');
Append(discovered.ToString(CultureInfo.CurrentCulture));
ResetColor();

Append(']');
}

Append(' ');
Append(p.AssemblyName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ private TestProgressState GetOrAddAssemblyRun(string assembly, string? targetFra
return _assemblies.GetOrAdd(executionId, _ =>
{
IStopwatch sw = CreateStopwatch();
var assemblyRun = new TestProgressState(Interlocked.Increment(ref _counter), assembly, targetFramework, architecture, sw);
var assemblyRun = new TestProgressState(Interlocked.Increment(ref _counter), assembly, targetFramework, architecture, sw, _isDiscovery);
int slotIndex = _terminalWithProgress.AddWorker(assemblyRun);
assemblyRun.SlotIndex = slotIndex;

Expand Down Expand Up @@ -801,7 +801,7 @@ void AppendOutputWhenPresent(string description, string? output)
private static void AppendAssemblySummary(TestProgressState assemblyRun, ITerminal terminal)
{
terminal.ResetColor();

AppendAssemblyLinkTargetFrameworkAndArchitecture(terminal, assemblyRun.Assembly, assemblyRun.TargetFramework, assemblyRun.Architecture);
terminal.Append(' ');
AppendAssemblyResult(terminal, assemblyRun);
Expand Down Expand Up @@ -914,15 +914,15 @@ public void AppendTestDiscoverySummary(ITerminal terminal, int? exitCode)
var assemblies = _assemblies.Select(asm => asm.Value).OrderBy(a => a.Assembly).Where(a => a is not null).ToList();

int totalTests = _assemblies.Values.Sum(a => a.TotalTests);
bool runFailed = _wasCancelled;
bool runFailed = _wasCancelled || totalTests < 1;

foreach (TestProgressState assembly in assemblies)
{
terminal.Append(string.Format(CultureInfo.CurrentCulture, CliCommandStrings.DiscoveredTestsInAssembly, assembly.DiscoveredTests.Count));
terminal.Append(string.Format(CultureInfo.CurrentCulture, CliCommandStrings.DiscoveredTestsInAssembly, assembly.DiscoveredTestNames.Count));
terminal.Append(" - ");
AppendAssemblyLinkTargetFrameworkAndArchitecture(terminal, assembly.Assembly, assembly.TargetFramework, assembly.Architecture);
terminal.AppendLine();
foreach ((string? displayName, string? uid) in assembly.DiscoveredTests)
foreach ((string? displayName, string? uid) in assembly.DiscoveredTestNames)
{
if (displayName is not null)
{
Expand Down
14 changes: 9 additions & 5 deletions src/Cli/dotnet/Commands/Test/MTP/Terminal/TestProgressState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace Microsoft.DotNet.Cli.Commands.Test.Terminal;

internal sealed class TestProgressState(long id, string assembly, string? targetFramework, string? architecture, IStopwatch stopwatch)
internal sealed class TestProgressState(long id, string assembly, string? targetFramework, string? architecture, IStopwatch stopwatch, bool isDiscovery)
{
private readonly Dictionary<string, TestNodeInfoEntry> _testUidToResults = new();

Expand All @@ -24,13 +24,15 @@ internal sealed class TestProgressState(long id, string assembly, string? target

public IStopwatch Stopwatch { get; } = stopwatch;

public int DiscoveredTests { get; private set; }

public int FailedTests { get; private set; }

public int PassedTests { get; private set; }

public int SkippedTests { get; private set; }

public int TotalTests => PassedTests + SkippedTests + FailedTests;
public int TotalTests => IsDiscovery ? DiscoveredTests : PassedTests + SkippedTests + FailedTests;

public int RetriedFailedTests { get; private set; }

Expand All @@ -42,10 +44,12 @@ internal sealed class TestProgressState(long id, string assembly, string? target

public long Version { get; internal set; }

public List<(string? DisplayName, string? UID)> DiscoveredTests { get; internal set; } = [];
public List<(string? DisplayName, string? UID)> DiscoveredTestNames { get; internal set; } = [];

public bool Success { get; internal set; }

public bool IsDiscovery = isDiscovery;

public int TryCount { get; private set; }

private void ReportGenericTestResult(
Expand Down Expand Up @@ -122,8 +126,8 @@ public void ReportFailedTest(string testNodeUid, string instanceId)

public void DiscoverTest(string? displayName, string? uid)
{
PassedTests++;
DiscoveredTests.Add(new(displayName, uid));
DiscoveredTests++;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated to your changes. But do we guarantee this is not called concurrently from multiple threads? This is not only for discovery, but for reporting test results as well.

DiscoveredTestNames.Add(new(displayName, uid));
}

internal void NotifyHandshake(string instanceId)
Expand Down
30 changes: 16 additions & 14 deletions test/dotnet.Tests/CommandTests/Test/TestProgressStateTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class TestProgressStateTests
public void ReportSkippedTest_MultipleCalls_DifferentInstanceId()
{
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);
string testUid = "test1";
string instanceA = "instanceA";
string instanceB = "instanceB";
Expand Down Expand Up @@ -48,7 +48,7 @@ public void ReportSkippedTest_MultipleCalls_DifferentInstanceId()
public void ReportSkippedTest_RepeatedInstanceAfterRetry_ThrowsInvalidOperationException()
{
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);
string testUid = "test1";
string instanceA = "instanceA";
string instanceB = "instanceB";
Expand All @@ -75,7 +75,7 @@ public void ReportSkippedTest_RepeatedInstanceAfterRetry_ThrowsInvalidOperationE
public void ReportFailedTest_RepeatedCalls_IncrementsFailedTests(int callCount)
{
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);
state.NotifyHandshake("instance1");
for (int i = 0; i < callCount; i++)
{
Expand All @@ -95,7 +95,7 @@ public void ReportFailedTest_RepeatedCalls_IncrementsFailedTests(int callCount)
public void ReportFailedTest_DifferentInstanceId_RetriesFailureAndResetsCount()
{
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);
state.NotifyHandshake("id1");
state.ReportFailedTest("testUid", "id1");
state.ReportFailedTest("testUid", "id1");
Expand All @@ -114,7 +114,7 @@ public void ReportFailedTest_DifferentInstanceId_RetriesFailureAndResetsCount()
public void ReportFailedTest_ReusingOldInstanceId_ThrowsInvalidOperationException()
{
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);
state.NotifyHandshake("id1");
state.ReportFailedTest("testUid", "id1");
state.NotifyHandshake("id2");
Expand All @@ -134,7 +134,7 @@ public void ReportFailedTest_ReusingOldInstanceId_ThrowsInvalidOperationExceptio
public void ReportTest_WithNewInstanceId_ClearsOldReports()
{
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);
state.NotifyHandshake("id1");
state.ReportFailedTest("testUid", "id1");
state.ReportFailedTest("testUid", "id1");
Expand All @@ -154,6 +154,7 @@ public void ReportTest_WithNewInstanceId_ClearsOldReports()
state.SkippedTests.Should().Be(1);
state.RetriedFailedTests.Should().Be(3);
}

/// <summary>
/// Tests that DiscoverTest increments PassedTests and adds the displayName and uid to DiscoveredTests.
/// </summary>
Expand All @@ -173,22 +174,23 @@ public void DiscoverTest_DisplayNameAndUid_AddsEntryAndIncrementsPassedTests(str
assembly: "assembly.dll",
targetFramework: null,
architecture: null,
stopwatch: stopwatchMock.Object);
stopwatch: stopwatchMock.Object,
isDiscovery: true);

state.DiscoverTest(displayName, uid);

state.PassedTests.Should().Be(1);
state.DiscoveredTests.Count.Should().Be(1);
state.DiscoveredTests[0].DisplayName.Should().Be(displayName);
state.DiscoveredTests[0].UID.Should().Be(uid);
state.DiscoveredTests.Should().Be(1);
state.DiscoveredTestNames.Count.Should().Be(1);
state.DiscoveredTestNames[0].DisplayName.Should().Be(displayName);
state.DiscoveredTestNames[0].UID.Should().Be(uid);
}

[Fact]
public void FailedTestRetryShouldShouldShowTheSameTotalCountsInEachRetry()
{
// Tests are retried, total test count stays 3 to give use comparable counts, no matter how many times we retry.
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);

// First run
state.NotifyHandshake("run1");
Expand Down Expand Up @@ -227,7 +229,7 @@ public void FailedTestRetryShouldNotFailTheRunWhenSecondRunProducesLessDynamicTe
{
// This is special test for dynamic tests where we don't know how many tests will be produced in the second run.
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);

// First run
state.NotifyHandshake("run1");
Expand Down Expand Up @@ -259,7 +261,7 @@ public void FailedTestRetryShouldAccountPassedTestsInRetry()
{
// This is special test for dynamic tests where we cannot avoid re-running even non-failing tests from dynamic tests.
var stopwatchMock = new Mock<IStopwatch>();
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object);
var state = new TestProgressState(1, "assembly.dll", null, null, stopwatchMock.Object, isDiscovery: false);

// First run
state.NotifyHandshake("run1");
Expand Down
Loading