From: Andrew Au Date: Sat, 7 Nov 2020 01:41:16 +0000 (-0800) Subject: Bootstrapping a test for R2RDump (#42150) X-Git-Tag: submit/tizen/20210909.063632~4723 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a057f27e860c1a59aa12e7dd9be028fba82b037f;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Bootstrapping a test for R2RDump (#42150) --- diff --git a/src/tests/Common/Directory.Build.targets b/src/tests/Common/Directory.Build.targets index 93e0f2e..cf31232 100644 --- a/src/tests/Common/Directory.Build.targets +++ b/src/tests/Common/Directory.Build.targets @@ -56,6 +56,9 @@ + + + diff --git a/src/tests/issues.targets b/src/tests/issues.targets index 2a8fe8f..91baede 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -1556,6 +1556,9 @@ needs triage + + These tests are not supposed to be run with mono. + needs triage diff --git a/src/tests/r2rdump/R2RDumpTester.cs b/src/tests/r2rdump/R2RDumpTester.cs new file mode 100644 index 0000000..2d813eb --- /dev/null +++ b/src/tests/r2rdump/R2RDumpTester.cs @@ -0,0 +1,80 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using Xunit; + +namespace R2RDumpTests +{ + public class R2RDumpTester : XunitBase + { + private const string CoreRoot = "CORE_ROOT"; + private const string R2RDumpRelativePath = "R2RDump"; + private const string R2RDumpFile = "R2RDump.dll"; + private const string CoreRunFileName = "corerun"; + + public static string FindExePath(string exe) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + exe = exe + ".exe"; + } + exe = Environment.ExpandEnvironmentVariables(exe); + if (!File.Exists(exe)) + { + if (Path.GetDirectoryName(exe) == String.Empty) + { + foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(Path.PathSeparator)) + { + string path = test.Trim(); + if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exe))) + return Path.GetFullPath(path); + } + } + throw new FileNotFoundException(new FileNotFoundException().Message, exe); + } + return Path.GetFullPath(exe); + } + + [Fact] + public void DumpCoreLib() + { + string CoreRootVar = Environment.GetEnvironmentVariable(CoreRoot); + bool IsUnix = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + string R2RDumpAbsolutePath = Path.Combine(CoreRootVar, R2RDumpRelativePath, R2RDumpFile); + string CoreLibFile = "System.Private.CoreLib.dll"; + string CoreLibAbsolutePath = Path.Combine(CoreRootVar, CoreLibFile); + string OutputFile = Path.GetTempFileName(); + string TestDotNetCmdVar = Environment.GetEnvironmentVariable("__TestDotNetCmd"); + string DotNetAbsolutePath = string.IsNullOrEmpty(TestDotNetCmdVar) ? FindExePath("dotnet") : TestDotNetCmdVar; + + ProcessStartInfo processStartInfo = new ProcessStartInfo + { + UseShellExecute = false, + FileName = DotNetAbsolutePath, + // TODO, what flags do we like to test? + Arguments = string.Join(" ", new string[]{"exec", R2RDumpAbsolutePath, "--in", CoreLibAbsolutePath, "--out", OutputFile}) + }; + + Process process = Process.Start(processStartInfo); + process.WaitForExit(); + int exitCode = process.ExitCode; + string outputContent = File.ReadAllText(OutputFile); + File.Delete(OutputFile); + // TODO, here is a point where we can add more validation to outputs + // An uncaught exception (such as signature decoding error, would be caught by the error code) + bool failed = exitCode != 0; + if (failed) + { + Console.WriteLine("The process terminated with exit code {0}", exitCode); + Console.WriteLine(outputContent); + Assert.True(!failed); + } + } + + public static int Main(string[] args) + { + return new R2RDumpTester().RunTests(); + } + } +} \ No newline at end of file diff --git a/src/tests/r2rdump/R2RDumpTests.csproj b/src/tests/r2rdump/R2RDumpTests.csproj new file mode 100644 index 0000000..a60d535 --- /dev/null +++ b/src/tests/r2rdump/R2RDumpTests.csproj @@ -0,0 +1,19 @@ + + + Exe + true + true + + + + + + + + + + + + + +