Merge pull request #1659 from alexanderkyte/stringbuilder-referencesource
[mono.git] / mcs / class / corlib / Test / System.Threading / ThreadPoolTest.cs
1 //
2 // ThreadPoolTest.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 2013 Xamarin Inc (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining a copy
10 // of this software and associated documentation files (the "Software"), to deal
11 // in the Software without restriction, including without limitation the rights
12 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 // copies of the Software, and to permit persons to whom the Software is
14 // furnished to do so, subject to the following conditions:
15 //
16 // The above copyright notice and this permission notice shall be included in
17 // all copies or substantial portions of the Software.
18 //
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 // THE SOFTWARE.
26 //
27 //
28
29 using System;
30 using System.Threading;
31 using NUnit.Framework;
32
33 namespace MonoTests.System.Threading
34 {
35         [TestFixture]
36         public class ThreadPoolTests
37         {
38                 [Test]
39                 public void RegisterWaitForSingleObject_InvalidArguments ()
40                 {
41                         try {
42                                 ThreadPool.RegisterWaitForSingleObject (null, delegate {}, new object (), 100, false);
43                                 Assert.Fail ("#1");
44                         } catch (ArgumentNullException) {
45                         }
46
47                         try {
48                                 ThreadPool.RegisterWaitForSingleObject (new Mutex (), null, new object (), 100, false);
49                                 Assert.Fail ("#2");
50                         } catch (ArgumentNullException) {
51                         }                       
52                 }
53
54                 [Test]
55                 public void UnsafeQueueUserWorkItem_InvalidArguments ()
56                 {
57                         try {
58                                 ThreadPool.UnsafeQueueUserWorkItem (null, 1);
59                                 Assert.Fail ("#1");
60                         } catch (ArgumentNullException) {
61                         }
62                 }
63
64                 [Test]
65                 public void QueueUserWorkItem ()
66                 {
67                         int n = 100000;
68                         int total = 0, sum = 0;
69                         for (int i = 0; i < n; ++i) {
70                                 if (i % 2 == 0)
71                                         ThreadPool.QueueUserWorkItem (_ => { Interlocked.Decrement (ref sum); Interlocked.Increment (ref total); });
72                                 else
73                                         ThreadPool.QueueUserWorkItem (_ => { Interlocked.Increment (ref sum); Interlocked.Increment (ref total); });
74                         }
75                         var start = DateTime.Now;
76                         while ((total != n || sum != 0) && (DateTime.Now - start).TotalSeconds < 60)
77                                 Thread.Sleep (1000);
78                         Assert.IsTrue (total == n, "#1");
79                         Assert.IsTrue (sum   == 0, "#2");
80                 }
81
82 #if NET_4_0
83                 event WaitCallback e;
84
85                 [Test]
86                 public void UnsafeQueueUserWorkItem_MulticastDelegate ()
87                 {
88                         CountdownEvent ev = new CountdownEvent (2);
89
90                         e += delegate {
91                                 ev.Signal ();
92                         };
93
94                         e += delegate {
95                                 ev.Signal ();
96                         };
97
98                         ThreadPool.UnsafeQueueUserWorkItem (e, null);
99                         Assert.IsTrue (ev.Wait (3000));
100                 }
101 #endif
102         }
103 }