Skip to content

Commit be0ea1e

Browse files
authored
Add Job info to DisassemblyDiagnoser report headers (#2884)
* "Fix unhandled exception when running invalid type-based benchmark with arguments Fixes #2724 When running BenchmarkRunner.Run<T>() or BenchmarkRunner.Run(Type) with arguments on an invalid benchmark type (no [Benchmark] methods), the runner threw an unhandled InvalidOperationException instead of returning a validation error. Changes: - Replace .Single() with .SingleOrDefault() in RunWithDirtyAssemblyResolveHelper - Return Summary.ValidationFailed when no benchmarks are found - Enable and update tests for args scenarios in RunningEmptyBenchmarkTests.cs" * Fix StyleCop SA1028: Remove trailing whitespace * "Add assertion for failure in test per maintainer feedback" * "Add Job info to DisassemblyDiagnoser report headers Fixes #2573 When using multiple coreruns, the disassembly report headers were identical, making it impossible to distinguish which assembly belongs to which corerun. Changes: - Add Job DisplayInfo to markdown header: ## {RuntimeInfo} (Job: {JobDisplayInfo}) - Add Job info as <h3> in HTML exporter - Add Job info to diff exporter comparison output - Add tests verifying Job info is included in headers"
1 parent dde78c5 commit be0ea1e

File tree

4 files changed

+70
-2
lines changed

4 files changed

+70
-2
lines changed

src/BenchmarkDotNet/Disassemblers/Exporters/GithubMarkdownDiffDisassemblyExporter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ private string SaveDisassemblyResult(Summary summary, DisassemblyResult disassem
9090
return filePath;
9191
}
9292

93-
private static string GetImportantInfo(BenchmarkReport benchmarkReport) => benchmarkReport.GetRuntimeInfo();
93+
private static string GetImportantInfo(BenchmarkReport benchmarkReport) =>
94+
$"{benchmarkReport.GetRuntimeInfo()} (Job: {benchmarkReport.BenchmarkCase.Job.DisplayInfo})";
9495

9596
private static void RunGitDiff(string firstFile, string secondFile, StringBuilder result)
9697
{

src/BenchmarkDotNet/Disassemblers/Exporters/GithubMarkdownDisassemblyExporter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public override void ExportToLog(Summary summary, ILogger logger)
2626
{
2727
foreach (var benchmarkCase in summary.BenchmarksCases.Where(results.ContainsKey))
2828
{
29-
logger.WriteLine($"## {summary[benchmarkCase].GetRuntimeInfo()}");
29+
logger.WriteLine($"## {summary[benchmarkCase].GetRuntimeInfo()} (Job: {benchmarkCase.Job.DisplayInfo})");
30+
logger.WriteLine();
3031

3132
Export(logger, results[benchmarkCase], config);
3233
}

src/BenchmarkDotNet/Disassemblers/Exporters/HtmlDisassemblyExporter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public override void ExportToLog(Summary summary, ILogger logger)
5252
private void Export(ILogger logger, Summary summary, DisassemblyResult disassemblyResult, BenchmarkCase benchmarkCase, ref int referenceIndex)
5353
{
5454
logger.WriteLine($"<h2>{summary[benchmarkCase].GetRuntimeInfo()}</h2>");
55+
logger.WriteLine($"<h3>Job: {benchmarkCase.Job.DisplayInfo}</h3>");
5556
logger.WriteLine("<table><tbody>");
5657

5758
int methodIndex = 0;
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System.Collections.Immutable;
2+
using System.Linq;
3+
using BenchmarkDotNet.Configs;
4+
using BenchmarkDotNet.Diagnosers;
5+
using BenchmarkDotNet.Disassemblers;
6+
using BenchmarkDotNet.Disassemblers.Exporters;
7+
using BenchmarkDotNet.Loggers;
8+
using BenchmarkDotNet.Tests.Mocks;
9+
using Xunit;
10+
11+
namespace BenchmarkDotNet.Tests.Disassemblers
12+
{
13+
public class GithubMarkdownDisassemblyExporterMultiCorerunTest
14+
{
15+
#region ExportToLog Tests
16+
17+
/// <summary>
18+
/// Tests that GithubMarkdownDisassemblyExporter includes Job info in headers.
19+
/// </summary>
20+
[Fact]
21+
public void ExportToLog_IncludesJobInfoInHeader()
22+
{
23+
// Arrange
24+
var logger = new AccumulationLogger();
25+
var config = new DisassemblyDiagnoserConfig();
26+
var summary = MockFactory.CreateSummary(typeof(MockFactory.MockBenchmarkClass));
27+
var results = summary.BenchmarksCases.ToImmutableDictionary(
28+
bc => bc,
29+
bc => new DisassemblyResult { Methods = new DisassembledMethod[0], Errors = new string[0] });
30+
var exporter = new GithubMarkdownDisassemblyExporter(results, config);
31+
32+
// Act
33+
exporter.ExportToLog(summary, logger);
34+
35+
// Assert
36+
var output = logger.GetLog();
37+
Assert.Contains("(Job:", output);
38+
}
39+
40+
[Fact]
41+
public void ExportToLog_FormatsHeaderWithJobDisplayInfo()
42+
{
43+
// Arrange
44+
var logger = new AccumulationLogger();
45+
var config = new DisassemblyDiagnoserConfig();
46+
var summary = MockFactory.CreateSummary(typeof(MockFactory.MockBenchmarkClass));
47+
var results = summary.BenchmarksCases.ToImmutableDictionary(
48+
bc => bc,
49+
bc => new DisassemblyResult { Methods = new DisassembledMethod[0], Errors = new string[0] });
50+
var exporter = new GithubMarkdownDisassemblyExporter(results, config);
51+
52+
// Act
53+
exporter.ExportToLog(summary, logger);
54+
55+
// Assert
56+
var output = logger.GetLog();
57+
var lines = output.Split('\n');
58+
var headers = lines.Where(line => line.StartsWith("##")).ToArray();
59+
Assert.NotEmpty(headers);
60+
Assert.All(headers, header => Assert.Contains("(Job:", header));
61+
}
62+
63+
#endregion
64+
}
65+
}

0 commit comments

Comments
 (0)