Skip to content

Commit

Permalink
don't redirect standard input and don't write Acknowledgment to it if…
Browse files Browse the repository at this point in the history
… acknowledgments are not needed (#1958)
  • Loading branch information
adamsitnik authored Mar 21, 2022
1 parent 6fa3339 commit 010ac21
Show file tree
Hide file tree
Showing 16 changed files with 37 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ internal class SynchronousProcessOutputLoggerWithDiagnoser
private readonly IDiagnoser diagnoser;
private readonly DiagnoserActionParameters diagnoserActionParameters;

public SynchronousProcessOutputLoggerWithDiagnoser(ILogger logger, Process process, IDiagnoser diagnoser, BenchmarkCase benchmarkCase, BenchmarkId benchmarkId)
public SynchronousProcessOutputLoggerWithDiagnoser(ILogger logger, Process process, IDiagnoser diagnoser,
BenchmarkCase benchmarkCase, BenchmarkId benchmarkId, bool noAcknowledgments)
{
if (!process.StartInfo.RedirectStandardOutput)
throw new NotSupportedException("set RedirectStandardOutput to true first");
if (!(process.StartInfo.RedirectStandardInput || benchmarkCase.GetRuntime() is WasmRuntime))
if (!(process.StartInfo.RedirectStandardInput || benchmarkCase.GetRuntime() is WasmRuntime || noAcknowledgments))
throw new NotSupportedException("set RedirectStandardInput to true first");

this.logger = logger;
Expand Down
10 changes: 6 additions & 4 deletions src/BenchmarkDotNet/Toolchains/DotNetCli/DotNetCliExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public ExecuteResult Execute(ExecuteParameters executeParameters)
executeParameters.Diagnoser,
Path.GetFileName(executeParameters.BuildResult.ArtifactsPaths.ExecutablePath),
executeParameters.Resolver,
executeParameters.LaunchIndex);
executeParameters.LaunchIndex,
executeParameters.BuildResult.NoAcknowledgments);
}
finally
{
Expand All @@ -60,21 +61,22 @@ private ExecuteResult Execute(BenchmarkCase benchmarkCase,
IDiagnoser diagnoser,
string executableName,
IResolver resolver,
int launchIndex)
int launchIndex,
bool noAcknowledgments)
{
var startInfo = DotNetCliCommandExecutor.BuildStartInfo(
CustomDotNetCliPath,
artifactsPaths.BinariesDirectoryPath,
$"{executableName.Escape()} {benchmarkId.ToArguments()}",
redirectStandardInput: true,
redirectStandardInput: !noAcknowledgments,
redirectStandardError: false); // #1629

startInfo.SetEnvironmentVariables(benchmarkCase, resolver);

using (var process = new Process { StartInfo = startInfo })
using (var consoleExitHandler = new ConsoleExitHandler(process, logger))
{
var loggerWithDiagnoser = new SynchronousProcessOutputLoggerWithDiagnoser(logger, process, diagnoser, benchmarkCase, benchmarkId);
var loggerWithDiagnoser = new SynchronousProcessOutputLoggerWithDiagnoser(logger, process, diagnoser, benchmarkCase, benchmarkId, noAcknowledgments);

logger.WriteLineInfo($"// Execute: {process.StartInfo.FileName} {process.StartInfo.Arguments} in {process.StartInfo.WorkingDirectory}");

Expand Down
13 changes: 7 additions & 6 deletions src/BenchmarkDotNet/Toolchains/Executor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,18 @@ public ExecuteResult Execute(ExecuteParameters executeParameters)
}

return Execute(executeParameters.BenchmarkCase, executeParameters.BenchmarkId, executeParameters.Logger, executeParameters.BuildResult.ArtifactsPaths,
args, executeParameters.Diagnoser, executeParameters.Resolver, executeParameters.LaunchIndex);
args, executeParameters.Diagnoser, executeParameters.Resolver, executeParameters.LaunchIndex, executeParameters.BuildResult.NoAcknowledgments);
}

private ExecuteResult Execute(BenchmarkCase benchmarkCase, BenchmarkId benchmarkId, ILogger logger, ArtifactsPaths artifactsPaths,
string args, IDiagnoser diagnoser, IResolver resolver, int launchIndex)
string args, IDiagnoser diagnoser, IResolver resolver, int launchIndex, bool noAcknowledgments)
{
try
{
using (var process = new Process { StartInfo = CreateStartInfo(benchmarkCase, artifactsPaths, args, resolver) })
using (var process = new Process { StartInfo = CreateStartInfo(benchmarkCase, artifactsPaths, args, resolver, noAcknowledgments) })
using (var consoleExitHandler = new ConsoleExitHandler(process, logger))
{
var loggerWithDiagnoser = new SynchronousProcessOutputLoggerWithDiagnoser(logger, process, diagnoser, benchmarkCase, benchmarkId);
var loggerWithDiagnoser = new SynchronousProcessOutputLoggerWithDiagnoser(logger, process, diagnoser, benchmarkCase, benchmarkId, noAcknowledgments);

diagnoser?.Handle(HostSignal.BeforeProcessStart, new DiagnoserActionParameters(process, benchmarkCase, benchmarkId));

Expand Down Expand Up @@ -89,13 +89,14 @@ private ExecuteResult Execute(Process process, BenchmarkCase benchmarkCase, Sync
launchIndex);
}

private ProcessStartInfo CreateStartInfo(BenchmarkCase benchmarkCase, ArtifactsPaths artifactsPaths, string args, IResolver resolver)
private ProcessStartInfo CreateStartInfo(BenchmarkCase benchmarkCase, ArtifactsPaths artifactsPaths,
string args, IResolver resolver, bool noAcknowledgments)
{
var start = new ProcessStartInfo
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardInput = !noAcknowledgments,
RedirectStandardError = false, // #1629
CreateNoWindow = true,
StandardOutputEncoding = Encoding.UTF8, // #1713
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Toolchains/GeneratorBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public GenerateResult GenerateProject(BuildPartition buildPartition, ILogger log
GenerateProject(buildPartition, artifactsPaths, logger);
GenerateBuildScript(buildPartition, artifactsPaths);

return GenerateResult.Success(artifactsPaths, GetArtifactsToCleanup(artifactsPaths));
return GenerateResult.Success(artifactsPaths, GetArtifactsToCleanup(artifactsPaths), buildPartition.NoAcknowledgments);
}
catch (Exception ex)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public BuildResult Build(GenerateResult generateResult, BuildPartition buildPart
return BuildResult.Success(
GenerateResult.Success(
new InProcessEmitArtifactsPath(assembly, generateResult.ArtifactsPaths),
generateResult.ArtifactsToCleanup));
generateResult.ArtifactsToCleanup,
generateResult.NoAcknowledgments));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public GenerateResult GenerateProject(
{
artifactsPaths = GetArtifactsPaths(buildPartition, rootArtifactsFolderPath);

return GenerateResult.Success(artifactsPaths, new List<string>());
return GenerateResult.Success(artifactsPaths, new List<string>(), buildPartition.NoAcknowledgments);
}
catch (Exception ex)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public class InProcessNoEmitGenerator : IGenerator
{
/// <summary>returns a success</summary>
public GenerateResult GenerateProject(BuildPartition buildPartition, ILogger logger, string rootArtifactsFolderPath)
=> GenerateResult.Success(null, Array.Empty<string>());
=> GenerateResult.Success(null, Array.Empty<string>(), buildPartition.NoAcknowledgments);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public class InProcessGenerator : IGenerator
{
/// <summary>returns a success</summary>
public GenerateResult GenerateProject(BuildPartition buildPartition, ILogger logger, string rootArtifactsFolderPath)
=> GenerateResult.Success(null, Array.Empty<string>());
=> GenerateResult.Success(null, Array.Empty<string>(), buildPartition.NoAcknowledgments);
}
}
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Toolchains/Results/BuildResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class BuildResult : GenerateResult
public string ErrorMessage { get; }

private BuildResult(GenerateResult generateResult, bool isBuildSuccess, string errorMessage)
: base(generateResult.ArtifactsPaths, generateResult.IsGenerateSuccess, generateResult.GenerateException, generateResult.ArtifactsToCleanup)
: base(generateResult.ArtifactsPaths, generateResult.IsGenerateSuccess, generateResult.GenerateException, generateResult.ArtifactsToCleanup, generateResult.NoAcknowledgments)
{
IsBuildSuccess = isBuildSuccess;
ErrorMessage = errorMessage;
Expand Down
11 changes: 7 additions & 4 deletions src/BenchmarkDotNet/Toolchains/Results/GenerateResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,23 @@ public class GenerateResult
public bool IsGenerateSuccess { get; }
public Exception GenerateException { get; }
public IReadOnlyCollection<string> ArtifactsToCleanup { get; }
public bool NoAcknowledgments { get; }

public GenerateResult(ArtifactsPaths artifactsPaths, bool isGenerateSuccess, Exception generateException, IReadOnlyCollection<string> artifactsToCleanup)
public GenerateResult(ArtifactsPaths artifactsPaths, bool isGenerateSuccess, Exception generateException,
IReadOnlyCollection<string> artifactsToCleanup, bool noAcknowledgments)
{
ArtifactsPaths = artifactsPaths;
IsGenerateSuccess = isGenerateSuccess;
GenerateException = generateException;
ArtifactsToCleanup = artifactsToCleanup;
NoAcknowledgments = noAcknowledgments;
}

public static GenerateResult Success(ArtifactsPaths artifactsPaths, IReadOnlyCollection<string> artifactsToCleanup)
=> new GenerateResult(artifactsPaths, true, null, artifactsToCleanup);
public static GenerateResult Success(ArtifactsPaths artifactsPaths, IReadOnlyCollection<string> artifactsToCleanup, bool noAcknowledgments)
=> new GenerateResult(artifactsPaths, true, null, artifactsToCleanup, noAcknowledgments);

public static GenerateResult Failure(ArtifactsPaths artifactsPaths, IReadOnlyCollection<string> artifactsToCleanup, Exception exception = null)
=> new GenerateResult(artifactsPaths, false, exception, artifactsToCleanup);
=> new GenerateResult(artifactsPaths, false, exception, artifactsToCleanup, false);

public override string ToString() => "GenerateResult: " + (IsGenerateSuccess ? "Success" : "Fail");
}
Expand Down
2 changes: 1 addition & 1 deletion tests/BenchmarkDotNet.IntegrationTests/ToolchainTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public GenerateResult GenerateProject(BuildPartition buildPartition, ILogger log
{
logger.WriteLine("Generating");
Done = true;
return new GenerateResult(null, true, null, Array.Empty<string>());
return new GenerateResult(null, true, null, Array.Empty<string>(), false);
}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/BenchmarkDotNet.Tests/BuildResultTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public void UnknownMSBuildErrorsAreNotTranslatedToMoreUserFriendlyVersions()
[AssertionMethod]
private void Verify(string msbuildError, bool expectedResult, string expectedReason)
{
var sut = BuildResult.Failure(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>()), msbuildError);
var sut = BuildResult.Failure(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>(), false), msbuildError);

Assert.Equal(expectedResult, sut.TryToExplainFailureReason(out string reason));
Assert.Equal(expectedReason, reason);
Expand Down
4 changes: 2 additions & 2 deletions tests/BenchmarkDotNet.Tests/Mocks/MockFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ private static BenchmarkCase[] CreateBenchmarks<TBenchmarks>(IConfig config)

private static BenchmarkReport CreateReport(BenchmarkCase benchmarkCase, int n, double nanoseconds)
{
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>()));
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>(), false));
var measurements = Enumerable.Range(0, n)
.Select(index => new Measurement(1, IterationMode.Workload, IterationStage.Result, index + 1, 1, nanoseconds + index).ToString())
.ToList();
Expand All @@ -73,7 +73,7 @@ private static BenchmarkReport CreateReport(BenchmarkCase benchmarkCase, int n,

private static BenchmarkReport CreateReport(BenchmarkCase benchmarkCase, bool hugeSd, Metric[] metrics)
{
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>()));
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>(), false));
bool isFoo = benchmarkCase.Descriptor.WorkloadMethodDisplayInfo == "Foo";
bool isBar = benchmarkCase.Descriptor.WorkloadMethodDisplayInfo == "Bar";
var measurements = new List<Measurement>
Expand Down
2 changes: 1 addition & 1 deletion tests/BenchmarkDotNet.Tests/Reports/RatioPrecisionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ private Summary CreateSummary(int[] values)

private static BenchmarkReport CreateReport(BenchmarkCase benchmarkCase, int measurementValue)
{
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>()));
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>(), false));
var measurements = new List<Measurement>
{
new Measurement(1, IterationMode.Workload, IterationStage.Result, 1, 1, measurementValue),
Expand Down
2 changes: 1 addition & 1 deletion tests/BenchmarkDotNet.Tests/Reports/RatioStyleTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ private Summary CreateSummary(int[] values, RatioStyle ratioStyle, int noise)

private static BenchmarkReport CreateReport(BenchmarkCase benchmarkCase, int measurementValue, int noise)
{
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>()));
var buildResult = BuildResult.Success(GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>(), false));
var measurements = new List<Measurement>
{
new Measurement(1, IterationMode.Workload, IterationStage.Result, 1, 1, measurementValue),
Expand Down
2 changes: 1 addition & 1 deletion tests/BenchmarkDotNet.Tests/Reports/SummaryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private static BenchmarkReport CreateFailureReport(BenchmarkCase benchmark)

private static BenchmarkReport CreateSuccessReport(BenchmarkCase benchmark)
{
GenerateResult generateResult = GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>());
GenerateResult generateResult = GenerateResult.Success(ArtifactsPaths.Empty, Array.Empty<string>(), false);
BuildResult buildResult = BuildResult.Success(generateResult);
var metrics = new[] { new Metric(new FakeMetricDescriptor(), Math.E) };
return new BenchmarkReport(true, benchmark, generateResult, buildResult, Array.Empty<ExecuteResult>(), metrics);
Expand Down

0 comments on commit 010ac21

Please sign in to comment.