CurrentThreadSchedulerTest.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Diagnostics;
  6. using System.Reactive.Concurrency;
  7. using System.Threading;
  8. using Microsoft.Reactive.Testing;
  9. using Microsoft.VisualStudio.TestTools.UnitTesting;
  10. using Assert = Xunit.Assert;
  11. namespace ReactiveTests.Tests
  12. {
  13. [TestClass]
  14. public class CurrentThreadSchedulerTest
  15. {
  16. [TestMethod]
  17. public void CurrentThread_ArgumentChecking()
  18. {
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(TimeSpan), default));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(DateTimeOffset), default));
  22. }
  23. [TestMethod]
  24. public void CurrentThread_Now()
  25. {
  26. var res = Scheduler.CurrentThread.Now - DateTime.Now;
  27. Assert.True(res.Seconds < 1);
  28. }
  29. #if !NO_THREAD
  30. [TestMethod]
  31. public void CurrentThread_ScheduleAction()
  32. {
  33. var id = Thread.CurrentThread.ManagedThreadId;
  34. var ran = false;
  35. Scheduler.CurrentThread.Schedule(() => { Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  36. Assert.True(ran);
  37. }
  38. #endif
  39. [TestMethod]
  40. public void CurrentThread_ScheduleActionError()
  41. {
  42. var ex = new Exception();
  43. try
  44. {
  45. Scheduler.CurrentThread.Schedule(() => { throw ex; });
  46. Assert.True(false);
  47. }
  48. catch (Exception e)
  49. {
  50. Assert.Same(e, ex);
  51. }
  52. }
  53. #if !NO_THREAD
  54. [TestMethod]
  55. public void CurrentThread_ScheduleActionNested()
  56. {
  57. var id = Thread.CurrentThread.ManagedThreadId;
  58. var ran = false;
  59. Scheduler.CurrentThread.Schedule(() =>
  60. {
  61. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  62. Scheduler.CurrentThread.Schedule(() => { ran = true; });
  63. });
  64. Assert.True(ran);
  65. }
  66. [TestMethod]
  67. public void CurrentThread_ScheduleActionNested_TimeSpan()
  68. {
  69. var id = Thread.CurrentThread.ManagedThreadId;
  70. var ran = false;
  71. Scheduler.CurrentThread.Schedule(() =>
  72. {
  73. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  74. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(1), () => { ran = true; });
  75. });
  76. Assert.True(ran);
  77. }
  78. [TestMethod]
  79. public void CurrentThread_ScheduleActionDue()
  80. {
  81. var id = Thread.CurrentThread.ManagedThreadId;
  82. var ran = false;
  83. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => { Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  84. Assert.True(ran, "ran");
  85. }
  86. [TestMethod]
  87. public void CurrentThread_ScheduleActionDueNested()
  88. {
  89. var id = Thread.CurrentThread.ManagedThreadId;
  90. var ran = false;
  91. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () =>
  92. {
  93. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  94. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () =>
  95. {
  96. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  97. ran = true;
  98. });
  99. });
  100. Assert.True(ran, "ran");
  101. }
  102. #endif
  103. [TestMethod]
  104. public void CurrentThread_EnsureTrampoline()
  105. {
  106. var ran1 = false;
  107. var ran2 = false;
  108. Scheduler.CurrentThread.EnsureTrampoline(() =>
  109. {
  110. Scheduler.CurrentThread.Schedule(() => { ran1 = true; });
  111. Scheduler.CurrentThread.Schedule(() => { ran2 = true; });
  112. });
  113. Assert.True(ran1);
  114. Assert.True(ran2);
  115. }
  116. [TestMethod]
  117. public void CurrentThread_EnsureTrampoline_Nested()
  118. {
  119. var ran1 = false;
  120. var ran2 = false;
  121. Scheduler.CurrentThread.EnsureTrampoline(() =>
  122. {
  123. Scheduler.CurrentThread.EnsureTrampoline(() => { ran1 = true; });
  124. Scheduler.CurrentThread.EnsureTrampoline(() => { ran2 = true; });
  125. });
  126. Assert.True(ran1);
  127. Assert.True(ran2);
  128. }
  129. [TestMethod]
  130. public void CurrentThread_EnsureTrampolineAndCancel()
  131. {
  132. var ran1 = false;
  133. var ran2 = false;
  134. Scheduler.CurrentThread.EnsureTrampoline(() =>
  135. {
  136. Scheduler.CurrentThread.Schedule(() =>
  137. {
  138. ran1 = true;
  139. var d = Scheduler.CurrentThread.Schedule(() => { ran2 = true; });
  140. d.Dispose();
  141. });
  142. });
  143. Assert.True(ran1);
  144. Assert.False(ran2);
  145. }
  146. [TestMethod]
  147. public void CurrentThread_EnsureTrampolineAndCancelTimed()
  148. {
  149. var ran1 = false;
  150. var ran2 = false;
  151. Scheduler.CurrentThread.EnsureTrampoline(() =>
  152. {
  153. Scheduler.CurrentThread.Schedule(() =>
  154. {
  155. ran1 = true;
  156. var d = Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(1), () => { ran2 = true; });
  157. d.Dispose();
  158. });
  159. });
  160. Assert.True(ran1);
  161. Assert.False(ran2);
  162. }
  163. }
  164. }