Skip to content

Commit

Permalink
Merge pull request #1124 from nunit/issue-1123
Browse files Browse the repository at this point in the history
Use .NET 6.0 for NETCORE runner
  • Loading branch information
CharliePoole authored Feb 6, 2022
2 parents 7fcba2d + 8d978fb commit b348f4e
Show file tree
Hide file tree
Showing 13 changed files with 69 additions and 102 deletions.
82 changes: 27 additions & 55 deletions build.cake
Original file line number Diff line number Diff line change
Expand Up @@ -101,46 +101,32 @@ public void BuildSolution()
{
MSBuild(SOLUTION_FILE, CreateMSBuildSettings("Build").WithRestore());

// Publishing to ensure that all references are present. Some of these
// may not be needed and are marked with a TODO comment.
// Publishing in place where needed to ensure that all references are present.

DisplayBanner("Publishing ENGINE Project");
foreach (var framework in new[] { "netstandard2.0", "netcoreapp3.1" })
MSBuild(ENGINE_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", framework)
.WithProperty("PublishDir", BIN_DIR + framework));
// TODO: May not be needed
DisplayBanner("Publishing ENGINE API Project for NETSTANDARD_2.0");
MSBuild(ENGINE_API_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", "netstandard2.0")
.WithProperty("PublishDir", BIN_DIR + "netstandard2.0"));

DisplayBanner("Publishing ENGINE Project for NETSTANDARD2.0");
MSBuild(ENGINE_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", "netstandard2.0")
.WithProperty("PublishDir", BIN_DIR + "netstandard2.0"));

DisplayBanner("Publishing ENGINE TESTS Project for NETCOREAPP2.1");
MSBuild(ENGINE_TESTS_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", "netcoreapp2.1")
.WithProperty("PublishDir", BIN_DIR + "netcoreapp2.1"));

// TODO: May not be needed
DisplayBanner("Publishing AGENT Project");
foreach (var framework in new[] { "netcoreapp3.1", "net5.0" })
{
DisplayBanner($"Publishing AGENT Project for {framework.ToUpper()}");
MSBuild(AGENT_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", framework)
.WithProperty("PublishDir", BIN_DIR + "agents/" + framework));

// TODO: May not be needed
DisplayBanner("Publishing ENGINE API Project");
foreach (var framework in new[] { "netstandard2.0" })
MSBuild(ENGINE_API_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", framework)
.WithProperty("PublishDir", BIN_DIR + framework));

DisplayBanner("Publishing ENGINE TESTS Project");
foreach (var framework in new[] { "netcoreapp2.1", "netcoreapp3.1" })
MSBuild(ENGINE_TESTS_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", framework)
.WithProperty("PublishDir", BIN_DIR + framework));

// TODO: May not be needed
DisplayBanner("Publishing NETCORE CONSOLE RUNNER Project");
MSBuild(CONSOLE_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", "netcoreapp3.1")
.WithProperty("PublishDir", BIN_DIR + "netcoreapp3.1"));

// TODO: May not be needed
DisplayBanner("Publishing NETCORE CONSOLE TESTS Project");
MSBuild(CONSOLE_TESTS_PROJECT, CreateMSBuildSettings("Publish")
.WithProperty("TargetFramework", "netcoreapp3.1")
.WithProperty("PublishDir", BIN_DIR + "netcoreapp3.1"));
}
}

private void BuildEachProjectSeparately()
Expand All @@ -152,9 +138,9 @@ private void BuildEachProjectSeparately()
BuildProject(AGENT_PROJECT);
BuildProject(AGENT_X86_PROJECT);

BuildProject(ENGINE_TESTS_PROJECT, "net35", "netcoreapp2.1", "netcoreapp3.1");
BuildProject(ENGINE_TESTS_PROJECT, "net35", "netcoreapp2.1");
BuildProject(ENGINE_CORE_TESTS_PROJECT, "net35", "netcoreapp2.1", "netcoreapp3.1", "net5.0", "net6.0");
BuildProject(CONSOLE_TESTS_PROJECT, "net35", "netcoreapp3.1");
BuildProject(CONSOLE_TESTS_PROJECT, "net35", "net6.0");

BuildProject(MOCK_ASSEMBLY_X86_PROJECT, "net35", "net40", "netcoreapp2.1", "netcoreapp3.1");
BuildProject(NOTEST_PROJECT, "net35", "netcoreapp2.1", "netcoreapp3.1");
Expand Down Expand Up @@ -319,19 +305,6 @@ Task("TestNetStandard20Engine")
RunDotnetNUnitLiteTests(NETCORE_ENGINE_TESTS, "netcoreapp2.1");
});

//////////////////////////////////////////////////////////////////////
// TEST NETCORE 3.1 ENGINE
//////////////////////////////////////////////////////////////////////

Task("TestNetCore31Engine")
.Description("Tests the .NET Core 3.1 Engine")
.IsDependentOn("Build")
.OnError(exception => { UnreportedErrors.Add(exception.Message); })
.Does(() =>
{
RunDotnetNUnitLiteTests(NETCORE_ENGINE_TESTS, "netcoreapp3.1");
});

//////////////////////////////////////////////////////////////////////
// TEST .NET 2.0 CONSOLE
//////////////////////////////////////////////////////////////////////
Expand All @@ -346,16 +319,16 @@ Task("TestNet20Console")
});

//////////////////////////////////////////////////////////////////////
// TEST .NET CORE 3.1 CONSOLE
// TEST .NET 6.0 CONSOLE
//////////////////////////////////////////////////////////////////////

Task("TestNetCore31Console")
.Description("Tests the .NET Core 3.1 console runner")
Task("TestNet60Console")
.Description("Tests the .NET 6.0 console runner")
.IsDependentOn("Build")
.OnError(exception => { UnreportedErrors.Add(exception.Message); })
.Does(() =>
{
RunNetCoreConsole(CONSOLE_TESTS, "netcoreapp3.1");
RunNetCoreConsole(CONSOLE_TESTS, "net6.0");
});

//////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -753,7 +726,7 @@ Task("CreateProductionRelease")
Task("TestConsole")
.Description("Builds and tests the console runner")
.IsDependentOn("TestNet20Console")
.IsDependentOn("TestNetCore31Console");
.IsDependentOn("TestNet60Console");

Task("TestEngineCore")
.Description("Builds and tests the engine core assembly")
Expand All @@ -766,8 +739,7 @@ Task("TestEngineCore")
Task("TestEngine")
.Description("Builds and tests the engine assembly")
.IsDependentOn("TestNet20Engine")
.IsDependentOn("TestNetStandard20Engine")
.IsDependentOn("TestNetCore31Engine");
.IsDependentOn("TestNetStandard20Engine");

Task("Test")
.Description("Builds and tests the engine and console runner")
Expand Down
2 changes: 1 addition & 1 deletion cake/constants.cake
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ var MOCK_ASSEMBLY_X86_PROJECT = SOURCE_DIR + "NUnitEngine/mock-assembly-x86/mock
var NOTEST_PROJECT = SOURCE_DIR + "NUnitEngine/notest-assembly/notest-assembly.csproj";
// Console Runner
var NET20_CONSOLE = BIN_DIR + "net20/nunit3-console.exe";
var NETCORE31_CONSOLE = BIN_DIR + "netcoreapp3.1/nunit3-console.dll";
var NET60_CONSOLE = BIN_DIR + "net6.0/nunit3-console.dll";
// Unit Tests
var NETFX_ENGINE_CORE_TESTS = "nunit.engine.core.tests.exe";
var NETCORE_ENGINE_CORE_TESTS = "nunit.engine.core.tests.dll";
Expand Down
4 changes: 4 additions & 0 deletions cake/package-checks.cake
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ string[] ENGINE_FILES = {
"nunit.engine.dll", "nunit.engine.core.dll", "nunit.engine.api.dll", "testcentric.engine.metadata.dll" };
string[] ENGINE_PDB_FILES = {
"nunit.engine.pdb", "nunit.engine.core.pdb", "nunit.engine.api.pdb"};
string[] ENGINE_CORE_FILES = {
"nunit.engine.core.dll", "nunit.engine.api.dll", "testcentric.engine.metadata.dll" };
string[] ENGINE_CORE_PDB_FILES = {
"nunit.engine.core.pdb", "nunit.engine.api.pdb"};
string[] AGENT_FILES = {
"nunit-agent.exe", "nunit-agent.exe.config",
"nunit-agent-x86.exe", "nunit-agent-x86.exe.config",
Expand Down
22 changes: 13 additions & 9 deletions cake/package-definitions.cake
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

PackageDefinition NUnitConsoleNuGetPackage;
PackageDefinition NUnitConsoleRunnerNuGetPackage;
PackageDefinition NUnitConsoleRunnerNetCorePackage;
PackageDefinition NUnitConsoleRunnerNet60Package;
PackageDefinition NUnitEnginePackage;
PackageDefinition NUnitEngineApiPackage;
PackageDefinition NUnitConsoleRunnerChocolateyPackage;
Expand All @@ -28,6 +28,7 @@ public void InitializePackageDefinitions(ICakeContext context)
NetCore31Test,
Net50Test,
Net60Test,
NetCore21PlusNetCore31Test,
NetCore21PlusNetCore31PlusNet50PlusNet60Test,
Net40PlusNet60Test
};
Expand All @@ -43,7 +44,10 @@ public void InitializePackageDefinitions(ICakeContext context)
{
NetCore21Test,
NetCore31Test,
NetCore21PlusNetCore31Test
Net50Test,
Net60Test,
NetCore21PlusNetCore31Test,
NetCore21PlusNetCore31PlusNet50PlusNet60Test
};

AllPackages.AddRange(new PackageDefinition[] {
Expand Down Expand Up @@ -80,16 +84,19 @@ public void InitializePackageDefinitions(ICakeContext context)
executable: "tools/nunit3-console.exe",
tests: StandardRunnerTests),

NUnitConsoleRunnerNetCorePackage = new NuGetPackage(
NUnitConsoleRunnerNet60Package = new NuGetPackage(
context: context,
id: "NUnit.ConsoleRunner.NetCore",
version: ProductVersion,
source: NUGET_DIR + "runners/nunit.console-runner.netcore.nuspec",
checks: new PackageCheck[] {
HasFiles("LICENSE.txt", "NOTICES.txt"),
HasDirectory("tools/netcoreapp3.1/any").WithFiles(CONSOLE_FILES_NETCORE).AndFiles(ENGINE_FILES).AndFile("nunit.console.nuget.addins")
HasDirectory("tools/net6.0/any").WithFiles(CONSOLE_FILES_NETCORE).AndFiles(ENGINE_FILES).AndFile("nunit.console.nuget.addins")
},
symbols: new PackageCheck[] {
HasDirectory("tools/net6.0/any").WithFile("nunit3-console.pdb").AndFiles(ENGINE_PDB_FILES)
},
executable: "tools/netcoreapp3.1/any/nunit3-console.exe",
executable: "tools/net6.0/any/nunit3-console.exe",
tests: NetCoreRunnerTests),

NUnitConsoleRunnerChocolateyPackage = new ChocolateyPackage(
Expand Down Expand Up @@ -132,7 +139,7 @@ public void InitializePackageDefinitions(ICakeContext context)
HasDirectory("bin/net35").WithFiles(CONSOLE_FILES).AndFiles(ENGINE_FILES).AndFile("nunit3-console.pdb").AndFiles(ENGINE_PDB_FILES),
HasDirectory("bin/netstandard2.0").WithFiles(ENGINE_FILES).AndFiles(ENGINE_PDB_FILES),
HasDirectory("bin/netcoreapp2.1").WithFiles(ENGINE_FILES).AndFiles(ENGINE_PDB_FILES),
HasDirectory("bin/netcoreapp3.1").WithFiles(ENGINE_FILES).AndFiles(ENGINE_PDB_FILES),
HasDirectory("bin/netcoreapp3.1").WithFiles(ENGINE_CORE_FILES).AndFiles(ENGINE_CORE_PDB_FILES),
//HasDirectory("bin/net5.0").WithFiles(ENGINE_FILES).AndFiles(ENGINE_PDB_FILES),
HasDirectory("bin/agents/net20").WithFiles(AGENT_FILES).AndFiles(AGENT_PDB_FILES),
HasDirectory("bin/agents/net40").WithFiles(AGENT_FILES).AndFiles(AGENT_PDB_FILES),
Expand All @@ -153,17 +160,14 @@ public void InitializePackageDefinitions(ICakeContext context)
HasFiles("LICENSE.txt", "NOTICES.txt"),
HasDirectory("lib/net20").WithFiles(ENGINE_FILES),
HasDirectory("lib/netstandard2.0").WithFiles(ENGINE_FILES),
HasDirectory("lib/netcoreapp3.1").WithFiles(ENGINE_FILES),
HasDirectory("contentFiles/any/lib/net20").WithFile("nunit.engine.nuget.addins"),
HasDirectory("contentFiles/any/lib/netstandard2.0").WithFile("nunit.engine.nuget.addins"),
HasDirectory("contentFiles/any/lib/netcoreapp3.1").WithFile("nunit.engine.nuget.addins"),
HasDirectory("contentFiles/any/agents/net20").WithFiles(AGENT_FILES).AndFile("nunit.agent.addins"),
HasDirectory("contentFiles/any/agents/net40").WithFiles(AGENT_FILES).AndFile("nunit.agent.addins")
},
symbols: new PackageCheck[] {
HasDirectory("lib/net20").WithFiles(ENGINE_PDB_FILES),
HasDirectory("lib/netstandard2.0").WithFiles(ENGINE_PDB_FILES),
HasDirectory("lib/netcoreapp3.1").WithFiles(ENGINE_PDB_FILES),
HasDirectory("contentFiles/any/agents/net20").WithFiles(AGENT_PDB_FILES),
HasDirectory("contentFiles/any/agents/net40").WithFiles(AGENT_PDB_FILES)
}),
Expand Down
2 changes: 1 addition & 1 deletion cake/utilities.cake
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ void RunNetCoreConsole(string testAssembly, string targetRuntime)
"dotnet",
new ProcessSettings
{
Arguments = $"\"{NETCORE31_CONSOLE}\" \"{assemblyPath}\" --result:{resultPath}",
Arguments = $"\"{NET60_CONSOLE}\" \"{assemblyPath}\" --result:{resultPath}",
WorkingDirectory = workingDir
});

Expand Down
9 changes: 0 additions & 9 deletions nuget/engine/nunit.engine.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,6 @@
<file src="netstandard2.0/testcentric.engine.metadata.dll" target="lib/netstandard2.0" />
<file src="../../nuget/engine/nunit.engine.nuget.addins" target="contentFiles/any/lib/netstandard2.0"/>

<file src="netcoreapp3.1/nunit.engine.dll" target="lib/netcoreapp3.1" />
<file src="netcoreapp3.1/nunit.engine.pdb" target="lib/netcoreapp3.1" />
<file src="netcoreapp3.1/nunit.engine.core.dll" target="lib/netcoreapp3.1" />
<file src="netcoreapp3.1/nunit.engine.core.pdb" target="lib/netcoreapp3.1" />
<file src="netcoreapp3.1/testcentric.engine.metadata.dll" target="lib/netcoreapp3.1" />
<file src="netstandard2.0/nunit.engine.api.dll" target="lib/netcoreapp3.1" />
<file src="netstandard2.0/nunit.engine.api.pdb" target="lib/netcoreapp3.1" />
<file src="../../nuget/engine/nunit.engine.nuget.addins" target="contentFiles/any/lib/netcoreapp3.1"/>

<file src="../../nuget/engine/build/**/*" target="build" />
<file src="../../nunit_256.png" target="images" />
</files>
Expand Down
33 changes: 16 additions & 17 deletions nuget/runners/nunit.console-runner.netcore.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,22 @@
<files>
<file src="../../LICENSE.txt" />
<file src="../../NOTICES.txt" />
<file src="netcoreapp3.1/nunit3-console.exe" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit3-console.pdb" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit3-console.dll" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit3-console.dll.config" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit3-console.deps.json" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit3-console.runtimeconfig.json" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.core.dll" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.core.pdb" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.dll" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.pdb" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.deps.json" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.api.dll" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.api.pdb" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/nunit.engine.api.xml" target="tools/netcoreapp3.1/any" />
<file src="netcoreapp3.1/testcentric.engine.metadata.dll" target="tools/netcoreapp3.1/any" />
<file src="../../nuget/runners/nunit.console.nuget.addins" target="tools/netcoreapp3.1/any"/>
<file src="../../nuget/runners/DotnetToolSettings.xml" target="tools/netcoreapp3.1/any"/>
<file src="net6.0/nunit3-console.exe" target="tools/net6.0/any" />
<file src="net6.0/nunit3-console.pdb" target="tools/net6.0/any" />
<file src="net6.0/nunit3-console.dll" target="tools/net6.0/any" />
<file src="net6.0/nunit3-console.dll.config" target="tools/net6.0/any" />
<file src="net6.0/nunit3-console.deps.json" target="tools/net6.0/any" />
<file src="net6.0/nunit3-console.runtimeconfig.json" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.core.dll" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.core.pdb" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.dll" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.pdb" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.api.dll" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.api.pdb" target="tools/net6.0/any" />
<file src="net6.0/nunit.engine.api.xml" target="tools/net6.0/any" />
<file src="net6.0/testcentric.engine.metadata.dll" target="tools/net6.0/any" />
<file src="../../nuget/runners/nunit.console.nuget.addins" target="tools/net6.0/any"/>
<file src="../../nuget/runners/DotnetToolSettings.xml" target="tools/net6.0/any"/>
<file src="../../nunit_256.png" target="images"/>
</files>
</package>
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<RootNamespace>NUnit.ConsoleRunner.Tests</RootNamespace>
<TargetFrameworks>net35;netcoreapp3.1</TargetFrameworks>
<TargetFrameworks>net35;net6.0</TargetFrameworks>
<NoWarn>1685</NoWarn>
<DebugType>Full</DebugType>
</PropertyGroup>
Expand Down
3 changes: 0 additions & 3 deletions src/NUnitConsole/nunit3-console/OptionsUtils/Options.cs
Original file line number Diff line number Diff line change
Expand Up @@ -785,9 +785,6 @@ public string OptionName
}

#if !PCL
#pragma warning disable 618 // SecurityPermissionAttribute is obsolete
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
#pragma warning restore 618
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
Expand Down
2 changes: 1 addition & 1 deletion src/NUnitConsole/nunit3-console/nunit3-console.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<OutputType>Exe</OutputType>
<RootNamespace>NUnit.ConsoleRunner</RootNamespace>
<AssemblyName>nunit3-console</AssemblyName>
<TargetFrameworks>net20;netcoreapp3.1</TargetFrameworks>
<TargetFrameworks>net20;net6.0</TargetFrameworks>
<RollForward>Major</RollForward>
</PropertyGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public void ServiceIsStarted()
[TestCase("mock-assembly.pdb", true, typeof(InvalidAssemblyFrameworkDriver))]
[TestCase("junk.dll", false, typeof(InvalidAssemblyFrameworkDriver))]
[TestCase("junk.dll", true, typeof(InvalidAssemblyFrameworkDriver))]
[TestCase("nunit.engine.dll", false, typeof(InvalidAssemblyFrameworkDriver))]
[TestCase("nunit.engine.core.dll", false, typeof(InvalidAssemblyFrameworkDriver))]
[TestCase("nunit.engine.core.dll", true, typeof(SkippedAssemblyFrameworkDriver))]
#if !NET5_0_OR_GREATER // Not yet working
[TestCase("nunit.engine.dll", true, typeof(SkippedAssemblyFrameworkDriver))]
[TestCase("notest-assembly.dll", true, typeof(SkippedAssemblyFrameworkDriver))]
#endif
public void CorrectDriverIsUsed(string fileName, bool skipNonTestAssemblies, Type expectedType)
Expand Down
4 changes: 2 additions & 2 deletions src/NUnitEngine/nunit.engine.tests/nunit.engine.tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<RootNamespace>NUnit.Engine.Tests</RootNamespace>
<TargetFrameworks>net35;netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
<TargetFrameworks>net35;netcoreapp2.1</TargetFrameworks>
<OutputType>Exe</OutputType>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\..\nunit.snk</AssemblyOriginatorKeyFile>
Expand All @@ -28,7 +28,7 @@
<Reference Include="System.Web" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)'=='netcoreapp2.1' OR '$(TargetFramework)'=='netcoreapp3.1'">
<ItemGroup Condition="'$(TargetFramework)'=='netcoreapp2.1'">
<PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
</ItemGroup>

Expand Down
2 changes: 1 addition & 1 deletion src/NUnitEngine/nunit.engine/nunit.engine.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<RootNamespace>NUnit.Engine</RootNamespace>
<TargetFrameworks>net20;netstandard2.0;netcoreapp3.1</TargetFrameworks>
<TargetFrameworks>net20;netstandard2.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\..\nunit.snk</AssemblyOriginatorKeyFile>
<DebugType>portable</DebugType>
Expand Down

0 comments on commit b348f4e

Please sign in to comment.