PageRenderTime 26ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/mcs/class/corlib/Test/System.Threading/TimerTest.cs

https://github.com/schani/mono
C# | 327 lines | 268 code | 35 blank | 24 comment | 5 complexity | b17ab2b594e1fefdd330501814966c2c MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0, Unlicense
  1. //
  2. // TimerTest.cs - NUnit test cases for System.Threading.Timer
  3. //
  4. // Author:
  5. // Zoltan Varga (vargaz@freemail.hu)
  6. // Rafael Ferreira (raf@ophion.org)
  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, 10, 10);
  55. Thread.Sleep (500);
  56. int c = bucket.count;
  57. Assert.IsTrue (c > 20, "#1 " + c.ToString ());
  58. t.Change (100, 100);
  59. c = bucket.count;
  60. Thread.Sleep (500);
  61. Assert.IsTrue (bucket.count <= c + 20, "#2 " + c.ToString ());
  62. t.Dispose ();
  63. }
  64. [Test]
  65. public void TestZeroDueTime ()
  66. {
  67. Bucket bucket = new Bucket();
  68. Timer t = new Timer (new TimerCallback (Callback), bucket, 0, Timeout.Infinite);
  69. Thread.Sleep (100);
  70. Assert.AreEqual (1, bucket.count, "#1");
  71. t.Change (0, Timeout.Infinite);
  72. Thread.Sleep (100);
  73. Assert.AreEqual (2, bucket.count, "#2");
  74. t.Dispose ();
  75. }
  76. [Test]
  77. public void TestDispose ()
  78. {
  79. Bucket bucket = new Bucket();
  80. Timer t = new Timer (new TimerCallback (Callback), bucket, 10, 10);
  81. Thread.Sleep (200);
  82. t.Dispose ();
  83. Thread.Sleep (20);
  84. int c = bucket.count;
  85. Assert.IsTrue (bucket.count > 5, "#1");
  86. Thread.Sleep (200);
  87. Assert.AreEqual (c, bucket.count, "#2");
  88. }
  89. [Test] // bug #320950
  90. public void TestDispose2 ()
  91. {
  92. Timer t = new Timer (new TimerCallback (Callback), null, 10, 10);
  93. t.Dispose ();
  94. t.Dispose ();
  95. }
  96. [Test]
  97. public void TestHeavyCreationLoad ()
  98. {
  99. Bucket b = new Bucket ();
  100. for (int i = 0; i < 500; ++i)
  101. new Timer (new TimerCallback (Callback), b, 10,
  102. 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. {
  115. int i = 0;
  116. Bucket b = new Bucket ();
  117. ArrayList timers = new ArrayList();
  118. while (i < 500) {
  119. Timer t = new Timer (new TimerCallback (Callback),
  120. b, 10, Timeout.Infinite);
  121. timers.Add (t);
  122. i++;
  123. t.Dispose ();
  124. }
  125. Thread.Sleep (11 * 500);
  126. }
  127. [Test]
  128. public void TestInt32MaxDelay ()
  129. {
  130. Bucket b = new Bucket ();
  131. new Timer (new TimerCallback (Callback), b, Int32.MaxValue,
  132. Timeout.Infinite);
  133. Thread.Sleep (50);
  134. Assert.AreEqual (0, b.count);
  135. }
  136. [Test]
  137. public void TestInt32MaxPeriod ()
  138. {
  139. Bucket b = new Bucket ();
  140. new Timer (new TimerCallback (Callback), b, 0,
  141. Int32.MaxValue);
  142. Thread.Sleep (50);
  143. Assert.AreEqual (1, b.count);
  144. }
  145. [Test]
  146. public void TestNegativeDelay ()
  147. {
  148. Bucket b = new Bucket ();
  149. try {
  150. new Timer (new TimerCallback (Callback), b, -10,
  151. Timeout.Infinite);
  152. Assert.Fail ();
  153. } catch (ArgumentOutOfRangeException) {
  154. return;
  155. }
  156. }
  157. [Test]
  158. public void TestNegativePeriod ()
  159. {
  160. Bucket b = new Bucket ();
  161. try {
  162. new Timer (new TimerCallback (Callback), b, 0,
  163. -10);
  164. Assert.Fail ();
  165. } catch (ArgumentOutOfRangeException) {
  166. return;
  167. }
  168. }
  169. [Test]
  170. public void TestDelayZeroPeriodZero()
  171. {
  172. Bucket b = new Bucket();
  173. Timer t = new Timer(new TimerCallback(Callback),b,0,0);
  174. Thread.Sleep(100);
  175. t.Change (int.MaxValue, Timeout.Infinite);
  176. // since period is 0 the callback should happen once (bug #340212)
  177. Assert.AreEqual (1, b.count, "only once");
  178. }
  179. [Test]
  180. [Ignore ()]
  181. public void TestDisposeOnCallback ()
  182. {
  183. // this test is bad, as the provided `state` (t1) is null and will throw an NRE inside the callback
  184. // that was ignored before 238785a3e3d510528228fc551625975bc508c2f3 and most unit test runner won't
  185. // report it since the NRE will not happen on the main thread (but Touch.Unit will)
  186. Timer t1 = null;
  187. t1 = new Timer (new TimerCallback (CallbackTestDisposeOnCallback), t1, 0, 10);
  188. Thread.Sleep (200);
  189. Assert.IsNotNull (t1);
  190. }
  191. private void CallbackTestDisposeOnCallback (object foo)
  192. {
  193. ((Timer) foo).Dispose ();
  194. }
  195. private void Callback (object foo)
  196. {
  197. Bucket b = foo as Bucket;
  198. Interlocked.Increment (ref b.count);
  199. }
  200. [Test]
  201. [ExpectedException (typeof (ArgumentNullException))]
  202. public void DisposeNullWaitHandle ()
  203. {
  204. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  205. t.Dispose (null);
  206. }
  207. }
  208. [Test]
  209. public void Change_IntInt_Infinite ()
  210. {
  211. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  212. t.Change ((int)Timeout.Infinite, (int)Timeout.Infinite);
  213. }
  214. }
  215. [Test]
  216. public void Change_IntInt_MaxValue ()
  217. {
  218. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  219. t.Change (Int32.MaxValue, Int32.MaxValue);
  220. }
  221. }
  222. [Test]
  223. public void Change_UIntUInt_Infinite ()
  224. {
  225. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  226. t.Change (unchecked ((uint) Timeout.Infinite), unchecked ((uint) Timeout.Infinite));
  227. }
  228. }
  229. [Test]
  230. public void Change_UIntUInt_MaxValue ()
  231. {
  232. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  233. // UInt32.MaxValue == Timeout.Infinite == 0xffffffff
  234. t.Change (UInt32.MaxValue, UInt32.MaxValue);
  235. }
  236. }
  237. [Test]
  238. public void Change_LongLong_Infinite ()
  239. {
  240. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  241. t.Change ((long) Timeout.Infinite, (long) Timeout.Infinite);
  242. }
  243. }
  244. [Test]
  245. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  246. public void Change_LongLong_MaxValue ()
  247. {
  248. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  249. t.Change (Int64.MaxValue, Int64.MaxValue);
  250. }
  251. }
  252. [Test]
  253. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  254. public void Change_LongLong_UInt32MaxValue ()
  255. {
  256. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  257. // not identical to (long)-1
  258. t.Change ((long)UInt32.MaxValue, (long)UInt32.MaxValue);
  259. }
  260. }
  261. [Test]
  262. public void Change_LongLong_UInt32MaxValueMinusOne ()
  263. {
  264. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  265. // not identical to (long)-1
  266. t.Change ((long) UInt32.MaxValue - 1, (long) UInt32.MaxValue -1);
  267. }
  268. }
  269. [Test]
  270. public void Change_TimeSpanTimeSpan_Infinite ()
  271. {
  272. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  273. t.Change (new TimeSpan (-1), new TimeSpan (-1));
  274. }
  275. }
  276. [Test]
  277. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  278. public void Change_TimeSpanTimeSpan_MaxValue ()
  279. {
  280. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  281. t.Change (TimeSpan.MaxValue, TimeSpan.MaxValue);
  282. }
  283. }
  284. [Test]
  285. public void Change_TimeSpanTimeSpan_UInt32MaxValue ()
  286. {
  287. using (Timer t = new Timer (DoNothing, null, 0, 0)) {
  288. t.Change (new TimeSpan (UInt32.MaxValue), new TimeSpan (UInt32.MaxValue));
  289. }
  290. }
  291. }
  292. }