Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/rx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Rx.NET/Tests.System.Reactive/Tests/TaskPoolSchedulerTest.cs')
-rw-r--r--Rx.NET/Tests.System.Reactive/Tests/TaskPoolSchedulerTest.cs165
1 files changed, 165 insertions, 0 deletions
diff --git a/Rx.NET/Tests.System.Reactive/Tests/TaskPoolSchedulerTest.cs b/Rx.NET/Tests.System.Reactive/Tests/TaskPoolSchedulerTest.cs
new file mode 100644
index 0000000..ba21aae
--- /dev/null
+++ b/Rx.NET/Tests.System.Reactive/Tests/TaskPoolSchedulerTest.cs
@@ -0,0 +1,165 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !NO_TPL
+using System;
+using System.Reactive.Concurrency;
+using System.Threading;
+using Microsoft.Reactive.Testing;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace ReactiveTests.Tests
+{
+ [TestClass]
+ public class TaskPoolSchedulerTest
+ {
+ [TestMethod]
+ public void TaskPool_ArgumentChecking()
+ {
+ ReactiveAssert.Throws<ArgumentNullException>(() => new TaskPoolScheduler(null));
+ ReactiveAssert.Throws<ArgumentNullException>(() => TaskPoolScheduler.Default.Schedule<int>(42, default(Func<IScheduler, int, IDisposable>)));
+ ReactiveAssert.Throws<ArgumentNullException>(() => TaskPoolScheduler.Default.Schedule<int>(42, DateTimeOffset.Now, default(Func<IScheduler, int, IDisposable>)));
+ ReactiveAssert.Throws<ArgumentNullException>(() => TaskPoolScheduler.Default.Schedule<int>(42, TimeSpan.Zero, default(Func<IScheduler, int, IDisposable>)));
+ ReactiveAssert.Throws<ArgumentNullException>(() => TaskPoolScheduler.Default.SchedulePeriodic(42, TimeSpan.FromSeconds(1), default(Func<int, int>)));
+ ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => TaskPoolScheduler.Default.SchedulePeriodic(42, TimeSpan.FromSeconds(-1), _ => _));
+ }
+
+ [TestMethod]
+ public void TaskPool_Now()
+ {
+ var res = TaskPoolScheduler.Default.Now - DateTime.Now;
+ Assert.IsTrue(res.Seconds < 1);
+ }
+
+ [TestMethod]
+ public void TaskPool_ScheduleAction()
+ {
+ var id = Thread.CurrentThread.ManagedThreadId;
+ var nt = TaskPoolScheduler.Default;
+ var evt = new ManualResetEvent(false);
+ nt.Schedule(() => { Assert.AreNotEqual(id, Thread.CurrentThread.ManagedThreadId); evt.Set(); });
+ evt.WaitOne();
+ }
+
+ [TestMethod]
+ public void TaskPool_ScheduleActionDueNow()
+ {
+ var id = Thread.CurrentThread.ManagedThreadId;
+ var nt = TaskPoolScheduler.Default;
+ var evt = new ManualResetEvent(false);
+ nt.Schedule(TimeSpan.Zero, () => { Assert.AreNotEqual(id, Thread.CurrentThread.ManagedThreadId); evt.Set(); });
+ evt.WaitOne();
+ }
+
+ [TestMethod]
+ public void TaskPool_ScheduleActionDue()
+ {
+ var id = Thread.CurrentThread.ManagedThreadId;
+ var nt = TaskPoolScheduler.Default;
+ var evt = new ManualResetEvent(false);
+ nt.Schedule(TimeSpan.FromMilliseconds(1), () => { Assert.AreNotEqual(id, Thread.CurrentThread.ManagedThreadId); evt.Set(); });
+ evt.WaitOne();
+ }
+
+ [TestMethod]
+ public void TaskPool_ScheduleActionCancel()
+ {
+ var id = Thread.CurrentThread.ManagedThreadId;
+ var nt = TaskPoolScheduler.Default;
+ var set = false;
+ var d = nt.Schedule(TimeSpan.FromSeconds(0.2), () => { Assert.Fail(); set = true; });
+ d.Dispose();
+ Thread.Sleep(400);
+ Assert.IsFalse(set);
+ }
+
+#if !NO_PERF
+ [TestMethod]
+ public void TaskPool_ScheduleLongRunning()
+ {
+ var n = 0;
+ var e = new ManualResetEvent(false);
+ var gate = new object();
+
+ var d = TaskPoolScheduler.Default.ScheduleLongRunning(42, (x, cancel) =>
+ {
+ while (!cancel.IsDisposed)
+ lock (gate)
+ n++;
+ e.Set();
+ });
+
+ while (true)
+ {
+ lock (gate)
+ if (n >= 10)
+ break;
+
+ Thread.Sleep(10);
+ }
+
+ d.Dispose();
+ e.WaitOne();
+
+ Assert.IsTrue(n >= 0);
+ }
+#endif
+
+#if !NO_PERF
+#if !NO_STOPWATCH
+ [TestMethod]
+ public void Stopwatch()
+ {
+ StopwatchTest.Run(TaskPoolScheduler.Default);
+ }
+#endif
+#endif
+
+ [TestMethod]
+ public void TaskPool_Periodic()
+ {
+ var n = 0;
+ var e = new ManualResetEvent(false);
+
+ var d = TaskPoolScheduler.Default.SchedulePeriodic(TimeSpan.FromMilliseconds(25), () =>
+ {
+ if (Interlocked.Increment(ref n) == 10)
+ e.Set();
+ });
+
+ if (!e.WaitOne(10000))
+ Assert.Fail();
+
+ d.Dispose();
+ }
+
+ [TestMethod]
+ public void TaskPool_Periodic_NonReentrant()
+ {
+ var n = 0;
+ var fail = false;
+
+ var d = TaskPoolScheduler.Default.SchedulePeriodic(0, TimeSpan.FromMilliseconds(50), x =>
+ {
+ try
+ {
+ if (Interlocked.Increment(ref n) > 1) // Without an AsyncLock this would fail.
+ fail = true;
+
+ Thread.Sleep(100);
+
+ return x + 1;
+ }
+ finally
+ {
+ Interlocked.Decrement(ref n);
+ }
+ });
+
+ Thread.Sleep(500);
+ d.Dispose();
+
+ Assert.IsFalse(fail);
+ }
+ }
+}
+#endif \ No newline at end of file