1
0

CurrentThreadSchedulerTest.cs 5.7 KB

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