Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 30 additions & 17 deletions tests/BenchmarkDotNet.IntegrationTests/DisassemblyDiagnoserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,16 +94,20 @@ public void CanDisassembleAllMethodCalls(Jit jit, Platform platform, Runtime run
{
if (OsDetector.IsMacOS()) return; // currently not supported

var printSource = IsPrintSourceSupported(platform);
var disassemblyDiagnoser = new DisassemblyDiagnoser(
new DisassemblyDiagnoserConfig(printSource: true, maxDepth: 3));
new DisassemblyDiagnoserConfig(printSource: printSource, maxDepth: 3));

CanExecute<WithCalls>(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.ColdStart));

AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Benchmark)}(Int32)");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Benchmark)}(Boolean)");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Static)}()");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Instance)}()");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Recursive)}()");
DisassemblyResult result = disassemblyDiagnoser.Results.Single().Value;

Assert.Empty(result.Errors);
AssertDisassemblyResult(result, $"{nameof(WithCalls.Benchmark)}(Int32)");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Benchmark)}(Boolean)");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Static)}()");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Instance)}()");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Recursive)}()");
}

[Theory]
Expand All @@ -113,16 +117,20 @@ public void CanDisassembleAllMethodCallsUsingFilters(Jit jit, Platform platform,
{
if (OsDetector.IsMacOS()) return; // currently not supported

var printSource = IsPrintSourceSupported(platform);
var disassemblyDiagnoser = new DisassemblyDiagnoser(
new DisassemblyDiagnoserConfig(printSource: true, maxDepth: 1, filters: new[] { "*WithCalls*" }));
new DisassemblyDiagnoserConfig(printSource: printSource, maxDepth: 1, filters: new[] { "*WithCalls*" }));

CanExecute<WithCalls>(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.ColdStart));

AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Benchmark)}(Int32)");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Benchmark)}(Boolean)");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Static)}()");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Instance)}()");
AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Recursive)}()");
DisassemblyResult result = disassemblyDiagnoser.Results.Single().Value;

Assert.Empty(result.Errors);
AssertDisassemblyResult(result, $"{nameof(WithCalls.Benchmark)}(Int32)");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Benchmark)}(Boolean)");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Static)}()");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Instance)}()");
AssertDisassemblyResult(result, $"{nameof(WithCalls.Recursive)}()");
}

public class Generic<T> where T : new()
Expand All @@ -138,13 +146,15 @@ public void CanDisassembleGenericTypes(Jit jit, Platform platform, Runtime runti
{
if (OsDetector.IsMacOS()) return; // currently not supported

var printSource = IsPrintSourceSupported(platform);
var disassemblyDiagnoser = new DisassemblyDiagnoser(
new DisassemblyDiagnoserConfig(printSource: true, maxDepth: 3));
new DisassemblyDiagnoserConfig(printSource: printSource, maxDepth: 3));

CanExecute<Generic<int>>(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.Monitoring));

var result = disassemblyDiagnoser.Results.Values.Single();

Assert.Empty(result.Errors);
Assert.Contains(result.Methods, method => method.Maps.Any(map => map.SourceCodes.OfType<Asm>().Any()));
}

Expand All @@ -160,13 +170,15 @@ public void CanDisassembleInlinableBenchmarks(Jit jit, Platform platform, Runtim
{
if (OsDetector.IsMacOS()) return; // currently not supported

var printSource = IsPrintSourceSupported(platform);
var disassemblyDiagnoser = new DisassemblyDiagnoser(
new DisassemblyDiagnoserConfig(printSource: true, maxDepth: 3));
new DisassemblyDiagnoserConfig(printSource: printSource, maxDepth: 3));

CanExecute<WithInlineable>(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.Monitoring));

var disassemblyResult = disassemblyDiagnoser.Results.Values.Single(result => result.Methods.Count(method => method.Name.Contains(nameof(WithInlineable.JustReturn))) == 1);

Assert.Empty(disassemblyResult.Errors);
Assert.Contains(disassemblyResult.Methods, method => method.Maps.Any(map => map.SourceCodes.OfType<Asm>().All(asm => asm.ToString().Contains("ret"))));
}

Expand All @@ -181,12 +193,13 @@ private IConfig CreateConfig(Jit jit, Platform platform, Runtime runtime, IDiagn
.AddDiagnoser(disassemblyDiagnoser)
.AddLogger(new OutputLogger(Output));

private void AssertDisassembled(DisassemblyDiagnoser diagnoser, string methodSignature)
private void AssertDisassemblyResult(DisassemblyResult result, string methodSignature)
{
DisassemblyResult result = diagnoser.Results.Single().Value;

Assert.Contains(methodSignature, result.Methods.Select(m => m.Name.Split('.').Last()).ToArray());
Assert.Contains(result.Methods.Single(m => m.Name.EndsWith(methodSignature)).Maps, map => map.SourceCodes.Any());
}

private static bool IsPrintSourceSupported(Platform platform)
=> platform != Platform.X86; // Workaround for https://github.com/dotnet/BenchmarkDotNet/issues/2789
}
}