TimerTest.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //
  2. // TimerTest.cs - NUnit test cases for System.Threading.Timer
  3. //
  4. // Author:
  5. // Zoltan Varga ([email protected])
  6. // Rafael Ferreira ([email protected])
  7. //
  8. // (C) 2004 Novell, Inc (http://www.novell.com)
  9. //
  10. using NUnit.Framework;
  11. using System;
  12. using System.Threading;
  13. using System.Collections;
  14. namespace MonoTests.System.Threading {
  15. //
  16. // This whole test seems to fail randomly. Either
  17. // - It is relying on a race it might not win (that the timer code runs)
  18. // - We have a very obscure bug with appdomains.
  19. //
  20. // Am going with door #1, but it would be nice to investigate this.
  21. // -- Ben
  22. //
  23. [TestFixture]
  24. public class TimerTest {
  25. // this bucket is used to avoid non-theadlocal issues
  26. class Bucket {
  27. public int count;
  28. }
  29. [SetUp]
  30. public void setup() {
  31. //creating a timer that will never run just to make sure the
  32. // scheduler is warm for the unit tests
  33. // this makes fair for the "DueTime" test since it
  34. // doesn't have to wait for the scheduler thread to be
  35. // created.
  36. new Timer(null,null,Timeout.Infinite,0);
  37. }
  38. [Test]
  39. public void TestDueTime ()
  40. {
  41. Bucket bucket = new Bucket();
  42. Timer t = new Timer (new TimerCallback (Callback), bucket, 200, Timeout.Infinite);
  43. Thread.Sleep (50);
  44. Assert.AreEqual (0, bucket.count);
  45. Thread.Sleep (200);
  46. Assert.AreEqual (1, bucket.count);
  47. Thread.Sleep (500);
  48. Assert.AreEqual (1, bucket.count);
  49. t.Change (10, 10);
  50. Thread.Sleep (1000);
  51. Assert.IsTrue(bucket.count > 20);
  52. t.Dispose ();
  53. }
  54. [Test]
  55. public void TestChange ()
  56. {
  57. Bucket bucket = new Bucket();
  58. Timer t = new Timer (new TimerCallback (Callback), bucket, 1, 1);
  59. Thread.Sleep (500);
  60. int c = bucket.count;
  61. Assert.IsTrue(c > 20);
  62. t.Change (100, 100);
  63. Thread.Sleep (500);
  64. Assert.IsTrue(bucket.count <= c + 6);
  65. t.Dispose ();
  66. }
  67. [Test]
  68. public void TestZeroDueTime () {
  69. Bucket bucket = new Bucket();
  70. Timer t = new Timer (new TimerCallback (Callback), bucket, 0, Timeout.Infinite);
  71. Thread.Sleep (100);
  72. Assert.AreEqual (1, bucket.count);
  73. t.Change (0, Timeout.Infinite);
  74. Thread.Sleep (100);
  75. Assert.AreEqual (2, bucket.count);
  76. t.Dispose ();
  77. }
  78. [Test]
  79. public void TestDispose ()
  80. {
  81. Bucket bucket = new Bucket();
  82. Timer t = new Timer (new TimerCallback (Callback), bucket, 10, 10);
  83. Thread.Sleep (200);
  84. t.Dispose ();
  85. Thread.Sleep (20);
  86. int c = bucket.count;
  87. Assert.IsTrue(bucket.count > 5);
  88. Thread.Sleep (200);
  89. Assert.AreEqual (c, bucket.count);
  90. }
  91. [Test] // bug #78208
  92. public void TestDispose2 ()
  93. {
  94. Timer t = new Timer (new TimerCallback (Callback), null, 10, 10);
  95. t.Dispose ();
  96. t.Dispose ();
  97. }
  98. [Test]
  99. public void TestHeavyCreationLoad() {
  100. Bucket b = new Bucket();
  101. for (int i = 0; i < 500; ++i)
  102. new Timer(new TimerCallback(Callback),b,10,Timeout.Infinite);
  103. // 1000 * 10 msec = 10,000 msec or 10 sec - if everything goes well
  104. // we add some slack to cope with timing issues caused by system load etc.
  105. for (int i = 0; i < 20; ++i) {
  106. if (b.count == 500)
  107. break;
  108. Thread.Sleep(1000);
  109. }
  110. Assert.AreEqual(500,b.count);
  111. }
  112. [Test]
  113. public void TestQuickDisposeDeadlockBug() {
  114. int i = 0;
  115. Bucket b = new Bucket();
  116. ArrayList timers = new ArrayList();
  117. while (i < 500) {
  118. Timer t = new Timer(new TimerCallback(Callback),b,10,Timeout.Infinite);
  119. timers.Add(t);
  120. i++;
  121. t.Dispose();
  122. }
  123. Thread.Sleep(11*500);
  124. }
  125. [Test]
  126. public void TestInt32MaxDelay() {
  127. Bucket b = new Bucket();
  128. new Timer(new TimerCallback(Callback),b,Int32.MaxValue,Timeout.Infinite);
  129. Thread.Sleep(50);
  130. Assert.AreEqual(0,b.count);
  131. }
  132. [Test]
  133. public void TestInt32MaxPeriod() {
  134. Bucket b = new Bucket();
  135. new Timer(new TimerCallback(Callback),b,0,Int32.MaxValue);
  136. Thread.Sleep(50);
  137. Assert.AreEqual(1,b.count);
  138. }
  139. [Test]
  140. public void TestNegativeDelay() {
  141. Bucket b = new Bucket();
  142. try {
  143. new Timer(new TimerCallback(Callback),b,-10,Timeout.Infinite);
  144. } catch (ArgumentOutOfRangeException) {
  145. return;
  146. }
  147. Assert.Fail();
  148. }
  149. [Test]
  150. public void TestNegativePeriod() {
  151. Bucket b = new Bucket();
  152. try {
  153. new Timer(new TimerCallback(Callback),b,0,-10);
  154. } catch (ArgumentOutOfRangeException) {
  155. return;
  156. }
  157. Assert.Fail();
  158. }
  159. [Test]
  160. public void TestDelayZeroPeriodZero() {
  161. Bucket b = new Bucket();
  162. Timer t = new Timer(new TimerCallback(Callback),b,0,0);
  163. Thread.Sleep(100);
  164. t.Change (int.MaxValue, Timeout.Infinite);
  165. // since period is 0 the callback should happen once (bug #340212)
  166. Assert.IsTrue(b.count == 1);
  167. }
  168. [Category("NotWorking")]
  169. public void TestDisposeOnCallback () {
  170. Timer t1 = null;
  171. t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), t1, 0, 10);
  172. Thread.Sleep (200);
  173. Assert.IsNull(t1);
  174. }
  175. private void CallbackTestDisposeOnCallback (object foo)
  176. {
  177. ((Timer)foo).Dispose();
  178. }
  179. private void Callback (object foo)
  180. {
  181. Bucket b = foo as Bucket;
  182. b.count++;
  183. }
  184. }
  185. }