CurrentThreadSchedulerTest.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 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 Xunit;
  9. using Microsoft.Reactive.Testing;
  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(Func<IScheduler, int, IDisposable>)));
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(TimeSpan), default(Func<IScheduler, int, IDisposable>)));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(DateTimeOffset), default(Func<IScheduler, int, IDisposable>)));
  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. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  59. Scheduler.CurrentThread.Schedule(() => { ran = true; });
  60. });
  61. Assert.True(ran);
  62. }
  63. [Fact]
  64. public void CurrentThread_ScheduleActionNested_TimeSpan()
  65. {
  66. var id = Thread.CurrentThread.ManagedThreadId;
  67. var ran = false;
  68. Scheduler.CurrentThread.Schedule(() =>
  69. {
  70. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  71. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(1), () => { ran = true; });
  72. });
  73. Assert.True(ran);
  74. }
  75. #if !SILVERLIGHT
  76. [Fact(Skip ="")]
  77. public void CurrentThread_ScheduleActionDue()
  78. {
  79. var id = Thread.CurrentThread.ManagedThreadId;
  80. var ran = false;
  81. var sw = new Stopwatch();
  82. sw.Start();
  83. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => { sw.Stop(); Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  84. Assert.True(ran, "ran");
  85. Assert.True(sw.ElapsedMilliseconds > 180, "due " + sw.ElapsedMilliseconds);
  86. }
  87. [Fact(Skip = "")]
  88. public void CurrentThread_ScheduleActionDueNested()
  89. {
  90. var id = Thread.CurrentThread.ManagedThreadId;
  91. var ran = false;
  92. var sw = new Stopwatch();
  93. sw.Start();
  94. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => {
  95. sw.Stop();
  96. Assert.Equal(id, Thread.CurrentThread.ManagedThreadId);
  97. sw.Start();
  98. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => {
  99. sw.Stop();
  100. ran = true;
  101. });
  102. });
  103. Assert.True(ran, "ran");
  104. Assert.True(sw.ElapsedMilliseconds > 380, "due " + sw.ElapsedMilliseconds);
  105. }
  106. #endif
  107. #endif
  108. [Fact]
  109. public void CurrentThread_EnsureTrampoline()
  110. {
  111. var ran1 = false;
  112. var ran2 = false;
  113. Scheduler.CurrentThread.EnsureTrampoline(() => {
  114. Scheduler.CurrentThread.Schedule(() => { ran1 = true; });
  115. Scheduler.CurrentThread.Schedule(() => { ran2 = true; });
  116. });
  117. Assert.True(ran1);
  118. Assert.True(ran2);
  119. }
  120. [Fact]
  121. public void CurrentThread_EnsureTrampoline_Nested()
  122. {
  123. var ran1 = false;
  124. var ran2 = false;
  125. Scheduler.CurrentThread.EnsureTrampoline(() =>
  126. {
  127. Scheduler.CurrentThread.EnsureTrampoline(() => { ran1 = true; });
  128. Scheduler.CurrentThread.EnsureTrampoline(() => { ran2 = true; });
  129. });
  130. Assert.True(ran1);
  131. Assert.True(ran2);
  132. }
  133. [Fact]
  134. public void CurrentThread_EnsureTrampolineAndCancel()
  135. {
  136. var ran1 = false;
  137. var ran2 = false;
  138. Scheduler.CurrentThread.EnsureTrampoline(() =>
  139. {
  140. Scheduler.CurrentThread.Schedule(() => {
  141. ran1 = true;
  142. var d = Scheduler.CurrentThread.Schedule(() => { ran2 = true; });
  143. d.Dispose();
  144. });
  145. });
  146. Assert.True(ran1);
  147. Assert.False(ran2);
  148. }
  149. [Fact]
  150. public void CurrentThread_EnsureTrampolineAndCancelTimed()
  151. {
  152. var ran1 = false;
  153. var ran2 = false;
  154. Scheduler.CurrentThread.EnsureTrampoline(() =>
  155. {
  156. Scheduler.CurrentThread.Schedule(() =>
  157. {
  158. ran1 = true;
  159. var d = Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(1), () => { ran2 = true; });
  160. d.Dispose();
  161. });
  162. });
  163. Assert.True(ran1);
  164. Assert.False(ran2);
  165. }
  166. }
  167. }