Skip to content

Commit 367735c

Browse files
committed
Add a symbol verifier
1 parent ce3437d commit 367735c

File tree

3 files changed

+71
-4
lines changed

3 files changed

+71
-4
lines changed

src/wpiutil/Natives/TimestampNative.cs

-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ namespace WPIUtil.Natives;
55

66
public static partial class TimestampNative
77
{
8-
[LibraryImport("wpiutil", EntryPoint = "WPI_Impl_ShutdownNowRio")]
9-
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
10-
public static partial void ShutdownNowRio();
11-
128
[LibraryImport("wpiutil", EntryPoint = "WPI_NowDefault")]
139
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
1410
public static partial ulong NowDefault();

test/ntcore.test/SymbolVerifier.cs

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Reflection;
2+
using System.Runtime.InteropServices;
3+
using NetworkTables;
4+
using Xunit;
5+
6+
namespace WPIUtil.Test;
7+
8+
public class SymbolVerifier
9+
{
10+
[Fact]
11+
public void VerifySymbols()
12+
{
13+
Assembly assemblyType = typeof(NetworkTableInstance).Assembly;
14+
// Find all native methods
15+
var foundMethods =
16+
assemblyType.GetTypes()
17+
.SelectMany(x => x.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
18+
.Where(x => x.Attributes.HasFlag(MethodAttributes.PinvokeImpl))
19+
.Select(x => (x, x.GetCustomAttribute<DllImportAttribute>()))
20+
.Where(x => x.Item2 != null)
21+
.Select(x => (Method: x.x, Dll: x.Item2!.Value, EntryPoint: x.Item2.EntryPoint ?? x.x.Name));
22+
23+
Dictionary<string, nint> libraries = [];
24+
foreach (var method in foundMethods)
25+
{
26+
if (!libraries.ContainsKey(method.Dll))
27+
{
28+
libraries[method.Dll] = NativeLibrary.Load(method.Dll, assemblyType, DllImportSearchPath.UseDllDirectoryForDependencies);
29+
}
30+
31+
var library = libraries[method.Dll];
32+
Assert.True(NativeLibrary.TryGetExport(library, method.EntryPoint, out _),
33+
$"Failed to find symbol {method.EntryPoint} in {method.Dll}");
34+
}
35+
}
36+
}

test/wpiutil.test/SymbolVerifier.cs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Reflection;
2+
using System.Runtime.InteropServices;
3+
using Xunit;
4+
5+
namespace WPIUtil.Test;
6+
7+
public class SymbolVerifier
8+
{
9+
[Fact]
10+
public void VerifySymbols()
11+
{
12+
Assembly assemblyType = typeof(WpiString).Assembly;
13+
// Find all native methods
14+
var foundMethods =
15+
assemblyType.GetTypes()
16+
.SelectMany(x => x.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
17+
.Where(x => x.Attributes.HasFlag(MethodAttributes.PinvokeImpl))
18+
.Select(x => (x, x.GetCustomAttribute<DllImportAttribute>()))
19+
.Where(x => x.Item2 != null)
20+
.Select(x => (Method: x.x, Dll: x.Item2!.Value, EntryPoint: x.Item2.EntryPoint ?? x.x.Name));
21+
22+
Dictionary<string, nint> libraries = [];
23+
foreach (var method in foundMethods)
24+
{
25+
if (!libraries.ContainsKey(method.Dll))
26+
{
27+
libraries[method.Dll] = NativeLibrary.Load(method.Dll, assemblyType, DllImportSearchPath.UseDllDirectoryForDependencies);
28+
}
29+
30+
var library = libraries[method.Dll];
31+
Assert.True(NativeLibrary.TryGetExport(library, method.EntryPoint, out _),
32+
$"Failed to find symbol {method.EntryPoint} in {method.Dll}");
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)