Fix JitBench (#19584)
[platform/upstream/coreclr.git] / tests / src / performance / Scenario / JitBench / Benchmarks / EmptyConsoleProgramExecution.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Runtime.InteropServices;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace JitBench
9 {
10     sealed class EmptyConsoleProgramExecution : Benchmark
11     {
12         private const string ExecutableName = "console.dll";
13
14         public EmptyConsoleProgramExecution() : base("Empty Console Program")
15         {
16             ExePath = ExecutableName;
17         }
18
19         public override async Task Setup(DotNetInstallation dotNetInstall, string outputDir, bool useExistingSetup, ITestOutputHelper output)
20         {
21             if (!useExistingSetup)
22             {
23                 using (var setupSection = new IndentedTestOutputHelper("Setup " + Name, output))
24                 {
25                     await SetupSourceToCompile(outputDir, dotNetInstall.FrameworkDir, useExistingSetup, setupSection);
26                     RetargetProjects(dotNetInstall, GetRootDir(outputDir), new string[] { "console.csproj" });
27                     await Publish(dotNetInstall, outputDir, setupSection);
28                 }
29             }
30
31             string tfm = DotNetSetup.GetTargetFrameworkMonikerForFrameworkVersion(dotNetInstall.FrameworkVersion);
32             WorkingDirPath = GetAppPublishDirectory(dotNetInstall, outputDir, tfm);
33             EnvironmentVariables.Add("DOTNET_MULTILEVEL_LOOKUP", "0");
34             EnvironmentVariables.Add("UseSharedCompilation", "false");
35         }
36
37 #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
38         private async Task SetupSourceToCompile(string intermediateOutputDir, string runtimeDirPath, bool useExistingSetup, ITestOutputHelper output)
39 #pragma warning restore CS1998
40         {
41             const string sourceFile = "Program.cs";
42             const string csprojFile = "console.csproj";
43
44             string consoleProjectMainDir = GetRootDir(intermediateOutputDir);
45             FileTasks.DeleteDirectory(consoleProjectMainDir, output);
46             FileTasks.CreateDirectory(consoleProjectMainDir, output);
47
48             File.WriteAllLines(Path.Combine(consoleProjectMainDir, sourceFile), new[] {
49                 "using System;",
50                 "public static class Program",
51                 "{",
52                 "    public static int Main(string[] args) => 0;",
53                 "}"
54             });
55
56             File.WriteAllLines(Path.Combine(consoleProjectMainDir, csprojFile), new[] {
57                 @"<Project Sdk=""Microsoft.NET.Sdk"">",
58                 @"  <PropertyGroup>",
59                 @"    <OutputType>Exe</OutputType>",
60                 @"    <TargetFramework>netcoreapp2.1</TargetFramework>",
61                 @"  </PropertyGroup>",
62                 @"</Project>",
63             });
64         }
65
66         private async Task<string> Publish(DotNetInstallation dotNetInstall, string outputDir, ITestOutputHelper output)
67         {
68             string tfm = DotNetSetup.GetTargetFrameworkMonikerForFrameworkVersion(dotNetInstall.FrameworkVersion);
69             string publishDir = GetAppPublishDirectory(dotNetInstall, outputDir, tfm);
70             if (publishDir != null)
71                 FileTasks.DeleteDirectory(publishDir, output);
72
73             string dotNetExePath = dotNetInstall.DotNetExe;
74             await new ProcessRunner(dotNetExePath, $"publish -c Release -f {tfm}")
75                 .WithWorkingDirectory(GetAppSrcDirectory(outputDir))
76                 .WithEnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "0")
77                 .WithEnvironmentVariable("UseSharedCompilation", "false")
78                 .WithLog(output)
79                 .Run();
80
81             publishDir = GetAppPublishDirectory(dotNetInstall, outputDir, tfm);
82             if (publishDir == null)
83                 throw new DirectoryNotFoundException("Could not find 'publish' directory");
84             return publishDir;
85         }
86
87         private string GetAppPublishDirectory(DotNetInstallation dotNetInstall, string outputDir, string tfm)
88         {
89             string dir = Path.Combine(GetAppSrcDirectory(outputDir), "bin", dotNetInstall.Architecture, "Release", tfm, "publish");
90             if (Directory.Exists(dir))
91                 return dir;
92
93             dir = Path.Combine(GetAppSrcDirectory(outputDir), "bin", "Release", tfm, "publish");
94             if (Directory.Exists(dir))
95                 return dir;
96
97             return null;
98         }
99
100         private static string GetAppSrcDirectory(string outputDir) =>
101             Path.Combine(GetRootDir(outputDir));
102
103         private static string GetRootDir(string outputDir) =>
104             Path.Combine(outputDir, "EmptyDotNetConsoleProject");
105     }
106 }