public async Task Sched_AC_Turn_Execution_Order() { // Can we add a unit test that basicaly checks that any turn is indeed run till completion before any other turn? // For example, you have a long running main turn and in the middle it spawns a lot of short CWs (on Done promise) and StartNew. // You test that no CW/StartNew runs until the main turn is fully done. And run in stress. UnitTestSchedulingContext context = new UnitTestSchedulingContext(); orleansTaskScheduler = TestInternalHelper.InitializeSchedulerForTesting(context, this.performanceMetrics); var result1 = new TaskCompletionSource <bool>(); var result2 = new TaskCompletionSource <bool>(); orleansTaskScheduler.QueueWorkItem(new ClosureWorkItem(() => { mainDone = false; stageNum1 = stageNum2 = 0; Task task1 = Task.Factory.StartNew(() => SubProcess1(11)); Task task2 = task1.ContinueWith((_) => SubProcess1(12)); Task task3 = task2.ContinueWith((_) => SubProcess1(13)); Task task4 = task3.ContinueWith((_) => { SubProcess1(14); result1.SetResult(true); }); task4.Ignore(); Task task21 = Task.CompletedTask.ContinueWith((_) => SubProcess2(21)); Task task22 = task21.ContinueWith((_) => { SubProcess2(22); result2.SetResult(true); }); task22.Ignore(); Thread.Sleep(TimeSpan.FromSeconds(1)); mainDone = true; }), context); try { await result1.Task.WithTimeout(TimeSpan.FromSeconds(3)); } catch (TimeoutException) { Assert.True(false, "Timeout-1"); } try { await result2.Task.WithTimeout(TimeSpan.FromSeconds(3)); } catch (TimeoutException) { Assert.True(false, "Timeout-2"); } Assert.NotEqual(0, stageNum1); // "Work items did not get executed-1" Assert.NotEqual(0, stageNum2); // "Work items did not get executed-2" Assert.Equal(14, stageNum1); // "Work items executed out of order-1" Assert.Equal(22, stageNum2); // "Work items executed out of order-2" }
public void Sched_SimpleFifoTest() { // This is not a great test because there's a 50/50 shot that it will work even if the scheduling // is completely and thoroughly broken and both closures are executed "simultaneously" ActivationTaskScheduler activationScheduler = scheduler.GetWorkItemGroup(rootContext).TaskRunner; int n = 0; // ReSharper disable AccessToModifiedClosure IWorkItem item1 = new ClosureWorkItem(() => { n = n + 5; }); IWorkItem item2 = new ClosureWorkItem(() => { n = n * 3; }); // ReSharper restore AccessToModifiedClosure scheduler.QueueWorkItem(item1, rootContext); scheduler.QueueWorkItem(item2, rootContext); // Pause to let things run Thread.Sleep(1000); // N should be 15, because the two tasks should execute in order Assert.True(n != 0, "Work items did not get executed"); Assert.Equal(15, n); output.WriteLine("Test executed OK."); }