Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add event processor functionality #2420

Merged
merged 12 commits into from
Sep 21, 2023
2 changes: 2 additions & 0 deletions src/BenchmarkDotNet/Configs/ConfigExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using BenchmarkDotNet.Analysers;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.EventHandlers;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Filters;
using BenchmarkDotNet.Jobs;
Expand Down Expand Up @@ -110,6 +111,7 @@ public static class ConfigExtensions
[Obsolete("This method will soon be removed, please start using .AddLogicalGroupRules() instead.")]
[EditorBrowsable(EditorBrowsableState.Never)] public static IConfig With(this IConfig config, params BenchmarkLogicalGroupRule[] rules) => config.AddLogicalGroupRules(rules);
[PublicAPI] public static ManualConfig AddLogicalGroupRules(this IConfig config, params BenchmarkLogicalGroupRule[] rules) => config.With(c => c.AddLogicalGroupRules(rules));
[PublicAPI] public static ManualConfig AddEventHandler(this IConfig config, params IEventHandler[] eventHandlers) => config.With(c => AddEventHandler(c, eventHandlers));

[PublicAPI] public static ManualConfig HideColumns(this IConfig config, params string[] columnNames) => config.With(c => c.HideColumns(columnNames));
[PublicAPI] public static ManualConfig HideColumns(this IConfig config, params IColumn[] columns) => config.With(c => c.HideColumns(columns));
Expand Down
2 changes: 2 additions & 0 deletions src/BenchmarkDotNet/Configs/DebugConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using BenchmarkDotNet.Analysers;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.EventHandlers;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Filters;
using BenchmarkDotNet.Jobs;
Expand Down Expand Up @@ -61,6 +62,7 @@ public abstract class DebugConfig : IConfig
public IEnumerable<IDiagnoser> GetDiagnosers() => Array.Empty<IDiagnoser>();
public IEnumerable<IAnalyser> GetAnalysers() => Array.Empty<IAnalyser>();
public IEnumerable<HardwareCounter> GetHardwareCounters() => Array.Empty<HardwareCounter>();
public IEnumerable<IEventHandler> GetEventHandlers() => Array.Empty<IEventHandler>();
public IEnumerable<IFilter> GetFilters() => Array.Empty<IFilter>();
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => Array.Empty<IColumnHidingRule>();

Expand Down
3 changes: 3 additions & 0 deletions src/BenchmarkDotNet/Configs/DefaultConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using BenchmarkDotNet.Analysers;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.EventHandlers;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Exporters.Csv;
using BenchmarkDotNet.Filters;
Expand Down Expand Up @@ -108,6 +109,8 @@ public string ArtifactsPath

public IEnumerable<IFilter> GetFilters() => Array.Empty<IFilter>();

public IEnumerable<IEventHandler> GetEventHandlers() => Array.Empty<IEventHandler>();

public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => Array.Empty<IColumnHidingRule>();
}
}
2 changes: 2 additions & 0 deletions src/BenchmarkDotNet/Configs/IConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using BenchmarkDotNet.Analysers;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.EventHandlers;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Filters;
using BenchmarkDotNet.Jobs;
Expand All @@ -27,6 +28,7 @@ public interface IConfig
IEnumerable<HardwareCounter> GetHardwareCounters();
IEnumerable<IFilter> GetFilters();
IEnumerable<BenchmarkLogicalGroupRule> GetLogicalGroupRules();
IEnumerable<IEventHandler> GetEventHandlers();
IEnumerable<IColumnHidingRule> GetColumnHidingRules();

IOrderer? Orderer { get; }
Expand Down
6 changes: 6 additions & 0 deletions src/BenchmarkDotNet/Configs/ImmutableConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using BenchmarkDotNet.Analysers;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.EventHandlers;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Filters;
using BenchmarkDotNet.Jobs;
Expand All @@ -31,6 +32,7 @@ public sealed class ImmutableConfig : IConfig
private readonly ImmutableHashSet<HardwareCounter> hardwareCounters;
private readonly ImmutableHashSet<IFilter> filters;
private readonly ImmutableArray<BenchmarkLogicalGroupRule> rules;
private readonly ImmutableHashSet<IEventHandler> eventHandlers;
private readonly ImmutableArray<IColumnHidingRule> columnHidingRules;

internal ImmutableConfig(
Expand All @@ -45,6 +47,7 @@ internal ImmutableConfig(
ImmutableArray<BenchmarkLogicalGroupRule> uniqueRules,
ImmutableArray<IColumnHidingRule> uniqueColumnHidingRules,
ImmutableHashSet<Job> uniqueRunnableJobs,
ImmutableHashSet<IEventHandler> uniqueEventHandlers,
ConfigUnionRule unionRule,
string artifactsPath,
CultureInfo cultureInfo,
Expand All @@ -66,6 +69,7 @@ internal ImmutableConfig(
rules = uniqueRules;
columnHidingRules = uniqueColumnHidingRules;
jobs = uniqueRunnableJobs;
eventHandlers = uniqueEventHandlers;
UnionRule = unionRule;
ArtifactsPath = artifactsPath;
CultureInfo = cultureInfo;
Expand Down Expand Up @@ -96,13 +100,15 @@ internal ImmutableConfig(
public IEnumerable<HardwareCounter> GetHardwareCounters() => hardwareCounters;
public IEnumerable<IFilter> GetFilters() => filters;
public IEnumerable<BenchmarkLogicalGroupRule> GetLogicalGroupRules() => rules;
public IEnumerable<IEventHandler> GetEventHandlers() => eventHandlers;
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => columnHidingRules;

public ILogger GetCompositeLogger() => new CompositeLogger(loggers);
public IExporter GetCompositeExporter() => new CompositeExporter(exporters);
public IValidator GetCompositeValidator() => new CompositeValidator(validators);
public IAnalyser GetCompositeAnalyser() => new CompositeAnalyser(analysers);
public IDiagnoser GetCompositeDiagnoser() => new CompositeDiagnoser(diagnosers);
public IEventHandler GetCompositeEventHandler() => new CompositeEventHandler(eventHandlers);

public bool HasMemoryDiagnoser() => diagnosers.OfType<MemoryDiagnoser>().Any();

Expand Down
2 changes: 2 additions & 0 deletions src/BenchmarkDotNet/Configs/ImmutableConfigBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public static ImmutableConfig Create(IConfig source)
var uniqueHidingRules = source.GetColumnHidingRules().ToImmutableArray();

var uniqueRunnableJobs = GetRunnableJobs(source.GetJobs()).ToImmutableHashSet();
var uniqueEventHandlers = source.GetEventHandlers().ToImmutableHashSet();

return new ImmutableConfig(
uniqueColumnProviders,
Expand All @@ -66,6 +67,7 @@ public static ImmutableConfig Create(IConfig source)
uniqueRules,
uniqueHidingRules,
uniqueRunnableJobs,
uniqueEventHandlers,
source.UnionRule,
source.ArtifactsPath ?? DefaultConfig.Instance.ArtifactsPath,
source.CultureInfo,
Expand Down
9 changes: 9 additions & 0 deletions src/BenchmarkDotNet/Configs/ManualConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using BenchmarkDotNet.Analysers;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.EventHandlers;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Extensions;
using BenchmarkDotNet.Filters;
Expand Down Expand Up @@ -33,6 +34,7 @@ public class ManualConfig : IConfig
private readonly HashSet<HardwareCounter> hardwareCounters = new HashSet<HardwareCounter>();
private readonly List<IFilter> filters = new List<IFilter>();
private readonly List<BenchmarkLogicalGroupRule> logicalGroupRules = new List<BenchmarkLogicalGroupRule>();
private readonly List<IEventHandler> eventHandlers = new List<IEventHandler>();
private readonly List<IColumnHidingRule> columnHidingRules = new List<IColumnHidingRule>();

public IEnumerable<IColumnProvider> GetColumnProviders() => columnProviders;
Expand All @@ -45,6 +47,7 @@ public class ManualConfig : IConfig
public IEnumerable<HardwareCounter> GetHardwareCounters() => hardwareCounters;
public IEnumerable<IFilter> GetFilters() => filters;
public IEnumerable<BenchmarkLogicalGroupRule> GetLogicalGroupRules() => logicalGroupRules;
public IEnumerable<IEventHandler> GetEventHandlers() => eventHandlers;
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => columnHidingRules;

[PublicAPI] public ConfigOptions Options { get; set; }
Expand Down Expand Up @@ -221,6 +224,12 @@ public ManualConfig AddLogicalGroupRules(params BenchmarkLogicalGroupRule[] rule
return this;
}

public ManualConfig AddEventHandler(params IEventHandler[] eventHandlers)
{
this.eventHandlers.AddRange(eventHandlers);
return this;
}

[PublicAPI]
public ManualConfig HideColumns(params string[] columnNames)
{
Expand Down
79 changes: 79 additions & 0 deletions src/BenchmarkDotNet/EventHandlers/CompositeEventHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Toolchains.Results;
using BenchmarkDotNet.Validators;

namespace BenchmarkDotNet.EventHandlers
{
public class CompositeEventHandler : IEventHandler
{
private readonly IReadOnlyCollection<IEventHandler> eventHandlers;

public CompositeEventHandler(IReadOnlyCollection<IEventHandler> eventHandlers)
{
this.eventHandlers = eventHandlers;
}

public void HandleStartValidationStage()
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleStartValidationStage();
}

public void HandleUnsupportedBenchmark(BenchmarkCase benchmarkCase)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleUnsupportedBenchmark(benchmarkCase);
}

public void HandleValidationError(ValidationError validationError)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleValidationError(validationError);
}

public void HandleStartBuildStage()
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleStartBuildStage();
}

public void HandleBuildFailed(BenchmarkCase benchmarkCase, BuildResult buildResult)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleBuildFailed(benchmarkCase, buildResult);
}

public void HandleStartRunStage()
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleStartRunStage();
}

public void HandleRunBenchmarksInType(Type type, IReadOnlyList<BenchmarkCase> benchmarks)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleRunBenchmarksInType(type, benchmarks);
}

public void HandleCompletedBenchmarksInType(Type type, Summary summary)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleCompletedBenchmarksInType(type, summary);
}

public void HandleCompletedBenchmark(BenchmarkCase benchmarkCase, BenchmarkReport report)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleCompletedBenchmark(benchmarkCase, report);
}

public void HandleRunBenchmark(BenchmarkCase benchmarkCase)
{
foreach (var eventHandler in eventHandlers)
eventHandler.HandleRunBenchmark(benchmarkCase);
}
}
}
52 changes: 52 additions & 0 deletions src/BenchmarkDotNet/EventHandlers/EventHandlerBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Toolchains.Results;
using BenchmarkDotNet.Validators;

namespace BenchmarkDotNet.EventHandlers
{
public class EventHandlerBase : IEventHandler
{
public virtual void HandleBuildFailed(BenchmarkCase benchmarkCase, BuildResult buildResult)
{
}

public virtual void HandleCompletedBenchmark(BenchmarkCase benchmarkCase, BenchmarkReport report)
{
}

public virtual void HandleCompletedBenchmarksInType(Type type, Summary summary)
{
}

public virtual void HandleRunBenchmark(BenchmarkCase benchmarkCase)
{
}

public virtual void HandleRunBenchmarksInType(Type type, IReadOnlyList<BenchmarkCase> benchmarks)
{
}

public virtual void HandleStartBuildStage()
{
}

public virtual void HandleStartRunStage()
{
}

public virtual void HandleStartValidationStage()
{
}

public virtual void HandleUnsupportedBenchmark(BenchmarkCase benchmarkCase)
{
}

public virtual void HandleValidationError(ValidationError validationError)
{
}
}
}
23 changes: 23 additions & 0 deletions src/BenchmarkDotNet/EventHandlers/IEventHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Toolchains.Results;
using BenchmarkDotNet.Validators;

namespace BenchmarkDotNet.EventHandlers
{
public interface IEventHandler
{
void HandleStartValidationStage();
void HandleUnsupportedBenchmark(BenchmarkCase benchmarkCase);
void HandleValidationError(ValidationError validationError);
void HandleStartBuildStage();
void HandleBuildFailed(BenchmarkCase benchmarkCase, BuildResult buildResult);
void HandleStartRunStage();
void HandleRunBenchmarksInType(Type type, IReadOnlyList<BenchmarkCase> benchmarks);
void HandleCompletedBenchmarksInType(Type type, Summary summary);
void HandleRunBenchmark(BenchmarkCase benchmarkCase);
void HandleCompletedBenchmark(BenchmarkCase benchmarkCase, BenchmarkReport report);
}
}
Loading