Skip to content

Commit e9c62a2

Browse files
committed
Add hal and datalog tests
1 parent 6c190fd commit e9c62a2

File tree

6 files changed

+98
-5
lines changed

6 files changed

+98
-5
lines changed

WPILib.sln

+15
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "datalog", "src\datalog\data
5151
EndProject
5252
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "datalog.test", "test\datalog.test\datalog.test.csproj", "{49B1AC50-4FD0-4524-85BA-FC26AD1EEBBA}"
5353
EndProject
54+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hal.test", "test\hal.test\hal.test.csproj", "{88C326DC-0E40-40B9-86B5-95157FF37D95}"
55+
EndProject
5456
Global
5557
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5658
Debug|Any CPU = Debug|Any CPU
@@ -301,6 +303,18 @@ Global
301303
{49B1AC50-4FD0-4524-85BA-FC26AD1EEBBA}.Release|x64.Build.0 = Release|Any CPU
302304
{49B1AC50-4FD0-4524-85BA-FC26AD1EEBBA}.Release|x86.ActiveCfg = Release|Any CPU
303305
{49B1AC50-4FD0-4524-85BA-FC26AD1EEBBA}.Release|x86.Build.0 = Release|Any CPU
306+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
307+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Debug|Any CPU.Build.0 = Debug|Any CPU
308+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Debug|x64.ActiveCfg = Debug|Any CPU
309+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Debug|x64.Build.0 = Debug|Any CPU
310+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Debug|x86.ActiveCfg = Debug|Any CPU
311+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Debug|x86.Build.0 = Debug|Any CPU
312+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Release|Any CPU.ActiveCfg = Release|Any CPU
313+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Release|Any CPU.Build.0 = Release|Any CPU
314+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Release|x64.ActiveCfg = Release|Any CPU
315+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Release|x64.Build.0 = Release|Any CPU
316+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Release|x86.ActiveCfg = Release|Any CPU
317+
{88C326DC-0E40-40B9-86B5-95157FF37D95}.Release|x86.Build.0 = Release|Any CPU
304318
EndGlobalSection
305319
GlobalSection(SolutionProperties) = preSolution
306320
HideSolutionNode = FALSE
@@ -325,5 +339,6 @@ Global
325339
{B09918CC-E71F-4E49-AA20-81559D3583B2} = {DB664556-4BF0-4874-8CB6-DC24E60A67AF}
326340
{92BE0A00-437A-43BF-9793-2995FDB3DC23} = {DB664556-4BF0-4874-8CB6-DC24E60A67AF}
327341
{49B1AC50-4FD0-4524-85BA-FC26AD1EEBBA} = {AD95ECD8-E708-4FB4-9B7E-A8A8EF3FCB3E}
342+
{88C326DC-0E40-40B9-86B5-95157FF37D95} = {AD95ECD8-E708-4FB4-9B7E-A8A8EF3FCB3E}
328343
EndGlobalSection
329344
EndGlobal

src/datalog/DataLogWriter.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ namespace WPI.Logging;
44

55
public unsafe class DataLogWriter : DataLog
66
{
7-
public DataLogWriter(string filename, string extraHeader = "") : base(DataLogNative.Create(filename, extraHeader))
7+
private static OpaqueDataLog* Create(string filename, string extraHeader)
8+
{
9+
var errorCode = 0;
10+
return DataLogNative.Create(filename, &errorCode, extraHeader);
11+
}
12+
13+
public DataLogWriter(string filename, string extraHeader = "") : base(Create(filename, extraHeader))
814
{
915
}
1016
}

src/datalog/Natives/DataLogNative.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static partial class DataLogNative
1313
{
1414
[LibraryImport("datalog", EntryPoint = "WPI_DataLog_CreateWriter")]
1515
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
16-
public static unsafe partial OpaqueDataLog* Create(WpiString dir, WpiString filename);
16+
public static unsafe partial OpaqueDataLog* Create(WpiString dir, int* errorCode, WpiString filename);
1717

1818
[LibraryImport("datalog", EntryPoint = "WPI_DataLog_CreateBackgroundWriter")]
1919
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
@@ -27,7 +27,7 @@ public static partial class DataLogNative
2727
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
2828
public static unsafe partial void Release(OpaqueDataLog* datalog);
2929

30-
[LibraryImport("datalog", EntryPoint = "WPI_DataLog_SetFilename")]
30+
[LibraryImport("datalog", EntryPoint = "WPI_DataLog_SetBackgroundWriterFilename")]
3131
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
3232
public static unsafe partial void SetFilename(OpaqueDataLog* datalog, WpiString filename);
3333

test/datalog.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 WPI.Logging;
4+
using Xunit;
5+
6+
namespace Datalog.Test;
7+
8+
public class SymbolVerifier
9+
{
10+
[Fact]
11+
public void VerifySymbols()
12+
{
13+
Assembly assemblyType = typeof(DataLogBackgroundWriter).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/hal.test/LoadingTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Hal;
1+
using WPIHal.Natives;
22
using Xunit;
33

44
namespace hal.test
@@ -8,7 +8,7 @@ public class LoadingTests
88
[Fact]
99
public void TestHalLoads()
1010
{
11-
Assert.True(HALLowLevel.Initialize());
11+
HalBase.Initialize();
1212
}
1313
}
1414
}

test/hal.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 WPIHal;
4+
// using Xunit;
5+
6+
// namespace HAL.Test;
7+
8+
// public class SymbolVerifier
9+
// {
10+
// [Fact]
11+
// public void VerifySymbols()
12+
// {
13+
// Assembly assemblyType = typeof(HalType).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+
// }

0 commit comments

Comments
 (0)