Skip to content

Commit e02e29f

Browse files
committed
Fix crashing error in UnmanagedExecutableTestRunner
1 parent 54c98b6 commit e02e29f

File tree

6 files changed

+53
-47
lines changed

6 files changed

+53
-47
lines changed

src/NUnitEngine/nunit.engine.api/IRuntimeFrameworkService.cs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,9 @@ public interface IRuntimeFrameworkService
2323
/// <summary>
2424
/// Selects a target runtime framework for a TestPackage based on
2525
/// the settings in the package and the assemblies themselves.
26-
/// The package RuntimeFramework setting may be updated as a
27-
/// result and the selected runtime is returned.
28-
///
29-
/// Note that if a package has subpackages, the subpackages may run on a different
30-
/// framework to the top-level package. In future, this method should
31-
/// probably not return a simple string, and instead require runners
32-
/// to inspect the test package structure, to find all desired frameworks.
26+
/// The package RuntimeFramework setting may be updated as a result.
3327
/// </summary>
3428
/// <param name="package">A TestPackage</param>
35-
/// <returns>The selected RuntimeFramework</returns>
36-
string SelectRuntimeFramework(TestPackage package);
29+
void SelectRuntimeFramework(TestPackage package);
3730
}
3831
}

src/NUnitEngine/nunit.engine.core/Runners/NotRunnableTestRunner.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,14 @@ public abstract class NotRunnableTestRunner : ITestEngineRunner
4242

4343
public NotRunnableTestRunner(string assemblyPath, string message)
4444
{
45-
_name = Escape(Path.GetFileName(assemblyPath));
46-
_fullname = Escape(Path.GetFullPath(assemblyPath));
47-
_message = Escape(message);
48-
_type = new List<string> { ".dll", ".exe" }.Contains(Path.GetExtension(assemblyPath)) ? "Assembly" : "Unknown";
45+
if (assemblyPath != null)
46+
{
47+
_name = Escape(Path.GetFileName(assemblyPath));
48+
_fullname = Escape(Path.GetFullPath(assemblyPath));
49+
_type = new List<string> { ".dll", ".exe" }.Contains(Path.GetExtension(assemblyPath)) ? "Assembly" : "Unknown";
50+
}
51+
if (message != null)
52+
_message = Escape(message);
4953
}
5054

5155
public string ID { get; set; }
@@ -134,6 +138,10 @@ public class UnmanagedExecutableTestRunner : NotRunnableTestRunner
134138
{
135139
public UnmanagedExecutableTestRunner(string assemblyPath)
136140
: base (assemblyPath, "Unmanaged libraries or applications are not supported")
137-
{ }
141+
{
142+
_runstate = "NotRunnable";
143+
_result = "Failed";
144+
_label = "Invalid";
145+
}
138146
}
139147
}

src/NUnitEngine/nunit.engine.tests/Services/Fakes/FakeRuntimeService.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ bool IRuntimeFrameworkService.IsAvailable(string framework, bool x86)
99
return true;
1010
}
1111

12-
string IRuntimeFrameworkService.SelectRuntimeFramework(TestPackage package)
12+
void IRuntimeFrameworkService.SelectRuntimeFramework(TestPackage package)
1313
{
14-
return string.Empty;
1514
}
1615
}
1716
}

src/NUnitEngine/nunit.engine.tests/Services/RuntimeFrameworkServiceTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using System.IO;
66
using NUnit.Framework;
77

8-
namespace NUnit.Engine.Services.Tests
8+
namespace NUnit.Engine.Services
99
{
1010
public class RuntimeFrameworkServiceTests
1111
{
@@ -32,17 +32,17 @@ public void ServiceIsStarted()
3232
Assert.That(_runtimeService.Status, Is.EqualTo(ServiceStatus.Started));
3333
}
3434

35-
[TestCase("mock-assembly.dll", false)]
36-
[TestCase("../agents/net462/nunit-agent.exe", false)]
37-
[TestCase("../agents/net462/nunit-agent-x86.exe", true)]
38-
[TestCase("../netstandard2.0/nunit.engine.api.dll", false)]
39-
public void SelectRuntimeFramework(string assemblyName, bool runAsX86)
35+
[TestCase("mock-assembly.dll", "net-4.6.2", false)]
36+
[TestCase("../agents/net462/nunit-agent.exe", "net-4.6.2", false)]
37+
[TestCase("../agents/net462/nunit-agent-x86.exe", "net-4.6.2", true)]
38+
[TestCase("../netstandard2.0/nunit.engine.api.dll", "netcore-3.1", false)]
39+
public void SelectRuntimeFramework(string assemblyName, string expectedRuntime, bool runAsX86)
4040
{
4141
var package = new TestPackage(Path.Combine(TestContext.CurrentContext.TestDirectory, assemblyName));
42+
43+
_runtimeService.SelectRuntimeFramework(package);
4244

43-
var returnValue = _runtimeService.SelectRuntimeFramework(package);
44-
45-
Assert.That(package.GetSetting("TargetRuntimeFramework", ""), Is.EqualTo(returnValue));
45+
Assert.That(package.GetSetting("TargetRuntimeFramework", ""), Is.EqualTo(expectedRuntime));
4646
Assert.That(package.GetSetting("RunAsX86", false), Is.EqualTo(runAsX86));
4747
}
4848

@@ -55,9 +55,9 @@ public void AvailableFrameworks()
5555
Console.WriteLine("Available: {0}", framework.DisplayName);
5656
}
5757

58-
[TestCase("mono", 2, 0, "net-4.0")]
59-
[TestCase("net", 2, 0, "net-4.0")]
60-
[TestCase("net", 3, 5, "net-4.0")]
58+
//[TestCase("mono", 2, 0, "net-4.0")]
59+
//[TestCase("net", 2, 0, "net-4.0")]
60+
//[TestCase("net", 3, 5, "net-4.0")]
6161

6262
public void EngineOptionPreferredOverImageTarget(string framework, int majorVersion, int minorVersion, string requested)
6363
{

src/NUnitEngine/nunit.engine/Services/DefaultTestRunnerFactory.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,14 @@ public ITestEngineRunner MakeTestRunner(TestPackage package)
4242
return InProcessTestRunnerFactory.MakeTestRunner(ServiceContext, package);
4343
}
4444
#else
45-
4645
// Unmanaged code is handled in-process irrespective of the process model
4746
if (package.GetSetting(InternalEnginePackageSettings.ImageTargetFrameworkName, "").StartsWith("Unmanaged,"))
47+
{
48+
if (package.SubPackages.Count > 0)
49+
return new AggregatingTestRunner(ServiceContext, package);
50+
4851
return new UnmanagedExecutableTestRunner(package.FullName);
52+
}
4953

5054
ProcessModel processModel = (ProcessModel)System.Enum.Parse(
5155
typeof(ProcessModel),

src/NUnitEngine/nunit.engine/Services/RuntimeFrameworkService.cs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,15 @@ private static bool RuntimesMatch(RuntimeType requested, RuntimeType available)
9292
/// </summary>
9393
/// <param name="package">A TestPackage</param>
9494
/// <returns>A string representing the selected RuntimeFramework</returns>
95-
public string SelectRuntimeFramework(TestPackage package)
95+
public void SelectRuntimeFramework(TestPackage package)
9696
{
9797
// Evaluate package target framework
9898
ApplyImageData(package);
9999

100-
var targetFramework = SelectRuntimeFrameworkInner(package);
101-
return targetFramework.ToString();
100+
SelectRuntimeFrameworkInner(package);
102101
}
103102

104-
private RuntimeFramework SelectRuntimeFrameworkInner(TestPackage package)
103+
private void SelectRuntimeFrameworkInner(TestPackage package)
105104
{
106105
foreach (var subPackage in package.SubPackages)
107106
{
@@ -126,15 +125,13 @@ private RuntimeFramework SelectRuntimeFrameworkInner(TestPackage package)
126125
throw new NUnitEngineException("Requested framework is not available: " + frameworkSetting);
127126

128127
package.Settings[EnginePackageSettings.TargetRuntimeFramework] = frameworkSetting;
129-
130-
return requestedFramework;
131128
}
132129

133130
log.Debug($"No specific framework requested for {package.Name}");
134131

135132
string imageTargetFrameworkNameSetting = package.GetSetting(InternalEnginePackageSettings.ImageTargetFrameworkName, "");
136-
RuntimeType targetRuntime;
137-
Version targetVersion;
133+
RuntimeType targetRuntime = RuntimeType.Any;
134+
Version targetVersion = new Version(0,0);
138135

139136
if (string.IsNullOrEmpty(imageTargetFrameworkNameSetting))
140137
{
@@ -161,24 +158,29 @@ private RuntimeFramework SelectRuntimeFrameworkInner(TestPackage package)
161158
targetVersion = new Version(3, 1);
162159
break;
163160
case "Unmanaged":
164-
return null;
161+
break;
165162
default:
166163
throw new NUnitEngineException("Unsupported Target Framework: " + imageTargetFrameworkNameSetting);
167164
}
168165
}
169166

170-
if (!IsAvailable(new RuntimeFramework(targetRuntime, targetVersion).Id, runAsX86))
167+
// All cases except Unmanaged set the runtime type
168+
if (targetRuntime == RuntimeType.Any)
169+
package.Settings[InternalEnginePackageSettings.ImageTargetFrameworkName] = "Unmanaged,Version=0.0";
170+
else
171171
{
172-
log.Debug("Preferred version {0} is not installed or this NUnit installation does not support it", targetVersion);
173-
if (targetVersion < currentFramework.FrameworkVersion)
174-
targetVersion = currentFramework.FrameworkVersion;
175-
}
172+
if (!IsAvailable(new RuntimeFramework(targetRuntime, targetVersion).Id, runAsX86))
173+
{
174+
log.Debug("Preferred version {0} is not installed or this NUnit installation does not support it", targetVersion);
175+
if (targetVersion < currentFramework.FrameworkVersion)
176+
targetVersion = currentFramework.FrameworkVersion;
177+
}
176178

177-
RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
178-
package.Settings[EnginePackageSettings.TargetRuntimeFramework] = targetFramework.ToString();
179+
RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
180+
package.Settings[EnginePackageSettings.TargetRuntimeFramework] = targetFramework.ToString();
179181

180-
log.Debug($"Test will use {targetFramework} for {package.Name}");
181-
return targetFramework;
182+
log.Debug($"Test will use {targetFramework} for {package.Name}");
183+
}
182184
}
183185

184186
public override void StartService()

0 commit comments

Comments
 (0)