1 //
2 // AutoResetEventTest.cs - NUnit test cases for System.Threading.AutoResetEvent
3 //
4 // Author:
5 // 	Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //	Gert Driesen <gert.driesen@telenet.be>
7 //
8 // Copyright 2005 Novell, Inc (http://www.novell.com)
9 // Copyright 2007 Gert Driesen
10 //
11 
12 using NUnit.Framework;
13 using System;
14 using System.Threading;
15 using Microsoft.Win32.SafeHandles;
16 
17 namespace MonoTests.System.Threading
18 {
19 	[TestFixture]
20 	public class AutoResetEventTest
21 	{
22 		[Test]
MultipleSet()23 		public void MultipleSet ()
24 		{
25 			AutoResetEvent evt = new AutoResetEvent (true);
26 			Assert.IsTrue (evt.WaitOne (1000, false), "#1");
27 			evt.Set ();
28 			evt.Set ();
29 			Assert.IsTrue (evt.WaitOne (1000, false), "#2");
30 			Assert.IsFalse (evt.WaitOne (1000, false), "#3");
31 		}
32 
33 		[Test] // bug #81529
SafeWaitHandle()34 		public void SafeWaitHandle ()
35 		{
36 			AutoResetEvent are1 = new AutoResetEvent (false);
37 			AutoResetEvent are2 = new AutoResetEvent (false);
38 			SafeWaitHandle swh1 = are1.SafeWaitHandle;
39 			SafeWaitHandle swh2 = are2.SafeWaitHandle;
40 			are1.SafeWaitHandle = are2.SafeWaitHandle;
41 			Assert.AreSame (are1.SafeWaitHandle, are2.SafeWaitHandle, "#1");
42 			Assert.AreEqual (are1.Handle, are2.Handle, "#2");
43 			Assert.IsFalse (are1.SafeWaitHandle.IsInvalid, "#3");
44 			Assert.IsFalse (are1.SafeWaitHandle.IsClosed, "#4");
45 			Assert.IsFalse (swh1.IsClosed, "#5");
46 			Assert.IsFalse (swh1.IsInvalid, "#6");
47 			swh1.Dispose ();
48 			are1.Close ();
49 		}
50 
51 		[Test] // bug #81529
SafeWaitHandle_Null()52 		public void SafeWaitHandle_Null ()
53 		{
54 			AutoResetEvent are1 = new AutoResetEvent (false);
55 			SafeWaitHandle swh1 = are1.SafeWaitHandle;
56 			are1.SafeWaitHandle = null;
57 			Assert.IsNotNull (are1.SafeWaitHandle, "#1");
58 			Assert.AreEqual (-1, (int) are1.Handle, "#2");
59 			Assert.IsTrue (are1.SafeWaitHandle.IsInvalid, "#3");
60 			Assert.IsFalse (are1.SafeWaitHandle.IsClosed, "#4");
61 			Assert.IsFalse (swh1.IsClosed, "#5");
62 			Assert.IsFalse (swh1.IsInvalid, "#6");
63 		}
64 
65 		[Test] // bug #81529
66 		// Causes a Attempting to unref unused handle 0x2 warning
67 		[Category ("NotWorking")]
Handle_Valid()68 		public void Handle_Valid ()
69 		{
70 			AutoResetEvent are1 = new AutoResetEvent (false);
71 			SafeWaitHandle swh1 = are1.SafeWaitHandle;
72 			Assert.IsFalse (swh1.IsClosed, "#1");
73 			Assert.IsFalse (swh1.IsInvalid, "#2");
74 			IntPtr dummyHandle = (IntPtr) 2;
75 			are1.Handle = dummyHandle;
76 			Assert.AreEqual (are1.Handle, dummyHandle, "#3");
77 			Assert.IsFalse (swh1.IsClosed, "#4");
78 			Assert.IsFalse (swh1.IsClosed, "#5");
79 			Assert.IsFalse (swh1.IsInvalid, "#6");
80 			Assert.IsFalse (are1.SafeWaitHandle.IsClosed, "#7");
81 			Assert.IsFalse (are1.SafeWaitHandle.IsInvalid, "#8");
82 			are1.Close ();
83 			swh1.Dispose ();
84 		}
85 
86 		[Test] // bug #81529
Handle_Invalid()87 		public void Handle_Invalid ()
88 		{
89 			AutoResetEvent are1 = new AutoResetEvent (false);
90 			SafeWaitHandle swh1 = are1.SafeWaitHandle;
91 			are1.Handle = (IntPtr) (-1);
92 			Assert.IsTrue (swh1 != are1.SafeWaitHandle, "#1");
93 			Assert.IsTrue (swh1.IsClosed, "#2"); // After testing on Windows/.NET, IsClosed returns true
94 			Assert.IsFalse (swh1.IsInvalid, "#3");
95 			Assert.IsFalse (are1.SafeWaitHandle.IsClosed, "#4");
96 			Assert.IsTrue (are1.SafeWaitHandle.IsInvalid, "#5");
97 			are1.Close ();
98 			swh1.Dispose ();
99 		}
100 
101 		[Test] // bug #81529
Handle_ZeroPtr()102 		public void Handle_ZeroPtr ()
103 		{
104 			AutoResetEvent are1 = new AutoResetEvent (false);
105 			SafeWaitHandle swh1 = are1.SafeWaitHandle;
106 			are1.Handle = IntPtr.Zero;
107 			Assert.IsTrue (swh1 != are1.SafeWaitHandle, "#1");
108 			Assert.IsFalse (swh1.IsClosed, "#2");
109 			Assert.IsFalse (swh1.IsInvalid, "#3");
110 			Assert.IsFalse (are1.SafeWaitHandle.IsClosed, "#4");
111 			Assert.IsTrue (are1.SafeWaitHandle.IsInvalid, "#5");
112 			are1.Close ();
113 			swh1.Dispose ();
114 		}
115 	}
116 }
117