Skip to content

Commit 11c875c

Browse files
authored
Merge pull request #1758 from nunit/issue-1757
Fix crashing bug when trying to run an unmanaged test assembly.
2 parents 54c98b6 + fcfcab1 commit 11c875c

File tree

15 files changed

+177
-79
lines changed

15 files changed

+177
-79
lines changed

.config/dotnet-tools.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,22 @@
66
"version": "5.0.0",
77
"commands": [
88
"dotnet-cake"
9-
]
9+
],
10+
"rollForward": false
11+
},
12+
"gitversion.tool": {
13+
"version": "6.4.0",
14+
"commands": [
15+
"dotnet-gitversion"
16+
],
17+
"rollForward": false
18+
},
19+
"gitreleasemanager.tool": {
20+
"version": "0.20.0",
21+
"commands": [
22+
"dotnet-gitreleasemanager"
23+
],
24+
"rollForward": false
1025
}
1126
}
1227
}

GitVersion.yml

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
next-version: 3.20.0
21
mode: ContinuousDelivery
3-
legacy-semver-padding: 5
4-
build-metadata-padding: 5
5-
commits-since-version-source-padding: 5
62
branches:
7-
master:
8-
regex: ^(main|version4)$
9-
tag: alpha
3+
main:
4+
regex: ^version3$
5+
label: alpha
106
release:
11-
tag: pre
7+
label: pre
128
pull-request:
13-
tag: pr
9+
label: pr

KnownExtensions.cake

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System.Reflection;
2+
3+
// Static class holding information about known extensions.
4+
public static class KnownExtensions
5+
{
6+
// Static Variables representing well-known Extensions with the latest tested version
7+
public static ExtensionSpecifier NUnitV2Driver = new ExtensionSpecifier(
8+
"NUnit.Extension.NUnitV2Driver", "nunit-extension-nunit-v2-driver", "3.9.0");
9+
public static ExtensionSpecifier NUnitProjectLoader = new ExtensionSpecifier(
10+
"NUnit.Extension.NUnitProjectLoader", "nunit-extension-nunit-project-loader", "3.8.0");
11+
public static ExtensionSpecifier VSProjectLoader = new ExtensionSpecifier(
12+
"NUnit.Extension.VSProjectLoader", "nunit-extension-vs-project-loader", "3.9.0");
13+
public static ExtensionSpecifier NUnitV2ResultWriter = new ExtensionSpecifier(
14+
"NUnit.Extension.NUnitV2ResultWriter", "nunit-extension-nunit-v2-result-writer", "3.8.0");
15+
public static ExtensionSpecifier TeamCityEventListener = new ExtensionSpecifier(
16+
"NUnit.Extension.TeamCityEventListener", "nunit-extension-teamcity-event-listener", "1.0.9");
17+
public static ExtensionSpecifier Net462PluggableAgent = new ExtensionSpecifier(
18+
"NUnit.Extension.Net462PluggableAgent", "nunit-extension-net462-pluggable-agent", "4.1.0-alpha.3");
19+
public static ExtensionSpecifier Net80PluggableAgent = new ExtensionSpecifier(
20+
"NUnit.Extension.Net80PluggableAgent", "nunit-extension-net80-pluggable-agent", "4.1.0-alpha.4");
21+
public static ExtensionSpecifier Net90PluggableAgent = new ExtensionSpecifier(
22+
"NUnit.Extension.Net90PluggableAgent", "nunit-extension-net90-pluggable-agent", "4.1.0-alpha.3");
23+
24+
private static FieldInfo[] ExtensionFields =>
25+
typeof(KnownExtensions).GetFields(BindingFlags.Static | BindingFlags.Public).ToArray();
26+
27+
private static ExtensionSpecifier[] BundledAgents =>
28+
[
29+
Net462PluggableAgent,
30+
Net80PluggableAgent,
31+
Net90PluggableAgent
32+
];
33+
34+
public static IEnumerable<PackageReference> BundledNuGetAgents =>
35+
BundledAgents.Select(a => a.NuGetPackage);
36+
37+
public static IEnumerable<PackageReference> BundledChocolateyAgents =>
38+
BundledAgents.Select(a => a.ChocoPackage);
39+
40+
public static IEnumerable<ExtensionSpecifier> AllExtensions =>
41+
ExtensionFields.Select(f => (ExtensionSpecifier)f.GetValue("Value")).ToArray();
42+
43+
public static IEnumerable<ExtensionSpecifier> AllAgents =>
44+
AllExtensions.Where(ex => ex.NuGetId.EndsWith("PluggableAgent"));
45+
}
46+
47+
Task("InstallBundledAgents")
48+
.Description("Installs just the agents we bundle with the GUI runner.")
49+
.Does(() =>
50+
{
51+
foreach (var agent in KnownExtensions.BundledNuGetAgents)
52+
agent.Install(BuildSettings.ProjectDirectory + BIN_DIR);
53+
});
54+
55+
Task("InstallAllAgents")
56+
.Description("Installs all known agents.")
57+
.Does(() =>
58+
{
59+
foreach (var agent in KnownExtensions.AllAgents)
60+
agent.NuGetPackage.Install(BuildSettings.ProjectDirectory + BIN_DIR);
61+
});
62+
63+
Task("InstallAllExtensions")
64+
.Description("Installs all known extensions, both agents and others.")
65+
.Does(() =>
66+
{
67+
foreach (var extension in KnownExtensions.AllExtensions)
68+
extension.NuGetPackage.Install(BuildSettings.ProjectDirectory + BIN_DIR);
69+
});
70+

NUnitConsole.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
2121
GitReleaseManager.yaml = GitReleaseManager.yaml
2222
GitVersion.yml = GitVersion.yml
2323
global.json = global.json
24+
KnownExtensions.cake = KnownExtensions.cake
2425
LICENSE.txt = LICENSE.txt
2526
MixedTests.nunit = MixedTests.nunit
2627
NetCoreTests.nunit = NetCoreTests.nunit

NuGet.config

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<packageSources>
4-
<add key="NUnit AppVeyor CI" value="https://ci.appveyor.com/nuget/nunit" />
4+
<add key="nuget" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
55
<add key="NUnit MyGet Feed" value="https://www.myget.org/F/nunit/api/v3/index.json" />
6-
<add key="NUnit Analyzers MyGet Feed" value="https://www.myget.org/F/nunit-analyzers/api/v3/index.json" protocolVersion="3" />
7-
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
8-
<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
96
</packageSources>
107
</configuration>

build.cake

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// Load the recipe
2-
#load nuget:?package=NUnit.Cake.Recipe&version=1.5.0-alpha.4
2+
#load nuget:?package=NUnit.Cake.Recipe&version=1.6.0-alpha.5
33
// Comment out above line and uncomment below for local tests of recipe changes
44
//#load ../NUnit.Cake.Recipe/recipe/*.cake
55

66
#load package-tests.cake
7+
#load KnownExtensions.cake
78

89
// Initialize BuildSettings
910
BuildSettings.Initialize(
@@ -83,14 +84,14 @@ BuildSettings.Packages.AddRange(new PackageDefinition[] {
8384
id: "NUnit.Console",
8485
source: BuildSettings.NuGetDirectory + "runners/nunit.console-runner-with-extensions.nuspec",
8586
checks: new PackageCheck[] {
86-
HasFile("LICENSE.txt"),
87-
// Check proper extension is in a sibling directory since we
88-
// don't yet have the 'HasExtension' predicate.
89-
HasDependency(Extensions.NUnitProjectLoader.NuGetPackage),
90-
HasDependency(Extensions.NUnitV2Driver.NuGetPackage),
91-
HasDependency(Extensions.NUnitV2ResultWriter.NuGetPackage),
92-
HasDependency(Extensions.TeamCityEventListener.NuGetPackage),
93-
HasDependency(Extensions.VSProjectLoader.NuGetPackage) }),
87+
HasFile("LICENSE.txt") }),
88+
//// Check proper extension is in a sibling directory since we
89+
//// don't yet have the 'HasExtension' predicate.
90+
//HasDependency(KnownExtensions.NUnitProjectLoader.NuGetPackage),
91+
//HasDependency(KnownExtensions.NUnitV2Driver.NuGetPackage),
92+
//HasDependency(KnownExtensions.NUnitV2ResultWriter.NuGetPackage),
93+
//HasDependency(KnownExtensions.TeamCityEventListener.NuGetPackage),
94+
//HasDependency(KnownExtensions.VSProjectLoader.NuGetPackage) }),
9495

9596
NUnitConsoleRunnerNetCorePackage = new DotNetToolPackage(
9697
id: "NUnit.ConsoleRunner.NetCore",
@@ -115,7 +116,7 @@ BuildSettings.Packages.AddRange(new PackageDefinition[] {
115116
HasDirectory("tools/agents/net9.0").WithFiles(AGENT_FILES_NETCORE)
116117
},
117118
testRunner: new ConsoleRunnerSelfTester(BuildSettings.ChocolateyTestDirectory
118-
+ $"nunit-console-runner.{BuildSettings.PackageVersion}/tools/nunit3-console.exe"),
119+
+ $"nunit-console-runner.{BuildSettings.ChocolateyPackageVersion}/tools/nunit3-console.exe"),
119120
tests: PackageTests.StandardRunnerTests),
120121

121122
NUnitConsoleZipPackage = new ZipPackage(

package-tests.cake

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,27 +110,28 @@ public static class PackageTests
110110
});
111111

112112
if (!onGitHubActions)
113+
{
113114
StandardAndZipLists.Add(new PackageTest(1, "Net70X86Test")
114115
{
115116
Description = "Run mock-assembly-x86.dll targeting .NET 7.0",
116117
Arguments = "testdata/net7.0/mock-assembly-x86.dll",
117118
ExpectedResult = new MockAssemblyX86ExpectedResult("netcore-7.0")
118119
});
119120

120-
StandardAndZipLists.Add(new PackageTest(1, "Net60X86Test")
121-
{
122-
Description = "Run mock-assembly-x86.dll targeting .NET 6.0",
123-
Arguments = "testdata/net6.0/mock-assembly-x86.dll",
124-
ExpectedResult = new MockAssemblyX86ExpectedResult("netcore-6.0")
125-
});
121+
StandardAndZipLists.Add(new PackageTest(1, "Net60X86Test")
122+
{
123+
Description = "Run mock-assembly-x86.dll targeting .NET 6.0",
124+
Arguments = "testdata/net6.0/mock-assembly-x86.dll",
125+
ExpectedResult = new MockAssemblyX86ExpectedResult("netcore-6.0")
126+
});
126127

127-
if (!onGitHubActions)
128128
StandardAndZipLists.Add(new PackageTest(1, "NetCore31X86Test")
129129
{
130130
Description = "Run mock-assembly-x86.dll targeting .NET Core 3.1",
131131
Arguments = "testdata/netcoreapp3.1/mock-assembly-x86.dll",
132132
ExpectedResult = new MockAssemblyX86ExpectedResult("netcore-3.1")
133133
});
134+
}
134135
}
135136

136137
//////////////////////////////////////////////////////////////////////
@@ -461,6 +462,16 @@ public static class PackageTests
461462
Assemblies = new ExpectedAssemblyResult[] { new ExpectedAssemblyResult("AppContextTest.dll", "netcore-8.0") }
462463
}
463464
});
465+
466+
AllLists.Add(new PackageTest(1, "UnmanagedAssemblyTest")
467+
{
468+
Description = "Attempt to run an unmanaged assembly fails gracefully",
469+
Arguments = "../../src/TestData/native-assembly/NativeTests.dll",
470+
ExpectedResult = new ExpectedResult("Failed:Invalid")
471+
{
472+
Assemblies = new ExpectedAssemblyResult[] { new ExpectedAssemblyResult("NativeTests.dll", "net-4.6.2") }
473+
}
474+
});
464475
}
465476

466477
#region Nested Classes

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
}

0 commit comments

Comments
 (0)