Skip to content

Commit 32c7655

Browse files
author
Max Charlamb
committed
fix managed portions of runtime info
1 parent e68822b commit 32c7655

File tree

4 files changed

+114
-13
lines changed

4 files changed

+114
-13
lines changed

src/native/managed/cdacreader/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeInfo.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public enum RuntimeInfoArchitecture : uint
1010
Unknown = 0,
1111
X86,
1212
Arm32,
13-
Amd64,
13+
X64,
1414
Arm64,
1515
LoongArch64,
1616
RISCV,
@@ -19,7 +19,7 @@ public enum RuntimeInfoArchitecture : uint
1919
public enum RuntimeInfoOperatingSystem : uint
2020
{
2121
Unknown = 0,
22-
Windows,
22+
Win,
2323
Unix,
2424
}
2525

@@ -32,6 +32,5 @@ public interface IRuntimeInfo : IContract
3232

3333
public readonly struct RuntimeInfo : IRuntimeInfo
3434
{
35-
RuntimeInfoArchitecture IRuntimeInfo.GetTargetArchitecture() => RuntimeInfoArchitecture.Unknown;
36-
RuntimeInfoOperatingSystem IRuntimeInfo.GetTargetOperatingSystem() => RuntimeInfoOperatingSystem.Unknown;
35+
3736
}

src/native/managed/cdacreader/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,26 @@ public RuntimeInfo_1(Target target)
1414
_target = target;
1515
}
1616

17-
RuntimeInfoArchitecture IRuntimeInfo.GetTargetArchitecture()
17+
readonly RuntimeInfoArchitecture IRuntimeInfo.GetTargetArchitecture()
1818
{
19-
if (_target.TryReadGlobal(Constants.Globals.Architecture, out uint? arch))
19+
if (_target.TryReadGlobalString(Constants.Globals.Architecture, out string? arch))
2020
{
21-
if (Enum.IsDefined(typeof(RuntimeInfoArchitecture), arch))
21+
if (Enum.TryParse(arch, ignoreCase: true, out RuntimeInfoArchitecture parsedArch))
2222
{
23-
return (RuntimeInfoArchitecture)arch;
23+
return parsedArch;
2424
}
2525
}
2626

2727
return RuntimeInfoArchitecture.Unknown;
2828
}
2929

30-
RuntimeInfoOperatingSystem IRuntimeInfo.GetTargetOperatingSystem()
30+
readonly RuntimeInfoOperatingSystem IRuntimeInfo.GetTargetOperatingSystem()
3131
{
32-
if (_target.TryReadGlobal(Constants.Globals.OperatingSystem, out uint? os))
32+
if (_target.TryReadGlobalString(Constants.Globals.OperatingSystem, out string? os))
3333
{
34-
if (Enum.IsDefined(typeof(RuntimeInfoOperatingSystem), os))
34+
if (Enum.TryParse(os, ignoreCase: true, out RuntimeInfoOperatingSystem parsedOS))
3535
{
36-
return (RuntimeInfoOperatingSystem)os;
36+
return parsedOS;
3737
}
3838
}
3939

src/native/managed/cdacreader/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/IPlatformAgnosticContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static IPlatformAgnosticContext GetContextForPlatform(Target target)
2828
IRuntimeInfo runtimeInfo = target.Contracts.RuntimeInfo;
2929
return runtimeInfo.GetTargetArchitecture() switch
3030
{
31-
RuntimeInfoArchitecture.Amd64 => new ContextHolder<AMD64Context>(),
31+
RuntimeInfoArchitecture.X64 => new ContextHolder<AMD64Context>(),
3232
RuntimeInfoArchitecture.Arm64 => new ContextHolder<ARM64Context>(),
3333
RuntimeInfoArchitecture.Unknown => throw new InvalidOperationException($"Processor architecture is required for creating a platform specific context and is not provided by the target"),
3434
_ => throw new InvalidOperationException($"Unsupported architecture {runtimeInfo.GetTargetArchitecture()}"),
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using Microsoft.Diagnostics.DataContractReader.Contracts;
7+
using Moq;
8+
using Xunit;
9+
10+
namespace Microsoft.Diagnostics.DataContractReader.Tests;
11+
12+
public class RuntimeInfoTests
13+
{
14+
internal static Target CreateTarget(
15+
MockTarget.Architecture arch,
16+
(string Name, string Value)[] globalStrings)
17+
{
18+
MockMemorySpace.Builder builder = new MockMemorySpace.Builder(new TargetTestHelpers(arch));
19+
TestPlaceholderTarget target = new TestPlaceholderTarget(arch, builder.GetReadContext().ReadFromTarget, [], [], globalStrings);
20+
21+
IContractFactory<IRuntimeInfo> runtimeInfoFactory = new RuntimeInfoFactory();
22+
23+
ContractRegistry reg = Mock.Of<ContractRegistry>(
24+
c => c.RuntimeInfo == runtimeInfoFactory.CreateContract(target, 1));
25+
target.SetContracts(reg);
26+
return target;
27+
}
28+
29+
public static IEnumerable<object[]> StdArchAllTargetArchitectures()
30+
{
31+
foreach(object[] arr in new MockTarget.StdArch())
32+
{
33+
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
34+
35+
foreach(RuntimeInfoArchitecture targetArch in (RuntimeInfoArchitecture[])Enum.GetValues(typeof(RuntimeInfoArchitecture)))
36+
{
37+
// Skip Unknown architecture
38+
if (targetArch == RuntimeInfoArchitecture.Unknown)
39+
continue;
40+
41+
yield return new object[] { arch, targetArch.ToString().ToLowerInvariant(), targetArch };
42+
}
43+
44+
yield return new object[] { arch, "notATargetArch", RuntimeInfoArchitecture.Unknown };
45+
}
46+
}
47+
48+
[Theory]
49+
[MemberData(nameof(StdArchAllTargetArchitectures))]
50+
public void GetTargetArchitectureTest(
51+
MockTarget.Architecture arch,
52+
string architecture,
53+
RuntimeInfoArchitecture expectedArchitecture)
54+
{
55+
var target = CreateTarget(arch, [(Constants.Globals.Architecture, architecture)]);
56+
57+
// TEST
58+
59+
var runtimeInfo = target.Contracts.RuntimeInfo;
60+
Assert.NotNull(runtimeInfo);
61+
62+
var actualArchitecture = runtimeInfo.GetTargetArchitecture();
63+
Assert.Equal(expectedArchitecture, actualArchitecture);
64+
}
65+
66+
public static IEnumerable<object[]> StdArchAllTargetOS()
67+
{
68+
foreach(object[] arr in new MockTarget.StdArch())
69+
{
70+
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
71+
72+
foreach(RuntimeInfoOperatingSystem targetArch in (RuntimeInfoOperatingSystem[])Enum.GetValues(typeof(RuntimeInfoOperatingSystem)))
73+
{
74+
// Skip Unknown architecture
75+
if (targetArch == RuntimeInfoOperatingSystem.Unknown)
76+
continue;
77+
78+
yield return new object[] { arch, targetArch.ToString().ToLowerInvariant(), targetArch };
79+
}
80+
81+
yield return new object[] { arch, "notAnOperatingSystem", RuntimeInfoOperatingSystem.Unknown };
82+
}
83+
}
84+
85+
[Theory]
86+
[MemberData(nameof(StdArchAllTargetOS))]
87+
public void GetTargetOperatingSystemTest(
88+
MockTarget.Architecture arch,
89+
string os,
90+
RuntimeInfoOperatingSystem expectedOS)
91+
{
92+
var target = CreateTarget(arch, [(Constants.Globals.OperatingSystem, os)]);
93+
94+
// TEST
95+
96+
var runtimeInfo = target.Contracts.RuntimeInfo;
97+
Assert.NotNull(runtimeInfo);
98+
99+
var actualArchitecture = runtimeInfo.GetTargetOperatingSystem();
100+
Assert.Equal(expectedOS, actualArchitecture);
101+
}
102+
}

0 commit comments

Comments
 (0)