Skip to content

Commit d9463da

Browse files
committed
Split tests into groups and run in parallel
1 parent 2b19f47 commit d9463da

11 files changed

Lines changed: 92 additions & 22 deletions

File tree

Src/FastData.Generator.CPlusPlus.TestHarness/CPlusPlusTestHarness.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public sealed class CPlusPlusTestHarness : TestHarnessBase
1717

1818
public CPlusPlusTestHarness() : base("CPlusPlus")
1919
{
20-
string rootDir = Path.Combine(Path.GetTempPath(), "FastData", "CPlusPlus");
20+
string rootDir = Path.Combine(Path.GetTempPath(), "FastData", "CPlusPlus", Environment.ProcessId.ToString());
2121
Directory.CreateDirectory(rootDir);
2222
_compiler = new GccCompiler(false, rootDir, false);
2323
}

Src/FastData.Generator.Rust.TestHarness/RustTestHarness.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public sealed class RustTestHarness : TestHarnessBase
1717

1818
public RustTestHarness() : base("Rust")
1919
{
20-
string rootDir = Path.Combine(Path.GetTempPath(), "FastData", "Rust");
20+
string rootDir = Path.Combine(Path.GetTempPath(), "FastData", "Rust", Environment.ProcessId.ToString());
2121
Directory.CreateDirectory(rootDir);
2222
_compiler = new RustCompiler(false, rootDir);
2323
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Genbox.FastData.Generator.CPlusPlus.TestHarness;
2+
using Genbox.FastData.InternalShared.TestHarness;
3+
4+
namespace Genbox.FastData.TestHarness.Runner;
5+
6+
public sealed class CPlusPlusVectorTests : VectorTestsBase
7+
{
8+
private static readonly ITestHarness _harness = new CPlusPlusTestHarness();
9+
protected override ITestHarness Harness => _harness;
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Genbox.FastData.Generator.CSharp.TestHarness;
2+
using Genbox.FastData.InternalShared.TestHarness;
3+
4+
namespace Genbox.FastData.TestHarness.Runner;
5+
6+
public sealed class CSharpVectorTests : VectorTestsBase
7+
{
8+
private static readonly ITestHarness _harness = new CSharpTestHarness();
9+
protected override ITestHarness Harness => _harness;
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Genbox.FastData.InternalShared.Helpers;
2+
using Genbox.FastData.InternalShared.TestClasses;
3+
4+
namespace Genbox.FastData.TestHarness.Runner.Code;
5+
6+
public sealed class KeyValueVectorTheoryData : TheoryData<ITestVector>
7+
{
8+
public KeyValueVectorTheoryData()
9+
{
10+
foreach (ITestVector vector in TestVectorHelper.GetKeyValueTestVectors())
11+
Add(vector);
12+
}
13+
}

Src/FastData.TestHarness.Runner/Code/TestHarnessRunnerHelper.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Security.Cryptography;
2+
using System.Text;
13
using Genbox.FastData.InternalShared;
24
using Genbox.FastData.InternalShared.TestClasses;
35
using Genbox.FastData.InternalShared.TestHarness;
@@ -7,6 +9,7 @@ namespace Genbox.FastData.TestHarness.Runner.Code;
79

810
internal static class TestHarnessRunnerHelper
911
{
12+
private const int CompileHashBytes = 8;
1013
private const int SuccessExitCode = 1;
1114
private const string FeatureDirectory = "../Verify/Features/";
1215
private const string VectorDirectory = "../Verify/Vectors/";
@@ -31,15 +34,24 @@ internal static int RunContainsProgram<T>(ITestHarness harness, GeneratorSpec sp
3134
{
3235
ITestRenderer renderer = harness.CreateRenderer(spec);
3336
string program = harness.RenderContainsProgram(spec, renderer, present, notPresent);
34-
return harness.Run(fileId, program);
37+
string compileId = GetCompileId(harness, fileId, program);
38+
return harness.Run(compileId, program);
3539
}
3640

3741
internal static int RunTryLookupProgram<TKey, TValue>(ITestHarness harness, GeneratorSpec spec, TestVector<TKey, TValue> vector, string fileId) where TValue : notnull
3842
{
3943
ITestRenderer renderer = harness.CreateRenderer(spec);
4044
string program = harness.RenderTryLookupProgram(spec, renderer, vector);
41-
return harness.Run(fileId, program);
45+
string compileId = GetCompileId(harness, fileId, program);
46+
return harness.Run(compileId, program);
4247
}
4348

4449
internal static void AssertSuccessExitCode(int exitCode) => Assert.Equal(SuccessExitCode, exitCode);
50+
51+
private static string GetCompileId(ITestHarness harness, string fileId, string source)
52+
{
53+
byte[] hash = SHA256.HashData(Encoding.UTF8.GetBytes(source));
54+
string hashHex = Convert.ToHexString(hash.AsSpan(0, CompileHashBytes));
55+
return $"{harness.Name}_{fileId}_{hashHex}";
56+
}
4557
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Genbox.FastData.InternalShared.Helpers;
2+
using Genbox.FastData.InternalShared.TestClasses;
3+
using Xunit;
4+
5+
namespace Genbox.FastData.TestHarness.Runner.Code;
6+
7+
public sealed class ValueVectorTheoryData : TheoryData<ITestVector>
8+
{
9+
public ValueVectorTheoryData()
10+
{
11+
foreach (ITestVector vector in TestVectorHelper.GetValueTestVectors())
12+
Add(vector);
13+
}
14+
}

Src/FastData.TestHarness.Runner/FastData.TestHarness.Runner.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
<TargetFramework>net10.0</TargetFramework>
77
</PropertyGroup>
88

9+
<ItemGroup>
10+
<None Update="xunit.runner.json">
11+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
12+
</None>
13+
</ItemGroup>
14+
915
<ItemGroup>
1016
<ProjectReference Include="..\FastData.Generator.CPlusPlus.TestHarness\FastData.Generator.CPlusPlus.TestHarness.csproj" />
1117
<ProjectReference Include="..\FastData.Generator.CSharp.TestHarness\FastData.Generator.CSharp.TestHarness.csproj" />
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Genbox.FastData.Generator.Rust.TestHarness;
2+
using Genbox.FastData.InternalShared.TestHarness;
3+
4+
namespace Genbox.FastData.TestHarness.Runner;
5+
6+
public sealed class RustVectorTests : VectorTestsBase
7+
{
8+
private static readonly ITestHarness _harness = new RustTestHarness();
9+
protected override ITestHarness Harness => _harness;
10+
}
Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Diagnostics.CodeAnalysis;
22
using Genbox.FastData.InternalShared;
3-
using Genbox.FastData.InternalShared.Helpers;
43
using Genbox.FastData.InternalShared.TestClasses;
54
using Genbox.FastData.InternalShared.TestHarness;
65
using Genbox.FastData.TestHarness.Runner.Code;
@@ -9,13 +8,15 @@
98
namespace Genbox.FastData.TestHarness.Runner;
109

1110
[SuppressMessage("Usage", "xUnit1039:The type argument to theory data is not compatible with the type of the corresponding test method parameter")]
12-
public class VectorTests
11+
public abstract class VectorTestsBase
1312
{
13+
protected abstract ITestHarness Harness { get; }
14+
1415
[Theory]
15-
[ClassData(typeof(KeyValueTestVectors))]
16-
public async Task KeyValueVectors<TKey, TValue>(ITestHarness harness, TestVector<TKey, TValue> vector) where TValue : notnull
16+
[ClassData(typeof(KeyValueVectorTheoryData))]
17+
public async Task KeyValueVectors<TKey, TValue>(TestVector<TKey, TValue> vector) where TValue : notnull
1718
{
18-
TestHarnessRunnerHelper.SkipIfEmptyImplementation(harness, vector.Type);
19+
ITestHarness harness = Harness;
1920
GeneratorSpec spec = Generate(harness.CreateGenerator, vector);
2021
Assert.NotEmpty(spec.Source);
2122

@@ -27,10 +28,10 @@ public async Task KeyValueVectors<TKey, TValue>(ITestHarness harness, TestVector
2728
}
2829

2930
[Theory]
30-
[ClassData(typeof(ValueTestVectors))]
31-
public async Task ValueVectors<T>(ITestHarness harness, TestVector<T> vector)
31+
[ClassData(typeof(ValueVectorTheoryData))]
32+
public async Task ValueVectors<T>(TestVector<T> vector)
3233
{
33-
TestHarnessRunnerHelper.SkipIfEmptyImplementation(harness, vector.Type);
34+
ITestHarness harness = Harness;
3435
GeneratorSpec spec = Generate(harness.CreateGenerator, vector);
3536
Assert.NotEmpty(spec.Source);
3637

@@ -40,14 +41,4 @@ public async Task ValueVectors<T>(ITestHarness harness, TestVector<T> vector)
4041
int exitCode = TestHarnessRunnerHelper.RunContainsProgram(harness, spec, vector.Keys, vector.NotPresent, snapshotId);
4142
TestHarnessRunnerHelper.AssertSuccessExitCode(exitCode);
4243
}
43-
44-
private sealed class ValueTestVectors : HarnessVectorTheoryData
45-
{
46-
public ValueTestVectors() => AddVectors(TestVectorHelper.GetValueTestVectors().ToArray());
47-
}
48-
49-
private sealed class KeyValueTestVectors : HarnessVectorTheoryData
50-
{
51-
public KeyValueTestVectors() => AddVectors(TestVectorHelper.GetKeyValueTestVectors().ToArray());
52-
}
5344
}

0 commit comments

Comments
 (0)