Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 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 @@ -23,6 +23,7 @@ internal enum hostfxr_resolve_sdk2_result_key_t : int
resolved_sdk_dir = 0,
global_json_path = 1,
requested_version = 2,
global_json_state = 3,
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
Expand Down Expand Up @@ -159,7 +160,7 @@ static void Test_hostfxr_resolve_sdk2(string[] args)
var data = new List<(hostfxr.hostfxr_resolve_sdk2_result_key_t, string)>();
int rc = hostfxr.hostfxr_resolve_sdk2(
exe_dir: args[0],
working_dir: args[1],
working_dir: args[1] == "<none>" ? string.Empty : args[1], // Empty string disables global.json look-up
flags: Enum.Parse<hostfxr.hostfxr_resolve_sdk2_flags_t>(args[2]),
result: (key, value) => data.Add((key, value)));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ public void ComponentWithCorruptedDepsJsonShouldFail()
.Should().Fail()
.And.HaveStdOutContaining($"corehost_resolve_component_dependencies:Fail[0x{Constants.ErrorCode.ResolverInitFailure.ToString("x")}]")
.And.HaveStdOutContaining("corehost reported errors:")
.And.HaveStdOutContaining($"A JSON parsing exception occurred in [{component.DepsJson}], offset 0 (line 1, column 1): Invalid value.")
.And.HaveStdOutContaining($"Failed to parse file [{component.DepsJson}]. JSON parsing exception: Invalid value. [offset 0: line 1, column 1]")
.And.HaveStdOutContaining($"Error initializing the dependency resolver: An error occurred while parsing: {component.DepsJson}");
}

Expand Down Expand Up @@ -426,7 +426,7 @@ public void MultiThreadedComponentDependencyResolutionWithFailures()
.Should().Fail()
.And.HaveStdOutContaining($"ComponentA: corehost_resolve_component_dependencies:Fail[0x{Constants.ErrorCode.ResolverInitFailure.ToString("x")}]")
.And.HaveStdOutContaining($"ComponentA: corehost reported errors:")
.And.HaveStdOutContaining($"ComponentA: A JSON parsing exception occurred in [{componentWithNoDependencies.DepsJson}], offset 0 (line 1, column 1): Invalid value.")
.And.HaveStdOutContaining($"ComponentA: Failed to parse file [{componentWithNoDependencies.DepsJson}]. JSON parsing exception: Invalid value. [offset 0: line 1, column 1]")
.And.HaveStdOutContaining($"ComponentA: Error initializing the dependency resolver: An error occurred while parsing: {componentWithNoDependencies.DepsJson}")
.And.HaveStdOutContaining($"ComponentB: corehost_resolve_component_dependencies:Fail[0x{Constants.ErrorCode.LibHostInvalidArgs.ToString("x")}]")
.And.HaveStdOutContaining($"ComponentB: corehost reported errors:")
Expand Down
74 changes: 74 additions & 0 deletions src/installer/tests/HostActivation.Tests/HostCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Microsoft.DotNet.Cli.Build;
using Microsoft.DotNet.CoreSetup.Test;
using Microsoft.DotNet.CoreSetup.Test.HostActivation;
using Microsoft.DotNet.TestUtils;
using Xunit;

namespace HostActivation.Tests
Expand Down Expand Up @@ -168,6 +169,79 @@ public void Info_ListEnvironment_LegacyPrefixDetection()
.And.HaveStdOutContaining("Detected COMPlus_* environment variable(s). Consider transitioning to DOTNET_* equivalent.");
}

[Fact]
public void Info_GlobalJson_InvalidJson()
{
using (TestArtifact workingDir = TestArtifact.Create(nameof(Info_GlobalJson_InvalidJson)))
{
string globalJsonPath = GlobalJson.Write(workingDir.Location, "{ \"sdk\": { }");
TestContext.BuiltDotNet.Exec("--info")
.WorkingDirectory(workingDir.Location)
.CaptureStdOut().CaptureStdErr()
.Execute()
.Should().Pass()
.And.HaveStdOutContaining($"Invalid [{globalJsonPath}]")
.And.HaveStdOutContaining("JSON parsing exception:")
.And.NotHaveStdErr();
}
}

[Theory]
[InlineData("9")]
[InlineData("9.0")]
[InlineData("9.0.x")]
[InlineData("invalid")]
public void Info_GlobalJson_InvalidData(string version)
{
using (TestArtifact workingDir = TestArtifact.Create(nameof(Info_GlobalJson_InvalidData)))
{
string globalJsonPath = GlobalJson.CreateWithVersion(workingDir.Location, version);
TestContext.BuiltDotNet.Exec("--info")
.WorkingDirectory(workingDir.Location)
.CaptureStdOut().CaptureStdErr()
.Execute()
.Should().Pass()
.And.HaveStdOutContaining($"Invalid [{globalJsonPath}]")
.And.HaveStdOutContaining($"Version '{version}' is not valid for the 'sdk/version' value")
.And.HaveStdOutContaining($"Invalid global.json is ignored for SDK resolution")
.And.NotHaveStdErr();
}
}

[Theory]
[InlineData(null)]
[InlineData("patch")]
[InlineData("latestPatch")]
[InlineData("feature", false)]
[InlineData("minor", false)]
[InlineData("major", false)]
public void Info_GlobalJson_NonExistentFeatureBand(string rollForward, bool isInvalid = true)
{
string version = "9.0.0";
using (TestArtifact workingDir = TestArtifact.Create(nameof(Info_GlobalJson_NonExistentFeatureBand)))
{
string globalJsonPath = GlobalJson.CreateWithVersionSettings(workingDir.Location, version, rollForward);
var result = TestContext.BuiltDotNet.Exec("--info")
.WorkingDirectory(workingDir.Location)
.CaptureStdOut().CaptureStdErr()
.Execute();
result.Should().Pass()
.And.NotHaveStdErr();

if (isInvalid)
{
result.Should().HaveStdOutContaining($"Invalid [{globalJsonPath}]")
.And.HaveStdOutContaining($"Version '{version}' feature band does not exist and roll-forward policy '{rollForward ?? "patch"}' does not roll forward on feature band")
.And.NotHaveStdOutContaining($"Invalid global.json is ignored for SDK resolution");
}
else
{
result.Should().HaveStdOutContaining(globalJsonPath)
.And.NotHaveStdOutContaining($"Invalid [{globalJsonPath}]");
}
}
}

[Fact]
public void ListRuntimes()
{
Expand Down
Loading
Loading