Merge pull request #3831 from rolfbjarne/watchos-fix-defaultproxy-test
[mono.git] / mono / tests / test-runner.cs
index 4e2827424c8e620af0197eb22db1298ccf08a80d..53b4e9283575422f08b828cdd4a4cab271a91341 100644 (file)
@@ -11,7 +11,6 @@
 using System;
 using System.IO;
 using System.Threading;
-using System.Text;
 using System.Diagnostics;
 using System.Collections.Generic;
 using System.Globalization;
@@ -48,6 +47,7 @@ public class TestRunner
                int concurrency = 1;
                int timeout = 2 * 60; // in seconds
                int expectedExitCode = 0;
+               bool verbose = false;
                string testsuiteName = null;
                string inputFile = null;
 
@@ -160,6 +160,9 @@ public class TestRunner
                                        }
                                        aot_build_flags = args [i + 1].Substring(0, args [i + 1].Length);
                                        i += 2;
+                               } else if (args [i] == "--verbose") {
+                                       verbose = true;
+                                       i ++;
                                } else {
                                        Console.WriteLine ("Unknown command line option: '" + args [i] + "'.");
                                        return 1;
@@ -218,39 +221,68 @@ public class TestRunner
                                output_width = Math.Min (120, ti.test.Length);
                }
 
-               List<Thread> threads = new List<Thread> (concurrency);
+               if (aot_build_flags != null)  {
+                       Console.WriteLine("AOT compiling tests");
 
-               DateTime test_start_time = DateTime.UtcNow;
+                       object aot_monitor = new object ();
+                       var aot_queue = new Queue<String> (tests); 
 
-               if (aot_build_flags != null)  {
-                       var allTests = new StringBuilder();
-                       foreach (string test in tests) {
-                               allTests.Append(test);
-                               allTests.Append(" ");
-                       }
+                       List<Thread> build_threads = new List<Thread> (concurrency);
 
-                       string aot_args = aot_build_flags + " " + allTests.ToString();
+                       for (int j = 0; j < concurrency; ++j) {
+                               Thread thread = new Thread (() => {
+                                       while (true) {
+                                               String test_name;
 
-                       ProcessStartInfo job = new ProcessStartInfo (runtime, aot_args);
-                       job.UseShellExecute = false;
-                       job.EnvironmentVariables[ENV_TIMEOUT] = timeout.ToString();
-                       job.EnvironmentVariables[MONO_PATH] = mono_path;
-                       Process compiler = new Process ();
-                       compiler.StartInfo = job;
+                                               lock (aot_monitor) {
+                                                       if (aot_queue.Count == 0)
+                                                               break;
+                                                       test_name = aot_queue.Dequeue ();
+                                               }
 
-                       compiler.Start ();
+                                               string test_bitcode_output = test_name + "_bitcode_tmp";
+                                               string test_bitcode_arg = ",temp-path=" + test_bitcode_output;
+                                               string aot_args = aot_build_flags + test_bitcode_arg + " " + test_name;
+
+                                               Directory.CreateDirectory(test_bitcode_output);
+
+                                               ProcessStartInfo job = new ProcessStartInfo (runtime, aot_args);
+                                               job.UseShellExecute = false;
+                                               job.EnvironmentVariables[ENV_TIMEOUT] = timeout.ToString();
+                                               job.EnvironmentVariables[MONO_PATH] = mono_path;
+                                               Process compiler = new Process ();
+                                               compiler.StartInfo = job;
+
+                                               compiler.Start ();
+
+                                               if (!compiler.WaitForExit (timeout * 1000)) {
+                                                       try {
+                                                               compiler.Kill ();
+                                                       } catch {
+                                                       }
+                                                       throw new Exception(String.Format("Timeout AOT compiling tests, output in {0}", test_bitcode_output));
+                                               } else if (compiler.ExitCode != 0) {
+                                                       throw new Exception(String.Format("Error AOT compiling tests, output in {0}", test_bitcode_output));
+                                               } else {
+                                                       Directory.Delete (test_bitcode_output, true);
+                                               }
+                                       }
+                               });
 
-                       if (!compiler.WaitForExit (timeout * 1000)) {
-                               try {
-                                       compiler.Kill ();
-                               } catch {
-                               }
-                               throw new Exception(String.Format("Timeout AOT compiling tests"));
-                       } else if (compiler.ExitCode != 0) {
-                               throw new Exception(String.Format("Error AOT compiling tests"));
+                               thread.Start ();
+
+                               build_threads.Add (thread);
                        }
+
+                       for (int j = 0; j < build_threads.Count; ++j)
+                               build_threads [j].Join ();
+
+                       Console.WriteLine("Done compiling");
                }
 
+               List<Thread> threads = new List<Thread> (concurrency);
+
+               DateTime test_start_time = DateTime.UtcNow;
 
                for (int j = 0; j < concurrency; ++j) {
                        Thread thread = new Thread (() => {
@@ -268,7 +300,11 @@ public class TestRunner
                                        string test = ti.test;
                                        string opt_set = ti.opt_set;
 
-                                       output.Write (String.Format ("{{0,-{0}}} ", output_width), test);
+                                       if (verbose) {
+                                               output.Write (String.Format ("{{0,-{0}}} ", output_width), test);
+                                       } else {
+                                               Console.Write (".");
+                                       }
 
                                        string test_invoke;
 
@@ -342,7 +378,9 @@ public class TestRunner
                                                }
 #endif
 
-                                               output.Write ($"timed out ({timeout}s)");
+                                               if (verbose) {
+                                                       output.Write ($"timed out ({timeout}s)");
+                                               }
 
                                                try {
                                                        p.Kill ();
@@ -355,7 +393,8 @@ public class TestRunner
                                                        failed.Add (data);
                                                }
 
-                                               output.Write ("failed, time: {0}, exit code: {1}", (end - start).ToString (TEST_TIME_FORMAT), p.ExitCode);
+                                               if (verbose)
+                                                       output.Write ("failed, time: {0}, exit code: {1}", (end - start).ToString (TEST_TIME_FORMAT), p.ExitCode);
                                        } else {
                                                var end = DateTime.UtcNow;
 
@@ -363,13 +402,15 @@ public class TestRunner
                                                        passed.Add (data);
                                                }
 
-                                               output.Write ("passed, time: {0}", (end - start).ToString (TEST_TIME_FORMAT));
+                                               if (verbose)
+                                                       output.Write ("passed, time: {0}", (end - start).ToString (TEST_TIME_FORMAT));
                                        }
 
                                        p.Close ();
 
                                        lock (monitor) {
-                                               Console.WriteLine (output.ToString ());
+                                               if (verbose)
+                                                       Console.WriteLine (output.ToString ());
                                        }
                                }
                        });
@@ -391,7 +432,9 @@ public class TestRunner
                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings ();
                xmlWriterSettings.NewLineOnAttributes = true;
                xmlWriterSettings.Indent = true;
-               using (XmlWriter writer = XmlWriter.Create (String.Format ("TestResult-{0}.xml", testsuiteName), xmlWriterSettings)) {
+
+               string xmlPath = String.Format ("TestResult-{0}.xml", testsuiteName);
+               using (XmlWriter writer = XmlWriter.Create (xmlPath, xmlWriterSettings)) {
                        // <?xml version="1.0" encoding="utf-8" standalone="no"?>
                        writer.WriteStartDocument ();
                        // <!--This file represents the results of running a test suite-->
@@ -508,14 +551,29 @@ public class TestRunner
                        // </test-results>
                        writer.WriteEndElement ();
                        writer.WriteEndDocument ();
+
+                       string babysitterXmlList = Environment.GetEnvironmentVariable("MONO_BABYSITTER_NUNIT_XML_LIST_FILE");
+                       if (!String.IsNullOrEmpty(babysitterXmlList)) {
+                               try {
+                                       string fullXmlPath = Path.GetFullPath(xmlPath);
+                                       File.AppendAllText(babysitterXmlList, fullXmlPath + Environment.NewLine);
+                               } catch (Exception e) {
+                                       Console.WriteLine("Attempted to record XML path to file {0} but failed.", babysitterXmlList);
+                               }
+                       }
                }
 
-               Console.WriteLine ();
-               Console.WriteLine ("Time: {0}", test_time.ToString (TEST_TIME_FORMAT));
-               Console.WriteLine ();
-               Console.WriteLine ("{0,4} test(s) passed", npassed);
-               Console.WriteLine ("{0,4} test(s) failed", nfailed);
-               Console.WriteLine ("{0,4} test(s) timed out", ntimedout);
+               if (verbose) {
+                       Console.WriteLine ();
+                       Console.WriteLine ("Time: {0}", test_time.ToString (TEST_TIME_FORMAT));
+                       Console.WriteLine ();
+                       Console.WriteLine ("{0,4} test(s) passed", npassed);
+                       Console.WriteLine ("{0,4} test(s) failed", nfailed);
+                       Console.WriteLine ("{0,4} test(s) timed out", ntimedout);
+               } else {
+                       Console.WriteLine ();
+                       Console.WriteLine (String.Format ("{0} test(s) passed, {1} test(s) did not pass.", npassed, nfailed));
+               }
 
                if (nfailed > 0) {
                        Console.WriteLine ();