TimerTest.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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. [TestFixture]
  16. public class TimerTest {
  17. // this bucket is used to avoid non-theadlocal issues
  18. class Bucket {
  19. public int count;
  20. }
  21. [SetUp]
  22. public void Setup ()
  23. {
  24. //creating a timer that will never run just to make sure the
  25. // scheduler is warm for the unit tests
  26. // this makes fair for the "DueTime" test since it
  27. // doesn't have to wait for the scheduler thread to be
  28. // created.
  29. new Timer (new TimerCallback (DoNothing), null, Timeout.Infinite, 0);
  30. }
  31. void DoNothing (object foo)
  32. {
  33. }
  34. [Test]
  35. public void TestDueTime ()
  36. {
  37. Bucket bucket = new Bucket();
  38. Timer t = new Timer (new TimerCallback (Callback), bucket, 200, Timeout.Infinite);
  39. Thread.Sleep (50);
  40. Assert.AreEqual (0, bucket.count, "#1");
  41. Thread.Sleep (200);
  42. Assert.AreEqual (1, bucket.count, "#2");
  43. Thread.Sleep (500);
  44. Assert.AreEqual (1, bucket.count, "#3");
  45. t.Change (10, 10);
  46. Thread.Sleep (1000);
  47. Assert.IsTrue(bucket.count > 20, "#4");
  48. t.Dispose ();
  49. }
  50. [Test]
  51. public void TestChange ()
  52. {
  53. Bucket bucket = new Bucket();
  54. Timer t = new Timer (new TimerCallback (Callback), bucket, 1, 1);
  55. Thread.Sleep (500);
  56. int c = bucket.count;
  57. Assert.IsTrue(c > 20, "#1");
  58. t.Change (100, 100);
  59. Thread.Sleep (500);
  60. Assert.IsTrue(bucket.count <= c + 20, "#2");
  61. t.Dispose ();
  62. }
  63. [Test]
  64. public void TestZeroDueTime ()
  65. {
  66. Bucket bucket = new Bucket();
  67. Timer t = new Timer (new TimerCallback (Callback), bucket, 0, Timeout.Infinite);
  68. Thread.Sleep (100);
  69. Assert.AreEqual (1, bucket.count, "#1");
  70. t.Change (0, Timeout.Infinite);
  71. Thread.Sleep (100);
  72. Assert.AreEqual (2, bucket.count, "#2");
  73. t.Dispose ();
  74. }
  75. [Test]
  76. public void TestDispose ()
  77. {
  78. Bucket bucket = new Bucket();
  79. Timer t = new Timer (new TimerCallback (Callback), bucket, 10, 10);
  80. Thread.Sleep (200);
  81. t.Dispose ();
  82. Thread.Sleep (20);
  83. int c = bucket.count;
  84. Assert.IsTrue (bucket.count > 5, "#1");
  85. Thread.Sleep (200);
  86. Assert.AreEqual (c, bucket.count, "#2");
  87. }
  88. [Test] // bug #320950
  89. public void TestDispose2 ()
  90. {
  91. Timer t = new Timer (new TimerCallback (Callback), null, 10, 10);
  92. t.Dispose ();
  93. t.Dispose ();
  94. }
  95. [Test]
  96. public void TestHeavyCreationLoad ()
  97. {
  98. Bucket b = new Bucket ();
  99. for (int i = 0; i < 500; ++i)
  100. new Timer (new TimerCallback (Callback), b, 10,
  101. Timeout.Infinite);
  102. // 1000 * 10 msec = 10,000 msec or 10 sec - if everything goes well
  103. // we add some slack to cope with timing issues caused by system load etc.
  104. for (int i = 0; i < 20; ++i) {
  105. if (b.count == 500)
  106. break;
  107. Thread.Sleep (1000);
  108. }
  109. Assert.AreEqual (500, b.count);
  110. }
  111. [Test]
  112. public void TestQuickDisposeDeadlockBug ()
  113. {
  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),
  119. b, 10, Timeout.Infinite);
  120. timers.Add (t);
  121. i++;
  122. t.Dispose ();
  123. }
  124. Thread.Sleep (11 * 500);
  125. }
  126. [Test]
  127. public void TestInt32MaxDelay ()
  128. {
  129. Bucket b = new Bucket ();
  130. new Timer (new TimerCallback (Callback), b, Int32.MaxValue,
  131. Timeout.Infinite);
  132. Thread.Sleep (50);
  133. Assert.AreEqual (0, b.count);
  134. }
  135. [Test]
  136. public void TestInt32MaxPeriod ()
  137. {
  138. Bucket b = new Bucket ();
  139. new Timer (new TimerCallback (Callback), b, 0,
  140. Int32.MaxValue);
  141. Thread.Sleep (50);
  142. Assert.AreEqual (1, b.count);
  143. }
  144. [Test]
  145. public void TestNegativeDelay ()
  146. {
  147. Bucket b = new Bucket ();
  148. try {
  149. new Timer (new TimerCallback (Callback), b, -10,
  150. Timeout.Infinite);
  151. Assert.Fail ();
  152. } catch (ArgumentOutOfRangeException) {
  153. return;
  154. }
  155. }
  156. [Test]
  157. public void TestNegativePeriod ()
  158. {
  159. Bucket b = new Bucket ();
  160. try {
  161. new Timer (new TimerCallback (Callback), b, 0,
  162. -10);
  163. Assert.Fail ();
  164. } catch (ArgumentOutOfRangeException) {
  165. return;
  166. }
  167. }
  168. [Test]
  169. public void TestDelayZeroPeriodZero()
  170. {
  171. Bucket b = new Bucket();
  172. Timer t = new Timer(new TimerCallback(Callback),b,0,0);
  173. Thread.Sleep(100);
  174. t.Change (int.MaxValue, Timeout.Infinite);
  175. // since period is 0 the callback should happen once (bug #340212)
  176. Assert.IsTrue(b.count == 1);
  177. }
  178. [Test]
  179. public void TestDisposeOnCallback ()
  180. {
  181. Timer t1 = null;
  182. t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), t1, 0, 10);
  183. Thread.Sleep (200);
  184. Assert.IsNotNull (t1);
  185. }
  186. private void CallbackTestDisposeOnCallback (object foo)
  187. {
  188. ((Timer) foo).Dispose ();
  189. }
  190. private void Callback (object foo)
  191. {
  192. Bucket b = foo as Bucket;
  193. Interlocked.Increment (ref b.count);
  194. }
  195. [Test]
  196. [ExpectedException (typeof (ArgumentNullException))]
  197. public void DisposeNullWaitHandle ()
  198. {
  199. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  200. t.Dispose (null);
  201. }
  202. }
  203. [Test]
  204. public void Change_IntInt_Infinite ()
  205. {
  206. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  207. t.Change ((int)Timeout.Infinite, (int)Timeout.Infinite);
  208. }
  209. }
  210. [Test]
  211. public void Change_IntInt_MaxValue ()
  212. {
  213. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  214. t.Change (Int32.MaxValue, Int32.MaxValue);
  215. }
  216. }
  217. [Test]
  218. public void Change_UIntUInt_Infinite ()
  219. {
  220. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  221. t.Change (unchecked ((uint) Timeout.Infinite), unchecked ((uint) Timeout.Infinite));
  222. }
  223. }
  224. [Test]
  225. public void Change_UIntUInt_MaxValue ()
  226. {
  227. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  228. // UInt32.MaxValue == Timeout.Infinite == 0xffffffff
  229. t.Change (UInt32.MaxValue, UInt32.MaxValue);
  230. }
  231. }
  232. [Test]
  233. public void Change_LongLong_Infinite ()
  234. {
  235. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  236. t.Change ((long) Timeout.Infinite, (long) Timeout.Infinite);
  237. }
  238. }
  239. [Test]
  240. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  241. public void Change_LongLong_MaxValue ()
  242. {
  243. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  244. t.Change (Int64.MaxValue, Int64.MaxValue);
  245. }
  246. }
  247. [Test]
  248. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  249. public void Change_LongLong_UInt32MaxValue ()
  250. {
  251. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  252. // not identical to (long)-1
  253. t.Change ((long)UInt32.MaxValue, (long)UInt32.MaxValue);
  254. }
  255. }
  256. [Test]
  257. public void Change_LongLong_UInt32MaxValueMinusOne ()
  258. {
  259. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  260. // not identical to (long)-1
  261. t.Change ((long) UInt32.MaxValue - 1, (long) UInt32.MaxValue -1);
  262. }
  263. }
  264. [Test]
  265. public void Change_TimeSpanTimeSpan_Infinite ()
  266. {
  267. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  268. t.Change (new TimeSpan (-1), new TimeSpan (-1));
  269. }
  270. }
  271. [Test]
  272. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  273. public void Change_TimeSpanTimeSpan_MaxValue ()
  274. {
  275. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  276. t.Change (TimeSpan.MaxValue, TimeSpan.MaxValue);
  277. }
  278. }
  279. [Test]
  280. public void Change_TimeSpanTimeSpan_UInt32MaxValue ()
  281. {
  282. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  283. t.Change (new TimeSpan (UInt32.MaxValue), new TimeSpan (UInt32.MaxValue));
  284. }
  285. }
  286. }
  287. }