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 {
19 // This whole test seems to fail randomly. Either
20 // - It is relying on a race it might not win (that the timer code runs)
21 // - We have a very obscure bug with appdomains.
23 // Am going with door #1, but it would be nice to investigate this.
27 public class TimerTest {
28 // this bucket is used to avoid non-theadlocal issues
34 //creating a timer that will never run just to make sure the
35 // scheduler is warm for the unit tests
36 // this makes fair for the "DueTime" test since it
37 // doesn't have to wait for the scheduler thread to be
39 new Timer(null,null,Timeout.Infinite,0);
43 public void TestDueTime ()
45 Bucket bucket = new Bucket();
46 Timer t = new Timer (new TimerCallback (Callback), bucket, 200, Timeout.Infinite);
48 Assert.AreEqual (0, bucket.count);
50 Assert.AreEqual (1, bucket.count);
52 Assert.AreEqual (1, bucket.count);
55 Assert.IsTrue(bucket.count > 20);
60 public void TestChange ()
62 Bucket bucket = new Bucket();
63 Timer t = new Timer (new TimerCallback (Callback), bucket, 1, 1);
66 Assert.IsTrue(c > 20);
69 Assert.IsTrue(bucket.count <= c + 6);
74 public void TestZeroDueTime () {
75 Bucket bucket = new Bucket();
77 Timer t = new Timer (new TimerCallback (Callback), bucket, 0, Timeout.Infinite);
79 Assert.AreEqual (1, bucket.count);
80 t.Change (0, Timeout.Infinite);
82 Assert.AreEqual (2, bucket.count);
86 public void TestDispose ()
88 Bucket bucket = new Bucket();
89 Timer t = new Timer (new TimerCallback (Callback), bucket, 10, 10);
94 Assert.IsTrue(bucket.count > 5);
96 Assert.AreEqual (c, bucket.count);
100 public void TestDispose2 ()
102 Timer t = new Timer (new TimerCallback (Callback), null, 10, 10);
108 public void TestHeavyCreationLoad() {
109 Bucket b = new Bucket();
110 for (int i = 0; i < 500; ++i)
111 new Timer(new TimerCallback(Callback),b,10,Timeout.Infinite);
112 // 1000 * 10 msec = 10,000 msec or 10 sec - if everything goes well
113 // we add some slack to cope with timing issues caused by system load etc.
114 for (int i = 0; i < 20; ++i) {
119 Assert.AreEqual(500,b.count);
123 public void TestQuickDisposeDeadlockBug() {
125 Bucket b = new Bucket();
126 ArrayList timers = new ArrayList();
128 Timer t = new Timer(new TimerCallback(Callback),b,10,Timeout.Infinite);
133 Thread.Sleep(11*500);
136 public void TestInt32MaxDelay() {
137 Bucket b = new Bucket();
138 new Timer(new TimerCallback(Callback),b,Int32.MaxValue,Timeout.Infinite);
140 Assert.AreEqual(0,b.count);
144 public void TestInt32MaxPeriod() {
145 Bucket b = new Bucket();
146 new Timer(new TimerCallback(Callback),b,0,Int32.MaxValue);
148 Assert.AreEqual(1,b.count);
152 public void TestNegativeDelay() {
153 Bucket b = new Bucket();
155 new Timer(new TimerCallback(Callback),b,-10,Timeout.Infinite);
156 } catch (ArgumentOutOfRangeException) {
163 public void TestNegativePeriod() {
164 Bucket b = new Bucket();
166 new Timer(new TimerCallback(Callback),b,0,-10);
167 } catch (ArgumentOutOfRangeException) {
174 public void TestDelayZeroPeriodZero() {
175 Bucket b = new Bucket();
176 Timer t = new Timer(new TimerCallback(Callback),b,0,0);
178 t.Change (int.MaxValue, Timeout.Infinite);
179 // since period is 0 the callback should happen once (bug #340212)
180 Assert.IsTrue(b.count == 1);
184 [Category("NotWorking")]
185 public void TestDisposeOnCallback () {
188 t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), t1, 0, 10);
193 private void CallbackTestDisposeOnCallback (object foo)
195 ((Timer)foo).Dispose();
198 private void Callback (object foo)
200 Bucket b = foo as Bucket;