2 // TimerTest.cs - NUnit test cases for System.Threading.Timer
5 // Zoltan Varga (vargaz@freemail.hu)
6 // Rafael Ferreira (raf@ophion.org)
8 // (C) 2004 Novell, Inc (http://www.novell.com)
11 using NUnit
.Framework
;
13 using System
.Threading
;
14 using System
.Collections
;
16 namespace MonoTests
.System
.Threading
{
18 public class TimerTest
{
19 // this bucket is used to avoid non-theadlocal issues
27 //creating a timer that will never run just to make sure the
28 // scheduler is warm for the unit tests
29 // this makes fair for the "DueTime" test since it
30 // doesn't have to wait for the scheduler thread to be
32 new Timer (null, null, Timeout
.Infinite
, 0);
36 public void TestDueTime ()
38 Bucket bucket
= new Bucket();
39 Timer t
= new Timer (new TimerCallback (Callback
), bucket
, 200, Timeout
.Infinite
);
41 Assert
.AreEqual (0, bucket
.count
, "#1");
43 Assert
.AreEqual (1, bucket
.count
, "#2");
45 Assert
.AreEqual (1, bucket
.count
, "#3");
48 Assert
.IsTrue(bucket
.count
> 20, "#4");
53 public void TestChange ()
55 Bucket bucket
= new Bucket();
56 Timer t
= new Timer (new TimerCallback (Callback
), bucket
, 1, 1);
59 Assert
.IsTrue(c
> 20, "#1");
62 Assert
.IsTrue(bucket
.count
<= c
+ 20, "#2");
67 public void TestZeroDueTime ()
69 Bucket bucket
= new Bucket();
71 Timer t
= new Timer (new TimerCallback (Callback
), bucket
, 0, Timeout
.Infinite
);
73 Assert
.AreEqual (1, bucket
.count
, "#1");
74 t
.Change (0, Timeout
.Infinite
);
76 Assert
.AreEqual (2, bucket
.count
, "#2");
81 public void TestDispose ()
83 Bucket bucket
= new Bucket();
84 Timer t
= new Timer (new TimerCallback (Callback
), bucket
, 10, 10);
89 Assert
.IsTrue (bucket
.count
> 5, "#1");
91 Assert
.AreEqual (c
, bucket
.count
, "#2");
95 public void TestDispose2 ()
97 Timer t
= new Timer (new TimerCallback (Callback
), null, 10, 10);
103 public void TestHeavyCreationLoad ()
105 Bucket b
= new Bucket ();
106 for (int i
= 0; i
< 500; ++i
)
107 new Timer (new TimerCallback (Callback
), b
, 10,
109 // 1000 * 10 msec = 10,000 msec or 10 sec - if everything goes well
110 // we add some slack to cope with timing issues caused by system load etc.
111 for (int i
= 0; i
< 20; ++i
) {
116 Assert
.AreEqual (500, b
.count
);
121 public void TestQuickDisposeDeadlockBug ()
124 Bucket b
= new Bucket ();
125 ArrayList timers
= new ArrayList();
127 Timer t
= new Timer (new TimerCallback (Callback
),
128 b
, 10, Timeout
.Infinite
);
133 Thread
.Sleep (11 * 500);
137 public void TestInt32MaxDelay ()
139 Bucket b
= new Bucket ();
140 new Timer (new TimerCallback (Callback
), b
, Int32
.MaxValue
,
143 Assert
.AreEqual (0, b
.count
);
147 public void TestInt32MaxPeriod ()
149 Bucket b
= new Bucket ();
150 new Timer (new TimerCallback (Callback
), b
, 0,
153 Assert
.AreEqual (1, b
.count
);
158 public void TestNegativeDelay ()
160 Bucket b
= new Bucket ();
162 new Timer (new TimerCallback (Callback
), b
, -10,
165 } catch (ArgumentOutOfRangeException
) {
171 public void TestNegativePeriod ()
173 Bucket b
= new Bucket ();
175 new Timer (new TimerCallback (Callback
), b
, 0,
178 } catch (ArgumentOutOfRangeException
) {
184 public void TestDelayZeroPeriodZero()
186 Bucket b
= new Bucket();
187 Timer t
= new Timer(new TimerCallback(Callback
),b
,0,0);
189 t
.Change (int.MaxValue
, Timeout
.Infinite
);
190 // since period is 0 the callback should happen once (bug #340212)
191 Assert
.IsTrue(b
.count
== 1);
196 public void TestDisposeOnCallback ()
199 t1
= new Timer (new TimerCallback (CallbackTestDisposeOnCallback
), t1
, 0, 10);
201 Assert
.IsNotNull (t1
);
205 private void CallbackTestDisposeOnCallback (object foo
)
207 ((Timer
) foo
).Dispose ();
210 private void Callback (object foo
)
212 Bucket b
= foo
as Bucket
;
213 Interlocked
.Increment (ref b
.count
);