Skip to content

Commit

Permalink
Cleanup of fx_resolver_t and tests in NativeHostApis (dotnet#100542)
Browse files Browse the repository at this point in the history
Slight cleanup of `fx_resolver_t` and `NativeHostApis` tests in preparation for dotnet#99027:
- Collapse `reconcile_fx_references_helper` into `reconcile_fx_references`
- Make `NativeHostApis` tests / `HostApiInvokerApp` more consistent in how they log and validate results
  • Loading branch information
elinor-fung authored and matouskozak committed Apr 30, 2024
1 parent 19b264a commit 7abdc5a
Show file tree
Hide file tree
Showing 9 changed files with 165 additions and 230 deletions.
3 changes: 1 addition & 2 deletions src/installer/tests/AppHost.Bundle.Tests/BundleProbe.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ private void SingleFileApp_ProbeFiles()
};

var result = Command.Create(singleFile, $"host_runtime_contract.bundle_probe {string.Join(" ", itemsToProbe.Select(i => i.Path))}")
.CaptureStdErr()
.CaptureStdOut()
.EnableTracingAndCaptureOutputs()
.Execute();

result.Should().Pass();
Expand Down
76 changes: 30 additions & 46 deletions src/installer/tests/Assets/Projects/HostApiInvokerApp/HostFXR.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,62 +106,48 @@ internal static extern int hostfxr_get_dotnet_environment_info(
/// <summary>
/// Test invoking the native hostfxr api hostfxr_resolve_sdk2
/// </summary>
/// <param name="args[0]">hostfxr_get_available_sdks</param>
/// <param name="args[1]">Directory of dotnet executable</param>
/// <param name="args[2]">Working directory where search for global.json begins</param>
/// <param name="args[3]">Flags</param>
/// <param name="args[0]">Directory of dotnet executable</param>
/// <param name="args[1]">Working directory where search for global.json begins</param>
/// <param name="args[2]">Flags</param>
static void Test_hostfxr_resolve_sdk2(string[] args)
{
if (args.Length != 4)
if (args.Length != 3)
{
throw new ArgumentException("Invalid number of arguments passed");
}

var data = new List<(hostfxr.hostfxr_resolve_sdk2_result_key_t, string)>();
int rc = hostfxr.hostfxr_resolve_sdk2(
exe_dir: args[1],
working_dir: args[2],
flags: Enum.Parse<hostfxr.hostfxr_resolve_sdk2_flags_t>(args[3]),
exe_dir: args[0],
working_dir: args[1],
flags: Enum.Parse<hostfxr.hostfxr_resolve_sdk2_flags_t>(args[2]),
result: (key, value) => data.Add((key, value)));

if (rc == 0)
{
Console.WriteLine("hostfxr_resolve_sdk2:Success");
}
else
{
Console.WriteLine($"hostfxr_resolve_sdk2:Fail[{rc}]");
}

Console.WriteLine($"hostfxr_resolve_sdk2 data:[{string.Join(';', data)}]");
string api = nameof(hostfxr.hostfxr_resolve_sdk2);
LogResult(api, rc);
Console.WriteLine($"{api} data:[{string.Join(';', data)}]");
}

/// <summary>
/// Test invoking the native hostfxr api hostfxr_get_available_sdks
/// </summary>
/// <param name="args[0]">hostfxr_get_available_sdks</param>
/// <param name="args[1]">Directory of dotnet executable</param>
/// <param name="args[0]">Directory of dotnet executable</param>
static void Test_hostfxr_get_available_sdks(string[] args)
{
if (args.Length != 2)
if (args.Length != 1)
{
throw new ArgumentException("Invalid number of arguments passed");
}

string[] sdks = null;
int rc = hostfxr.hostfxr_get_available_sdks(
exe_dir: args[1],
exe_dir: args[0],
(sdk_count, sdk_dirs) => sdks = sdk_dirs);

if (rc == 0)
{
Console.WriteLine("hostfxr_get_available_sdks:Success");
Console.WriteLine($"hostfxr_get_available_sdks sdks:[{string.Join(';', sdks)}]");
}
else
{
Console.WriteLine($"hostfxr_get_available_sdks:Fail[{rc}]");
}
string api = nameof(hostfxr.hostfxr_get_available_sdks);
LogResult(api, rc);
if (sdks != null)
Console.WriteLine($"{api} sdks:[{string.Join(';', sdks)}]");
}

static void Test_hostfxr_set_error_writer(string[] args)
Expand Down Expand Up @@ -193,13 +179,12 @@ static void Test_hostfxr_set_error_writer(string[] args)
/// <summary>
/// Test that invokes native api hostfxr_get_dotnet_environment_info.
/// </summary>
/// <param name="args[0]">hostfxr_get_dotnet_environment_info</param>
/// <param name="args[1]">(Optional) Path to the directory with dotnet.exe</param>
/// <param name="args[0]">(Optional) Path to the directory with dotnet.exe</param>
static void Test_hostfxr_get_dotnet_environment_info(string[] args)
{
string dotnetExeDir = null;
if (args.Length >= 2)
dotnetExeDir = args[1];
if (args.Length >= 1)
dotnetExeDir = args[0];

string hostfxr_version;
string hostfxr_commit_hash;
Expand Down Expand Up @@ -254,21 +239,20 @@ static void Test_hostfxr_get_dotnet_environment_info(string[] args)
result: result_fn,
result_context: new IntPtr(42));

if (rc != 0)
{
Console.WriteLine($"hostfxr_get_dotnet_environment_info:Fail[{rc}]");
}

Console.WriteLine($"hostfxr_get_dotnet_environment_info sdk versions:[{string.Join(";", sdks.Select(s => s.version).ToList())}]");
Console.WriteLine($"hostfxr_get_dotnet_environment_info sdk paths:[{string.Join(";", sdks.Select(s => s.path).ToList())}]");
string api = nameof(hostfxr.hostfxr_get_dotnet_environment_info);
LogResult(api, rc);

Console.WriteLine($"hostfxr_get_dotnet_environment_info framework names:[{string.Join(";", frameworks.Select(f => f.name).ToList())}]");
Console.WriteLine($"hostfxr_get_dotnet_environment_info framework versions:[{string.Join(";", frameworks.Select(f => f.version).ToList())}]");
Console.WriteLine($"hostfxr_get_dotnet_environment_info framework paths:[{string.Join(";", frameworks.Select(f => f.path).ToList())}]");
Console.WriteLine($"{api} sdk versions:[{string.Join(";", sdks.Select(s => s.version).ToList())}]");
Console.WriteLine($"{api} sdk paths:[{string.Join(";", sdks.Select(s => s.path).ToList())}]");

Console.WriteLine("hostfxr_get_dotnet_environment_info:Success");
Console.WriteLine($"{api} framework names:[{string.Join(";", frameworks.Select(f => f.name).ToList())}]");
Console.WriteLine($"{api} framework versions:[{string.Join(";", frameworks.Select(f => f.version).ToList())}]");
Console.WriteLine($"{api} framework paths:[{string.Join(";", frameworks.Select(f => f.path).ToList())}]");
}

private static void LogResult(string apiName, int rc)
=> Console.WriteLine(rc == 0 ? $"{apiName}:Success" : $"{apiName}:Fail[0x{rc:x}]");

public static bool RunTest(string apiToTest, string[] args)
{
switch (apiToTest)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,10 @@ public static bool RunTest(string apiToTest, string[] args)
switch (apiToTest)
{
case $"{nameof(host_runtime_contract)}.{nameof(host_runtime_contract.get_runtime_property)}":
Test_get_runtime_property(args[1..]);
Test_get_runtime_property(args);
break;
case $"{nameof(host_runtime_contract)}.{nameof(host_runtime_contract.bundle_probe)}":
Test_bundle_probe(args[1..]);
Test_bundle_probe(args);
break;
default:
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ public static void MainCore(string[] args)
Console.WriteLine("Hello World!");
Console.WriteLine(string.Join(Environment.NewLine, args));

// Enable tracing so that test assertion failures are easier to diagnose.
Environment.SetEnvironmentVariable("COREHOST_TRACE", "1");

// If requested, test multilevel lookup using fake Global SDK directories:
// 1. using a fake ProgramFiles location
// 2. using a fake SDK Self-Registered location
Expand Down Expand Up @@ -61,13 +58,13 @@ public static void MainCore(string[] args)
}

string apiToTest = args[0];
if (HostFXR.RunTest(apiToTest, args))
if (HostFXR.RunTest(apiToTest, args[1..]))
return;

if (HostPolicy.RunTest(apiToTest, args))
if (HostPolicy.RunTest(apiToTest, args[1..]))
return;

if (HostRuntimeContract.RunTest(apiToTest, args))
if (HostRuntimeContract.RunTest(apiToTest, args[1..]))
return;

throw new ArgumentException($"Invalid API to test passed as args[0]): {apiToTest}");
Expand Down
Loading

0 comments on commit 7abdc5a

Please sign in to comment.