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 (new TimerCallback (DoNothing), null, Timeout.Infinite, 0);
35 void DoNothing (object foo)
40 public void TestDueTime ()
42 Bucket bucket = new Bucket();
43 Timer t = new Timer (new TimerCallback (Callback), bucket, 200, Timeout.Infinite);
45 Assert.AreEqual (0, bucket.count, "#1");
47 Assert.AreEqual (1, bucket.count, "#2");
49 Assert.AreEqual (1, bucket.count, "#3");
52 Assert.IsTrue(bucket.count > 20, "#4");
57 public void TestChange ()
59 Bucket bucket = new Bucket();
60 Timer t = new Timer (new TimerCallback (Callback), bucket, 1, 1);
63 Assert.IsTrue(c > 20, "#1");
66 Assert.IsTrue(bucket.count <= c + 20, "#2");
71 public void TestZeroDueTime ()
73 Bucket bucket = new Bucket();
75 Timer t = new Timer (new TimerCallback (Callback), bucket, 0, Timeout.Infinite);
77 Assert.AreEqual (1, bucket.count, "#1");
78 t.Change (0, Timeout.Infinite);
80 Assert.AreEqual (2, bucket.count, "#2");
85 public void TestDispose ()
87 Bucket bucket = new Bucket();
88 Timer t = new Timer (new TimerCallback (Callback), bucket, 10, 10);
93 Assert.IsTrue (bucket.count > 5, "#1");
95 Assert.AreEqual (c, bucket.count, "#2");
99 public void TestDispose2 ()
101 Timer t = new Timer (new TimerCallback (Callback), null, 10, 10);
107 public void TestHeavyCreationLoad ()
109 Bucket b = new Bucket ();
110 for (int i = 0; i < 500; ++i)
111 new Timer (new TimerCallback (Callback), b, 10,
113 // 1000 * 10 msec = 10,000 msec or 10 sec - if everything goes well
114 // we add some slack to cope with timing issues caused by system load etc.
115 for (int i = 0; i < 20; ++i) {
120 Assert.AreEqual (500, b.count);
125 public void TestQuickDisposeDeadlockBug ()
128 Bucket b = new Bucket ();
129 ArrayList timers = new ArrayList();
131 Timer t = new Timer (new TimerCallback (Callback),
132 b, 10, Timeout.Infinite);
137 Thread.Sleep (11 * 500);
141 public void TestInt32MaxDelay ()
143 Bucket b = new Bucket ();
144 new Timer (new TimerCallback (Callback), b, Int32.MaxValue,
147 Assert.AreEqual (0, b.count);
151 public void TestInt32MaxPeriod ()
153 Bucket b = new Bucket ();
154 new Timer (new TimerCallback (Callback), b, 0,
157 Assert.AreEqual (1, b.count);
162 public void TestNegativeDelay ()
164 Bucket b = new Bucket ();
166 new Timer (new TimerCallback (Callback), b, -10,
169 } catch (ArgumentOutOfRangeException) {
175 public void TestNegativePeriod ()
177 Bucket b = new Bucket ();
179 new Timer (new TimerCallback (Callback), b, 0,
182 } catch (ArgumentOutOfRangeException) {
188 public void TestDelayZeroPeriodZero()
190 Bucket b = new Bucket();
191 Timer t = new Timer(new TimerCallback(Callback),b,0,0);
193 t.Change (int.MaxValue, Timeout.Infinite);
194 // since period is 0 the callback should happen once (bug #340212)
195 Assert.IsTrue(b.count == 1);
200 public void TestDisposeOnCallback ()
203 t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), t1, 0, 10);
205 Assert.IsNotNull (t1);
209 private void CallbackTestDisposeOnCallback (object foo)
211 ((Timer) foo).Dispose ();
214 private void Callback (object foo)
216 Bucket b = foo as Bucket;
217 Interlocked.Increment (ref b.count);