From 412c9b78fe26bd48542b0a0ea181bb07aff53d2b Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Sat, 25 Mar 2017 12:25:49 -0500 Subject: [PATCH] Use the unique ID of test cases instead of display name for lookups Fixes a crash when attempting to run the StyleCop Analyzers test suite. --- xunit.runner.data/TestCaseData.cs | 8 ++++-- xunit.runner.data/TestResultData.cs | 8 ++++-- xunit.runner.worker/DiscoverUtil.cs | 1 + xunit.runner.worker/RunUtil.cs | 26 +++++++++---------- xunit.runner.wpf/ViewModel/MainViewModel.cs | 5 ++-- .../ViewModel/TestCaseViewModel.cs | 4 ++- 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/xunit.runner.data/TestCaseData.cs b/xunit.runner.data/TestCaseData.cs index 058ec0b..5b3afc3 100644 --- a/xunit.runner.data/TestCaseData.cs +++ b/xunit.runner.data/TestCaseData.cs @@ -6,13 +6,15 @@ namespace Xunit.Runner.Data public sealed class TestCaseData { public string DisplayName { get; set; } + public string UniqueID { get; set; } public string SkipReason { get; set; } public string AssemblyPath { get; set; } public Dictionary> TraitMap { get; set; } - public TestCaseData(string displayName, string skipReason, string assemblyPath, Dictionary> traitMap) + public TestCaseData(string displayName, string uniqueID, string skipReason, string assemblyPath, Dictionary> traitMap) { DisplayName = displayName; + UniqueID = uniqueID; SkipReason = skipReason; AssemblyPath = assemblyPath; TraitMap = traitMap; @@ -21,6 +23,7 @@ namespace Xunit.Runner.Data public static TestCaseData ReadFrom(BinaryReader reader) { var displayName = reader.ReadString(); + var uniqueID = reader.ReadString(); var skipReason = reader.ReadString(); var assemblyPath = reader.ReadString(); var count = reader.ReadInt32(); @@ -40,12 +43,13 @@ namespace Xunit.Runner.Data traitMap.Add(key, values); } - return new TestCaseData(displayName, skipReason, assemblyPath, traitMap); + return new TestCaseData(displayName, uniqueID, skipReason, assemblyPath, traitMap); } public void WriteTo(BinaryWriter writer) { writer.Write(DisplayName); + writer.Write(UniqueID); writer.Write(SkipReason ?? string.Empty); writer.Write(AssemblyPath); writer.Write(TraitMap.Count); diff --git a/xunit.runner.data/TestResultData.cs b/xunit.runner.data/TestResultData.cs index c9668f2..7e06f27 100644 --- a/xunit.runner.data/TestResultData.cs +++ b/xunit.runner.data/TestResultData.cs @@ -18,12 +18,14 @@ namespace Xunit.Runner.Data public sealed class TestResultData { public string TestCaseDisplayName { get; set; } + public string TestCaseUniqueID { get; set; } public TestState TestState { get; set; } public string Output { get; set; } - public TestResultData(string displayName, TestState state, string output = "") + public TestResultData(string displayName, string uniqueID, TestState state, string output = "") { TestCaseDisplayName = displayName; + TestCaseUniqueID = uniqueID; TestState = state; Output = output; } @@ -31,14 +33,16 @@ namespace Xunit.Runner.Data public static TestResultData ReadFrom(BinaryReader reader) { var displayName = reader.ReadString(); + var uniqueID = reader.ReadString(); var state = (TestState)reader.ReadInt32(); var output = reader.ReadString(); - return new TestResultData(displayName, state, output); + return new TestResultData(displayName, uniqueID, state, output); } public void WriteTo(BinaryWriter writer) { writer.Write(TestCaseDisplayName); + writer.Write(TestCaseUniqueID); writer.Write((int)TestState); writer.Write(Output); } diff --git a/xunit.runner.worker/DiscoverUtil.cs b/xunit.runner.worker/DiscoverUtil.cs index cda4357..a1c8818 100644 --- a/xunit.runner.worker/DiscoverUtil.cs +++ b/xunit.runner.worker/DiscoverUtil.cs @@ -23,6 +23,7 @@ namespace Xunit.Runner.Worker var testCase = testCaseDiscovered.TestCase; var testCaseData = new TestCaseData( testCase.DisplayName, + testCase.UniqueID, testCase.SkipReason, testCaseDiscovered.TestAssembly.Assembly.AssemblyPath, testCase.Traits); diff --git a/xunit.runner.worker/RunUtil.cs b/xunit.runner.worker/RunUtil.cs index 8071e0b..797a188 100644 --- a/xunit.runner.worker/RunUtil.cs +++ b/xunit.runner.worker/RunUtil.cs @@ -21,10 +21,10 @@ namespace Xunit.Runner.Worker protected override bool ShouldContinue => _writer.IsConnected; - private void Process(string displayName, TestState state, string output = "") + private void Process(string displayName, string uniqueID, TestState state, string output = "") { Console.WriteLine($"{state} - {displayName}"); - var result = new TestResultData(displayName, state, output); + var result = new TestResultData(displayName, uniqueID, state, output); _writer.Write(TestDataKind.Value); _writer.Write(result); @@ -46,35 +46,35 @@ namespace Xunit.Runner.Worker builder.AppendLine(); - Process(testFailed.TestCase.DisplayName, TestState.Failed, builder.ToString()); + Process(testFailed.TestCase.DisplayName, testFailed.TestCase.UniqueID, TestState.Failed, builder.ToString()); } protected override void OnTestPassed(ITestPassed testPassed) { - Process(testPassed.TestCase.DisplayName, TestState.Passed); + Process(testPassed.TestCase.DisplayName, testPassed.TestCase.UniqueID, TestState.Passed); } protected override void OnTestSkipped(ITestSkipped testSkipped) { - Process(testSkipped.TestCase.DisplayName, TestState.Skipped); + Process(testSkipped.TestCase.DisplayName, testSkipped.TestCase.UniqueID, TestState.Skipped); } } private sealed class TestDiscoverySink : BaseTestDiscoverySink { - private readonly HashSet _testCaseNameSet; + private readonly HashSet _testCaseUniqueIDSet; private readonly List _testCaseList; - internal TestDiscoverySink(HashSet testCaseDisplayNameSet, List testCaseList) + internal TestDiscoverySink(HashSet testCaseUniqueIDSet, List testCaseList) { - _testCaseNameSet = testCaseDisplayNameSet; + _testCaseUniqueIDSet = testCaseUniqueIDSet; _testCaseList = testCaseList; } protected override void OnTestDiscovered(ITestCaseDiscoveryMessage testCaseDiscovered) { var testCase = testCaseDiscovered.TestCase; - if (_testCaseNameSet.Contains(testCase.DisplayName)) + if (_testCaseUniqueIDSet.Contains(testCase.UniqueID)) { _testCaseList.Add(testCaseDiscovered.TestCase); } @@ -82,9 +82,9 @@ namespace Xunit.Runner.Worker } /// - /// Read out the set of test case display names to run. + /// Read out the set of test case unique IDs to run. /// - private static List ReadTestCaseDisplayNames(Stream stream) + private static List ReadTestCaseUniqueIDs(Stream stream) { using (var reader = new ClientReader(stream)) { @@ -133,14 +133,14 @@ namespace Xunit.Runner.Worker internal static void RunSpecific(string assemblyFileName, Stream stream) { - var testCaseNameSet = new HashSet(ReadTestCaseDisplayNames(stream), StringComparer.Ordinal); + var testCaseUniqueIDSet = new HashSet(ReadTestCaseUniqueIDs(stream), StringComparer.Ordinal); Go(assemblyFileName, stream, AppDomainSupport.IfAvailable, (xunit, configuration, writer) => { using (var sink = new TestRunSink(writer)) { - var testCaseList = GetTestCaseList(xunit, configuration, testCaseNameSet); + var testCaseList = GetTestCaseList(xunit, configuration, testCaseUniqueIDSet); xunit.RunTests(testCaseList, sink, executionOptions: TestFrameworkOptions.ForExecution(configuration)); diff --git a/xunit.runner.wpf/ViewModel/MainViewModel.cs b/xunit.runner.wpf/ViewModel/MainViewModel.cs index b9a4fb7..c781af3 100644 --- a/xunit.runner.wpf/ViewModel/MainViewModel.cs +++ b/xunit.runner.wpf/ViewModel/MainViewModel.cs @@ -594,7 +594,7 @@ namespace Xunit.Runner.Wpf.ViewModel { if (testCase.AssemblyFileName == assemblyFileName) { - builder.Add(testCase.DisplayName); + builder.Add(testCase.UniqueID); } } @@ -660,6 +660,7 @@ namespace Xunit.Runner.Wpf.ViewModel var testCaseViewModel = new TestCaseViewModel( testCase.DisplayName, + testCase.UniqueID, testCase.SkipReason, testCase.AssemblyPath, traitWorkerList); @@ -679,7 +680,7 @@ namespace Xunit.Runner.Wpf.ViewModel foreach (var result in testResultData) { - var testCase = this.runningTests.Single(x => x.DisplayName == result.TestCaseDisplayName); + var testCase = this.runningTests.Single(x => x.UniqueID == result.TestCaseUniqueID); testCase.State = result.TestState; TestsCompleted++; diff --git a/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs b/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs index 9b9030b..afa0fb1 100644 --- a/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs +++ b/xunit.runner.wpf/ViewModel/TestCaseViewModel.cs @@ -10,6 +10,7 @@ namespace Xunit.Runner.Wpf.ViewModel private TestState _state = TestState.NotRun; public string DisplayName { get; } + public string UniqueID { get; } public string SkipReason { get; } public string AssemblyFileName { get; } public ImmutableArray Traits { get; } @@ -23,9 +24,10 @@ namespace Xunit.Runner.Wpf.ViewModel set { Set(ref _state, value); } } - public TestCaseViewModel(string displayName, string skipReason, string assemblyFileName, IEnumerable traits) + public TestCaseViewModel(string displayName, string uniqueID, string skipReason, string assemblyFileName, IEnumerable traits) { this.DisplayName = displayName; + this.UniqueID = uniqueID; this.SkipReason = skipReason; this.AssemblyFileName = assemblyFileName; this.Traits = traits.ToImmutableArray();