Browse Source

Adding tests for work stealing behavior of LocalScheduler.

Bart De Smet 10 years ago
parent
commit
c4d6b7deb3

+ 41 - 1
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs

@@ -4,6 +4,7 @@ using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Reactive.Concurrency;
+using System.Reactive.Disposables;
 using System.Threading;
 using Microsoft.Reactive.Testing;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -184,7 +185,6 @@ namespace ReactiveTests.Tests
             results.AssertEqual(0, 1, 2);
         }
 
-
         [TestMethod]
         public void EventLoop_ScheduleTimeAndOrderedInFlightActions()
         {
@@ -381,5 +381,45 @@ namespace ReactiveTests.Tests
             EventLoop.NoSemaphoreFullException();
         }
 #endif
+
+#if !NO_CDS && DESKTOPCLR
+        [TestMethod]
+        public void EventLoop_CorrectWorkStealing()
+        {
+            const int workItemCount = 100;
+
+            var failureCount = 0;
+            var countdown = new CountdownEvent(workItemCount);
+            var dueTime = DateTimeOffset.Now + TimeSpan.FromSeconds(1);
+
+            using (var d = new CompositeDisposable())
+            {
+                for (var i = 0; i < workItemCount; i++)
+                {
+                    var scheduler = new EventLoopScheduler();
+
+                    scheduler.Schedule(() =>
+                    {
+                        var schedulerThread = Thread.CurrentThread;
+
+                        scheduler.Schedule(dueTime, () =>
+                        {
+                            if (Thread.CurrentThread != schedulerThread)
+                            {
+                                Interlocked.Increment(ref failureCount);
+                            }
+                            countdown.Signal();
+                        });
+                    });
+
+                    d.Add(scheduler);
+                }
+
+                countdown.Wait();
+            }
+
+            Assert.AreEqual(0, failureCount);
+        }
+#endif
     }
 }