Merge branch 'master' of github.com:mono/mono
[mono.git] / mcs / class / System / Test / System.Diagnostics / ProcessTest.cs
index f4c28f0e428da356909c3b6d69873ab1627d8748..7c70b5d6cb119bc848d978a674b78314e8c36693 100644 (file)
@@ -9,9 +9,11 @@
 // 
 
 using System;
+using System.ComponentModel;
 using System.Diagnostics;
 using System.IO;
 using System.Text;
+using System.Threading;
 
 using NUnit.Framework;
 
@@ -51,7 +53,628 @@ namespace MonoTests.System.Diagnostics
                }
 
                [Test]
-               [Category ("NotDotNet")]
+               public void PriorityClass_NotStarted ()
+               {
+                       Process process = new Process ();
+                       try {
+                               process.PriorityClass = ProcessPriorityClass.Normal;
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException ex) {
+                               // No process is associated with this object
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                       }
+
+                       try {
+                               Assert.Fail ("#B1:" + process.PriorityClass);
+                       } catch (InvalidOperationException ex) {
+                               // No process is associated with this object
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                       }
+               }
+
+               [Test]
+               public void PriorityClass_Invalid ()
+               {
+                       Process process = new Process ();
+                       try {
+                               process.PriorityClass = (ProcessPriorityClass) 666;
+                               Assert.Fail ("#1");
+                       } catch (InvalidEnumArgumentException ex) {
+                               Assert.AreEqual (typeof (InvalidEnumArgumentException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.IsTrue (ex.Message.IndexOf ("666") != -1, "#5");
+                               Assert.IsTrue (ex.Message.IndexOf (typeof (ProcessPriorityClass).Name) != -1, "#6");
+                               Assert.IsNotNull (ex.ParamName, "#7");
+                               Assert.AreEqual ("value", ex.ParamName, "#8");
+                       }
+               }
+
+               [Test] // Start ()
+               public void Start1_FileName_Empty ()
+               {
+                       Process process = new Process ();
+                       process.StartInfo = new ProcessStartInfo (string.Empty);
+
+                       // no shell
+                       process.StartInfo.UseShellExecute = false;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                       }
+
+                       // shell
+                       process.StartInfo.UseShellExecute = true;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#B1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                       }
+               }
+
+               [Test] // Start ()
+               public void Start1_FileName_InvalidPathCharacters ()
+               {
+                       if (RunningOnUnix)
+                               // on unix, all characters are allowed
+                               return;
+
+                       string systemDir = Environment.GetFolderPath (Environment.SpecialFolder.System);
+                       string exe = "\"" + Path.Combine (systemDir, "calc.exe") + "\"";
+
+                       Process process = new Process ();
+                       process.StartInfo = new ProcessStartInfo (exe);
+
+                       // no shell
+                       process.StartInfo.UseShellExecute = false;
+                       Assert.IsTrue (process.Start ());
+                       process.Kill ();
+
+                       // shell
+                       process.StartInfo.UseShellExecute = true;
+                       Assert.IsTrue (process.Start ());
+                       process.Kill ();
+               }
+
+               [Test] // Start ()
+               public void Start1_FileName_NotFound ()
+               {
+                       Process process = new Process ();
+                       string exe = RunningOnUnix ? exe = "/usr/bin/shouldnoteverexist"
+                               : @"c:\shouldnoteverexist.exe";
+
+                       // absolute path, no shell
+                       process.StartInfo = new ProcessStartInfo (exe);
+                       process.StartInfo.UseShellExecute = false;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#A1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#A2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#A3");
+                               Assert.IsNull (ex.InnerException, "#A4");
+                               Assert.IsNotNull (ex.Message, "#A5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#A6");
+                       }
+
+                       // relative path, no shell
+                       process.StartInfo.FileName = "shouldnoteverexist.exe";
+                       process.StartInfo.UseShellExecute = false;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#B1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#B2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#B3");
+                               Assert.IsNull (ex.InnerException, "#B4");
+                               Assert.IsNotNull (ex.Message, "#B5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#B6");
+                       }
+
+                       if (RunningOnUnix)
+                               Assert.Ignore ("On Unix and Mac OS X, we try " +
+                                       "to open any file (using xdg-open, ...)" +
+                                       " and we do not report an exception " +
+                                       "if this fails.");
+
+                       // absolute path, shell
+                       process.StartInfo.FileName = exe;
+                       process.StartInfo.UseShellExecute = true;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#C1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#C2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#C3");
+                               Assert.IsNull (ex.InnerException, "#C4");
+                               Assert.IsNotNull (ex.Message, "#C5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#C6");
+                       }
+
+                       // relative path, shell
+                       process.StartInfo.FileName = "shouldnoteverexist.exe";
+                       process.StartInfo.UseShellExecute = true;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#D1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#D2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#D3");
+                               Assert.IsNull (ex.InnerException, "#D4");
+                               Assert.IsNotNull (ex.Message, "#D5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#D6");
+                       }
+               }
+
+               [Test] // Start ()
+               public void Start1_FileName_Null ()
+               {
+                       Process process = new Process ();
+                       process.StartInfo = new ProcessStartInfo ((string) null);
+
+                       // no shell
+                       process.StartInfo.UseShellExecute = false;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                       }
+
+                       // shell
+                       process.StartInfo.UseShellExecute = true;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#B1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                       }
+               }
+
+               [Test] // Start ()
+               public void Start1_FileName_Whitespace ()
+               {
+                       Process process = new Process ();
+                       process.StartInfo = new ProcessStartInfo (" ");
+                       process.StartInfo.UseShellExecute = false;
+                       try {
+                               process.Start ();
+                               Assert.Fail ("#1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#6");
+                       }
+               }
+
+               [Test] // Start (ProcessStartInfo)
+               public void Start2_FileName_Empty ()
+               {
+                       ProcessStartInfo startInfo = new ProcessStartInfo (string.Empty);
+
+                       // no shell
+                       startInfo.UseShellExecute = false;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                       }
+
+                       // shell
+                       startInfo.UseShellExecute = true;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#B1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                       }
+               }
+
+               [Test] // Start (ProcessStartInfo)
+               public void Start2_FileName_NotFound ()
+               {
+                       ProcessStartInfo startInfo = new ProcessStartInfo ();
+                       string exe = RunningOnUnix ? exe = "/usr/bin/shouldnoteverexist"
+                               : @"c:\shouldnoteverexist.exe";
+
+                       // absolute path, no shell
+                       startInfo.FileName = exe;
+                       startInfo.UseShellExecute = false;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#A1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#A2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#A3");
+                               Assert.IsNull (ex.InnerException, "#A4");
+                               Assert.IsNotNull (ex.Message, "#A5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#A6");
+                       }
+
+                       // relative path, no shell
+                       startInfo.FileName = "shouldnoteverexist.exe";
+                       startInfo.UseShellExecute = false;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#B1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#B2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#B3");
+                               Assert.IsNull (ex.InnerException, "#B4");
+                               Assert.IsNotNull (ex.Message, "#B5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#B6");
+                       }
+
+                       if (RunningOnUnix)
+                               Assert.Ignore ("On Unix and Mac OS X, we try " +
+                                       "to open any file (using xdg-open, ...)" +
+                                       " and we do not report an exception " +
+                                       "if this fails.");
+
+                       // absolute path, shell
+                       startInfo.FileName = exe;
+                       startInfo.UseShellExecute = true;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#C1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#C2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#C3");
+                               Assert.IsNull (ex.InnerException, "#C4");
+                               Assert.IsNotNull (ex.Message, "#C5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#C6");
+                       }
+
+                       // relative path, shell
+                       startInfo.FileName = "shouldnoteverexist.exe";
+                       startInfo.UseShellExecute = true;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#D1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#D2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#D3");
+                               Assert.IsNull (ex.InnerException, "#D4");
+                               Assert.IsNotNull (ex.Message, "#D5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#D6");
+                       }
+               }
+
+               [Test] // Start (ProcessStartInfo)
+               public void Start2_FileName_Null ()
+               {
+                       ProcessStartInfo startInfo = new ProcessStartInfo ((string) null);
+
+                       // no shell
+                       startInfo.UseShellExecute = false;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#A1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                       }
+
+                       // shell
+                       startInfo.UseShellExecute = true;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#B1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                       }
+               }
+
+               [Test] // Start (ProcessStartInfo)
+               public void Start2_FileName_Whitespace ()
+               {
+                       ProcessStartInfo startInfo = new ProcessStartInfo (" ");
+                       startInfo.UseShellExecute = false;
+                       try {
+                               Process.Start (startInfo);
+                               Assert.Fail ("#1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#6");
+                       }
+               }
+
+               [Test] // Start (ProcessStartInfo)
+               public void Start2_StartInfo_Null ()
+               {
+                       try {
+                               Process.Start ((ProcessStartInfo) null);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.IsNotNull (ex.ParamName, "#5");
+                               Assert.AreEqual ("startInfo", ex.ParamName, "#6");
+                       }
+               }
+
+               [Test] // Start (string)
+               public void Start3_FileName_Empty ()
+               {
+                       try {
+                               Process.Start (string.Empty);
+                               Assert.Fail ("#1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                       }
+               }
+
+               [Test] // Start (string)
+               public void Start3_FileName_NotFound ()
+               {
+                       if (RunningOnUnix)
+                               Assert.Ignore ("On Unix and Mac OS X, we try " +
+                                       "to open any file (using xdg-open, ...)" +
+                                       " and we do not report an exception " +
+                                       "if this fails.");
+
+                       string exe = @"c:\shouldnoteverexist.exe";
+
+                       // absolute path, no shell
+                       try {
+                               Process.Start (exe);
+                               Assert.Fail ("#A1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#A2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#A3");
+                               Assert.IsNull (ex.InnerException, "#A4");
+                               Assert.IsNotNull (ex.Message, "#A5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#A6");
+                       }
+
+                       // relative path, no shell
+                       try {
+                               Process.Start ("shouldnoteverexist.exe");
+                               Assert.Fail ("#B1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#B2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#B3");
+                               Assert.IsNull (ex.InnerException, "#B4");
+                               Assert.IsNotNull (ex.Message, "#B5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#B6");
+                       }
+               }
+
+               [Test] // Start (string)
+               public void Start3_FileName_Null ()
+               {
+                       try {
+                               Process.Start ((string) null);
+                               Assert.Fail ("#1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                       }
+               }
+
+               [Test] // Start (string, string)
+               public void Start4_Arguments_Null ()
+               {
+                       if (RunningOnUnix)
+                               Assert.Ignore ("On Unix and Mac OS X, we try " +
+                                       "to open any file (using xdg-open, ...)" +
+                                       " and we do not report an exception " +
+                                       "if this fails.");
+
+                       string exe = @"c:\shouldnoteverexist.exe";
+
+                       try {
+                               Process.Start ("whatever.exe", (string) null);
+                               Assert.Fail ("#1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#B2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#B3");
+                               Assert.IsNull (ex.InnerException, "#B4");
+                               Assert.IsNotNull (ex.Message, "#B5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#B6");
+                       }
+               }
+
+               [Test] // Start (string, string)
+               public void Start4_FileName_Empty ()
+               {
+                       try {
+                               Process.Start (string.Empty, string.Empty);
+                               Assert.Fail ("#1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                       }
+               }
+
+               [Test] // Start (string, string)
+               public void Start4_FileName_NotFound ()
+               {
+                       if (RunningOnUnix)
+                               Assert.Ignore ("On Unix and Mac OS X, we try " +
+                                       "to open any file (using xdg-open, ...)" +
+                                       " and we do not report an exception " +
+                                       "if this fails.");
+
+                       string exe = @"c:\shouldnoteverexist.exe";
+
+                       // absolute path, no shell
+                       try {
+                               Process.Start (exe, string.Empty);
+                               Assert.Fail ("#A1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#A2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#A3");
+                               Assert.IsNull (ex.InnerException, "#A4");
+                               Assert.IsNotNull (ex.Message, "#A5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#A6");
+                       }
+
+                       // relative path, no shell
+                       try {
+                               Process.Start ("shouldnoteverexist.exe", string.Empty);
+                               Assert.Fail ("#B1");
+                       } catch (Win32Exception ex) {
+                               // The system cannot find the file specified
+                               Assert.AreEqual (typeof (Win32Exception), ex.GetType (), "#B2");
+                               Assert.AreEqual (-2147467259, ex.ErrorCode, "#B3");
+                               Assert.IsNull (ex.InnerException, "#B4");
+                               Assert.IsNotNull (ex.Message, "#B5");
+                               Assert.AreEqual (2, ex.NativeErrorCode, "#B6");
+                       }
+               }
+
+#if NET_2_0            
+               [Test]
+               public void Start_UseShellExecuteWithEmptyUserName ()
+               {
+                       if (RunningOnUnix)
+                               Assert.Ignore ("On Unix and Mac OS X, we try " +
+                                       "to open any file (using xdg-open, ...)" +
+                                       " and we do not report an exception " +
+                                       "if this fails.");
+
+                       string exe = @"c:\shouldnoteverexist.exe";
+
+                       try {
+                               Process p = new Process ();
+                               p.StartInfo.FileName = exe;
+                               p.StartInfo.UseShellExecute = true;
+                               p.StartInfo.UserName = "";
+                               p.Start ();
+                               Assert.Fail ("#1");
+                       } catch (InvalidOperationException) {
+                               Assert.Fail ("#2");
+                       } catch (Win32Exception) {
+                       }
+
+                       try {
+                               Process p = new Process ();
+                               p.StartInfo.FileName = exe;
+                               p.StartInfo.UseShellExecute = true;
+                               p.StartInfo.UserName = null;
+                               p.Start ();
+                               Assert.Fail ("#3");                             
+                       } catch (InvalidOperationException) {
+                               Assert.Fail ("#4");
+                       } catch (Win32Exception) {
+                       }
+               }
+#endif
+               
+               [Test] // Start (string, string)
+               public void Start4_FileName_Null ()
+               {
+                       try {
+                               Process.Start ((string) null, string.Empty);
+                               Assert.Fail ("#1");
+                       } catch (InvalidOperationException ex) {
+                               // Cannot start process because a file name has
+                               // not been provided
+                               Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                       }
+               }
+
+               [Test]
+               public void StartInfo ()
+               {
+                       ProcessStartInfo startInfo = new ProcessStartInfo ();
+
+                       Process p = new Process ();
+                       Assert.IsNotNull (p.StartInfo, "#A1");
+                       p.StartInfo = startInfo;
+                       Assert.AreSame (startInfo, p.StartInfo, "#A2");
+               }
+
+               [Test]
+               public void StartInfo_Null ()
+               {
+                       Process p = new Process ();
+                       try {
+                               p.StartInfo = null;
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.IsNotNull (ex.ParamName, "#5");
+                               Assert.AreEqual ("value", ex.ParamName, "#6");
+                       }
+               }
+
+               [Test]
+               [NUnit.Framework.Category ("NotDotNet")]
                public void TestRedirectedOutputIsAsync ()
                {
                        // Test requires cygwin, so we just bail out for now.
@@ -70,20 +693,137 @@ namespace MonoTests.System.Diagnostics
 
                        // start async Read operation
                        DateTime start = DateTime.Now;
-                       stdout.BeginRead (buffer, 0, buffer.Length,
-                                         new AsyncCallback (Read), stdout);
+                       IAsyncResult ar = stdout.BeginRead (buffer, 0, buffer.Length,
+                                                           new AsyncCallback (Read), stdout);
 
                        Assert.IsTrue ((DateTime.Now - start).TotalMilliseconds < 1000, "#01 BeginRead was not async");
                        p.WaitForExit ();
                        Assert.AreEqual (0, p.ExitCode, "#02 script failure");
 
-                       Assert.AreEqual ("hello", Encoding.Default.GetString (buffer, 0, 5), "#03");
+                       /*
+                       ar.AsyncWaitHandle.WaitOne (2000, false);
+                       if (bytesRead < "hello".Length)
+                               Assert.Fail ("#03 got {0} bytes", bytesRead);
+                       Assert.AreEqual ("hello", Encoding.Default.GetString (buffer, 0, 5), "#04");
+                       */
                }
-
+               
                void Read (IAsyncResult ar)
                {
                        Stream stm = (Stream) ar.AsyncState;
-                       stm.EndRead (ar);
+                       bytesRead = stm.EndRead (ar);
+               }
+
+               static bool RunningOnUnix {
+                       get {
+                               int p = (int)Environment.OSVersion.Platform;
+                               return ((p == 128) || (p == 4) || (p == 6));
+                       }
+               }
+
+               int bytesRead = -1;
+
+#if NET_2_0
+// Not technically a 2.0 only test, but I use lambdas, so I need gmcs
+
+               [Test]
+               // This was for bug #459450
+               public void TestEventRaising ()
+               {
+                       EventWaitHandle errorClosed = new ManualResetEvent(false);
+                       EventWaitHandle outClosed = new ManualResetEvent(false);
+                       EventWaitHandle exited = new ManualResetEvent(false);
+
+                       Process p = new Process();
+                       
+                       p.StartInfo = GetCrossPlatformStartInfo ();
+                       p.StartInfo.UseShellExecute = false;
+                       p.StartInfo.RedirectStandardOutput = true;
+                       p.StartInfo.RedirectStandardError = true;
+                       p.StartInfo.RedirectStandardInput = false;
+                       p.OutputDataReceived += (object sender, DataReceivedEventArgs e) => {
+                               if (e.Data == null) {
+                                       outClosed.Set();
+                               }
+                       };
+                       
+                       p.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => {
+                               if (e.Data == null) {
+                                       errorClosed.Set();
+                               }
+                       };
+                       
+                       p.Exited += (object sender, EventArgs e) => {
+                               exited.Set ();
+                       };
+                       
+                       p.EnableRaisingEvents = true;
+
+                       p.Start();
+
+                       p.BeginErrorReadLine();
+                       p.BeginOutputReadLine();
+
+                       Console.WriteLine("started, waiting for handles");
+                       bool r = WaitHandle.WaitAll(new WaitHandle[] { errorClosed, outClosed, exited }, 10000, false);
+
+                       Assert.AreEqual (true, r, "Null Argument Events Raised");
+               }
+               
+               private ProcessStartInfo GetCrossPlatformStartInfo ()
+               {
+                       return RunningOnUnix ? new ProcessStartInfo ("/bin/ls", "/") : new ProcessStartInfo ("help", "");
+               }
+               
+               [Test]
+               public void ProcessName_NotStarted ()
+               {
+                       Process p = new Process ();
+                       Exception e = null;
+                       try {
+                               String.IsNullOrEmpty (p.ProcessName);
+                       } catch (Exception ex) {
+                               e = ex;
+                       }
+                       
+                       Assert.IsNotNull (e, "ProcessName should raise if process was not started");
+                       
+                       //msg should be "No process is associated with this object"
+                       Assert.AreEqual (e.GetType (), typeof (InvalidOperationException),
+                                        "exception should be IOE, I got: " + e.GetType ().Name);
+                       
+                       Assert.IsNull (e.InnerException, "IOE inner exception should be null");
+               }
+               
+               [Test]
+               public void ProcessName_AfterExit ()
+               {
+                       Process p = new Process ();
+                       p.StartInfo = GetCrossPlatformStartInfo ();
+                       p.StartInfo.UseShellExecute = false;
+                       p.StartInfo.RedirectStandardOutput = true;
+                       p.StartInfo.RedirectStandardError = true;
+                       p.Start ();
+                       p.BeginErrorReadLine();
+                       p.BeginOutputReadLine();
+                       p.WaitForExit ();
+                       String.IsNullOrEmpty (p.ExitCode + "");
+                       
+                       Exception e = null;
+                       try {
+                               String.IsNullOrEmpty (p.ProcessName);
+                       } catch (Exception ex) {
+                               e = ex;
+                       }
+                       
+                       Assert.IsNotNull (e, "ProcessName should raise if process was finished");
+                       
+                       //msg should be "Process has exited, so the requested information is not available"
+                       Assert.AreEqual (e.GetType (), typeof (InvalidOperationException),
+                                        "exception should be IOE, I got: " + e.GetType ().Name);
+                       
+                       Assert.IsNull (e.InnerException, "IOE inner exception should be null");
                }
+#endif
        }
 }