Skip to content

Commit 709242a

Browse files
Copilottimcassell
andcommitted
Add verification that handlers are called at correct times
Co-authored-by: timcassell <[email protected]>
1 parent 093d57c commit 709242a

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

tests/BenchmarkDotNet.IntegrationTests/Diagnosers/MockInProcessDiagnoser.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ namespace BenchmarkDotNet.IntegrationTests.Diagnosers;
1414
public abstract class BaseMockInProcessDiagnoser : IInProcessDiagnoser
1515
{
1616
public Dictionary<BenchmarkCase, string> Results { get; } = [];
17+
public Dictionary<BenchmarkCase, List<BenchmarkSignal>> HandlerSignals { get; } = [];
1718

1819
public abstract string DiagnoserName { get; }
1920
public abstract RunMode DiagnoserRunMode { get; }
@@ -42,17 +43,29 @@ public void Handle(HostSignal signal, DiagnoserActionParameters parameters) { }
4243
var (handlerType, serializedConfig) = GetSeparateProcessHandlerTypeAndSerializedConfig(benchmarkCase);
4344
if (handlerType == null)
4445
return null;
45-
var handler = (IInProcessDiagnoserHandler)Activator.CreateInstance(handlerType);
46+
var handler = (BaseMockInProcessDiagnoserHandler)Activator.CreateInstance(handlerType);
4647
handler.Initialize(serializedConfig);
48+
handler.SetDiagnoser(this, benchmarkCase);
4749
return handler;
4850
}
4951

5052
public void DeserializeResults(BenchmarkCase benchmarkCase, string results) => Results.Add(benchmarkCase, results);
53+
54+
internal void RecordSignal(BenchmarkCase benchmarkCase, BenchmarkSignal signal)
55+
{
56+
if (!HandlerSignals.ContainsKey(benchmarkCase))
57+
{
58+
HandlerSignals[benchmarkCase] = [];
59+
}
60+
HandlerSignals[benchmarkCase].Add(signal);
61+
}
5162
}
5263

5364
public abstract class BaseMockInProcessDiagnoserHandler : IInProcessDiagnoserHandler
5465
{
5566
private string _result;
67+
private BaseMockInProcessDiagnoser _diagnoser;
68+
private BenchmarkCase _benchmarkCase;
5669

5770
protected BaseMockInProcessDiagnoserHandler() { }
5871

@@ -61,7 +74,16 @@ public void Initialize(string? serializedConfig)
6174
_result = serializedConfig ?? string.Empty;
6275
}
6376

64-
public void Handle(BenchmarkSignal signal, InProcessDiagnoserActionArgs args) { }
77+
internal void SetDiagnoser(BaseMockInProcessDiagnoser diagnoser, BenchmarkCase benchmarkCase)
78+
{
79+
_diagnoser = diagnoser;
80+
_benchmarkCase = benchmarkCase;
81+
}
82+
83+
public void Handle(BenchmarkSignal signal, InProcessDiagnoserActionArgs args)
84+
{
85+
_diagnoser?.RecordSignal(_benchmarkCase, signal);
86+
}
6587

6688
public string SerializeResults() => _result;
6789
}

tests/BenchmarkDotNet.IntegrationTests/InProcessDiagnoserTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,37 @@ public void MultipleInProcessDiagnosersWork(BaseMockInProcessDiagnoser[] diagnos
109109
// SeparateLogic is not yet implemented for in-process diagnosers, so we expect it to fail
110110
// This is marked as a known limitation to be fixed in the future
111111
Assert.Empty(diagnoser.Results); // Expected to fail until SeparateLogic is implemented
112+
Assert.Empty(diagnoser.HandlerSignals); // No signals should be recorded
112113
}
113114
else
114115
{
115116
Assert.NotEmpty(diagnoser.Results);
116117
Assert.Equal(summary.BenchmarksCases.Length, diagnoser.Results.Count);
117118
Assert.All(diagnoser.Results.Values, result => Assert.Equal(diagnoser.ExpectedResult, result));
119+
120+
// Verify handlers were called at the correct times
121+
Assert.NotEmpty(diagnoser.HandlerSignals);
122+
Assert.Equal(summary.BenchmarksCases.Length, diagnoser.HandlerSignals.Count);
123+
124+
foreach (var (benchmarkCase, signals) in diagnoser.HandlerSignals)
125+
{
126+
// Verify the handler was called with all expected signals in the correct order
127+
Assert.NotEmpty(signals);
128+
Assert.Contains(Engines.BenchmarkSignal.BeforeActualRun, signals);
129+
Assert.Contains(Engines.BenchmarkSignal.AfterActualRun, signals);
130+
131+
// Verify signals are in correct order
132+
var beforeIndex = signals.IndexOf(Engines.BenchmarkSignal.BeforeActualRun);
133+
var afterIndex = signals.IndexOf(Engines.BenchmarkSignal.AfterActualRun);
134+
Assert.True(beforeIndex < afterIndex,
135+
$"BeforeActualRun should come before AfterActualRun, but got indices {beforeIndex} and {afterIndex}");
136+
}
118137
}
119138
}
120139
else
121140
{
122141
Assert.Empty(diagnoser.Results);
142+
Assert.Empty(diagnoser.HandlerSignals); // None should not have any signals
123143
}
124144
}
125145
}

0 commit comments

Comments
 (0)