Skip to content

Commit a13982e

Browse files
committed
test: Added tests
1 parent 0e7959c commit a13982e

9 files changed

Lines changed: 196 additions & 0 deletions

File tree

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
using NUnit.Framework;
2+
using System;
3+
using System.Reflection;
4+
using System.Runtime.InteropServices;
5+
6+
namespace MemoryModule.Tests
7+
{
8+
class Given_DependentDll
9+
{
10+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
11+
delegate int AddNumberDelegate(int a, int b);
12+
13+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
14+
delegate void GreetDelegate();
15+
16+
[Test]
17+
public void When_DependencyPreLoaded()
18+
{
19+
var random = new Random();
20+
21+
for (int test = 0; test < 10; ++test)
22+
{
23+
string secretDll = Helper.GetDllName("Secret");
24+
var secretDllStream = Assembly.GetExecutingAssembly()
25+
.GetManifestResourceStream($"MemoryModule.Tests.{secretDll}");
26+
using var secretAsm = NativeAssembly.Load(secretDllStream, secretDll);
27+
28+
string dllName = Helper.GetDllName("SampleDLL");
29+
var dllStream = Assembly.GetExecutingAssembly()
30+
.GetManifestResourceStream($"MemoryModule.Tests.{dllName}");
31+
using var asm = NativeAssembly.Load(dllStream);
32+
33+
var addNumbers = asm.GetDelegate<AddNumberDelegate>("addNumbers");
34+
35+
for (int i = 0; i < 100; ++i)
36+
{
37+
const int low = -1000000000;
38+
const int high = -low;
39+
40+
var a = random.Next(low, high);
41+
var b = random.Next(low, high);
42+
43+
Assert.AreEqual(a + b, addNumbers(a, b));
44+
}
45+
46+
// Test if C++ causes any problems...
47+
var Greet = asm.GetDelegate<GreetDelegate>("Greet");
48+
Greet();
49+
}
50+
}
51+
52+
[Test]
53+
public void When_DependencyLateResolve()
54+
{
55+
var random = new Random();
56+
57+
NativeAssembly.AssemblyResolve += NativeAssembly_AssemblyResolve;
58+
59+
for (int test = 0; test < 10; ++test)
60+
{
61+
string dllName = Helper.GetDllName("SampleDLL");
62+
var dllStream = Assembly.GetExecutingAssembly()
63+
.GetManifestResourceStream($"MemoryModule.Tests.{dllName}");
64+
using var asm = NativeAssembly.Load(dllStream);
65+
66+
var addNumbers = asm.GetDelegate<AddNumberDelegate>("addNumbers");
67+
68+
for (int i = 0; i < 100; ++i)
69+
{
70+
const int low = -1000000000;
71+
const int high = -low;
72+
73+
var a = random.Next(low, high);
74+
var b = random.Next(low, high);
75+
76+
Assert.AreEqual(a + b, addNumbers(a, b));
77+
}
78+
79+
// Test if C++ causes any problems...
80+
var Greet = asm.GetDelegate<GreetDelegate>("Greet");
81+
Greet();
82+
}
83+
84+
NativeAssembly NativeAssembly_AssemblyResolve(object sender, NativeResolveEventArgs args)
85+
{
86+
if (args.Name.Equals(Helper.GetDllName("Secret")))
87+
{
88+
args.ShouldDisposeAssembly = true;
89+
return NativeAssembly.Load(
90+
Assembly.GetExecutingAssembly().GetManifestResourceStream(
91+
$"MemoryModule.Tests.{Helper.GetDllName("Secret")}"
92+
)
93+
);
94+
}
95+
96+
return null;
97+
}
98+
}
99+
}
100+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using NUnit.Framework;
2+
using System;
3+
using System.Reflection;
4+
using System.Runtime.InteropServices;
5+
6+
namespace MemoryModule.Tests
7+
{
8+
public class Given_StandaloneDll
9+
{
10+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
11+
delegate int GetSecretDelegate();
12+
13+
[Test]
14+
public void When_Loaded()
15+
{
16+
// Sometimes, low-level segmentation fault can occur, without crashing the test.
17+
for (int test = 0; test < 10; ++test)
18+
{
19+
string dllName = Helper.GetDllName("Secret");
20+
var dllStream = Assembly.GetExecutingAssembly()
21+
.GetManifestResourceStream($"MemoryModule.Tests.{dllName}");
22+
using var asm = NativeAssembly.Load(dllStream);
23+
24+
var secretFunc = asm.GetDelegate<GetSecretDelegate>("GetSecret");
25+
26+
for (int i = 0; i < 10; ++i)
27+
{
28+
int result = secretFunc();
29+
Assert.AreEqual(result, Math.Clamp(result, 0, 100));
30+
}
31+
}
32+
}
33+
}
34+
}

MemoryModule.Tests/Helper.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace MemoryModule.Tests
6+
{
7+
internal static class Helper
8+
{
9+
public static string GetDllName(string displayName)
10+
{
11+
return $"{displayName}{(Environment.Is64BitProcess ? "64" : "")}.dll";
12+
}
13+
}
14+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
6+
<IsPackable>false</IsPackable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<None Remove="SampleDLL.dll" />
11+
<None Remove="SampleDLL64.dll" />
12+
<None Remove="Secret.dll" />
13+
<None Remove="Secret64.dll" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<EmbeddedResource Include="SampleDLL.dll" />
18+
<EmbeddedResource Include="SampleDLL64.dll" />
19+
<EmbeddedResource Include="Secret.dll" />
20+
<EmbeddedResource Include="Secret64.dll" />
21+
</ItemGroup>
22+
23+
<ItemGroup>
24+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
25+
<PackageReference Include="NUnit" Version="3.13.1" />
26+
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
27+
<PackageReference Include="coverlet.collector" Version="3.0.2" />
28+
</ItemGroup>
29+
30+
<ItemGroup>
31+
<ProjectReference Include="..\MemoryModule\MemoryModule.csproj" />
32+
</ItemGroup>
33+
34+
</Project>

MemoryModule.Tests/SampleDLL.dll

1010 KB
Binary file not shown.

MemoryModule.Tests/SampleDLL64.dll

903 KB
Binary file not shown.

MemoryModule.Tests/Secret.dll

214 KB
Binary file not shown.

MemoryModule.Tests/Secret64.dll

165 KB
Binary file not shown.

MemoryModule.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MemoryModule", "MemoryModul
77
EndProject
88
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DemoApp", "DemoApp\DemoApp.csproj", "{95A0C909-90EE-40A7-A6B6-F5901373E5C7}"
99
EndProject
10+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MemoryModule.Tests", "MemoryModule.Tests\MemoryModule.Tests.csproj", "{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}"
11+
EndProject
1012
Global
1113
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1214
Debug|Any CPU = Debug|Any CPU
@@ -41,6 +43,18 @@ Global
4143
{95A0C909-90EE-40A7-A6B6-F5901373E5C7}.Release|x64.Build.0 = Release|x64
4244
{95A0C909-90EE-40A7-A6B6-F5901373E5C7}.Release|x86.ActiveCfg = Release|Any CPU
4345
{95A0C909-90EE-40A7-A6B6-F5901373E5C7}.Release|x86.Build.0 = Release|Any CPU
46+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Debug|Any CPU.Build.0 = Debug|Any CPU
48+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Debug|x64.ActiveCfg = Debug|Any CPU
49+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Debug|x64.Build.0 = Debug|Any CPU
50+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Debug|x86.ActiveCfg = Debug|Any CPU
51+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Debug|x86.Build.0 = Debug|Any CPU
52+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Release|Any CPU.ActiveCfg = Release|Any CPU
53+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Release|Any CPU.Build.0 = Release|Any CPU
54+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Release|x64.ActiveCfg = Release|Any CPU
55+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Release|x64.Build.0 = Release|Any CPU
56+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Release|x86.ActiveCfg = Release|Any CPU
57+
{7B00B16F-5297-4EF6-AA2D-D4E70EE7A55B}.Release|x86.Build.0 = Release|Any CPU
4458
EndGlobalSection
4559
GlobalSection(SolutionProperties) = preSolution
4660
HideSolutionNode = FALSE

0 commit comments

Comments
 (0)