public static void RunBuggySchedulerTests() { Debug.WriteLine("* RunBuggySchedulerTests()"); BuggyTaskScheduler bts = new BuggyTaskScheduler(); Task t1 = new Task(delegate { }); Task t2 = new Task(delegate { }); // // Test Task.Start(buggy scheduler) // Debug.WriteLine(" -- testing Task.Start(buggy scheduler)"); try { t1.Start(bts); Assert.True(false, string.Format(" > FAILED. No exception thrown.")); } catch (TaskSchedulerException) { } catch (Exception e) { Assert.True(false, string.Format(" > FAILED. Wrong exception thrown (expected TaskSchedulerException): {0}", e)); } if (t1.Status != TaskStatus.Faulted) { Assert.True(false, string.Format(" > FAILED. Task ended up in wrong status (expected Faulted): {0}", t1.Status)); } Debug.WriteLine(" -- Waiting on Faulted task (there's a problem if we deadlock)..."); try { t1.Wait(); Assert.True(false, string.Format(" > FAILED. No exception thrown from Wait().")); } catch (AggregateException ae) { if (!(ae.InnerExceptions[0] is TaskSchedulerException)) { Assert.True(false, string.Format(" > FAILED. Wrong inner exception thrown from Wait(): {0}", ae.InnerExceptions[0].GetType().Name)); } } // // Test Task.RunSynchronously(buggy scheduler) // Debug.WriteLine(" -- testing Task.RunSynchronously(buggy scheduler)"); try { t2.RunSynchronously(bts); Assert.True(false, string.Format(" > FAILED. No exception thrown.")); } catch (TaskSchedulerException) { } catch (Exception e) { Assert.True(false, string.Format(" > FAILED. Wrong exception thrown (expected TaskSchedulerException): {0}", e)); } if (t2.Status != TaskStatus.Faulted) { Assert.True(false, string.Format(" > FAILED. Task ended up in wrong status (expected Faulted): {0}", t1.Status)); } Debug.WriteLine(" -- Waiting on Faulted task (there's a problem if we deadlock)..."); try { t2.Wait(); Assert.True(false, string.Format(" > FAILED. No exception thrown from Wait().")); } catch (AggregateException ae) { if (!(ae.InnerExceptions[0] is TaskSchedulerException)) { Assert.True(false, string.Format(" > FAILED. Wrong inner exception thrown from Wait(): {0}", ae.InnerExceptions[0].GetType().Name)); } } // // Test StartNew(buggy scheduler) // Debug.WriteLine(" -- testing Task.Factory.StartNew(buggy scheduler)"); try { Task t3 = Task.Factory.StartNew(delegate { }, CancellationToken.None, TaskCreationOptions.None, bts); Assert.True(false, string.Format(" > FAILED. No exception thrown.")); } catch (TaskSchedulerException) { } catch (Exception e) { Assert.True(false, string.Format(" > FAILED. Wrong exception thrown (expected TaskSchedulerException): {0}", e)); } // // Test continuations // Debug.WriteLine(" -- testing Task.ContinueWith(buggy scheduler)"); Task completedTask = Task.Factory.StartNew(delegate { }); completedTask.Wait(); Task tc1 = completedTask.ContinueWith(delegate { }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, bts); Debug.WriteLine(" -- Waiting on Faulted task (there's a problem if we deadlock)..."); try { tc1.Wait(); Assert.True(false, string.Format(" > FAILED. No exception thrown (sync).")); } catch (AggregateException ae) { if (!(ae.InnerExceptions[0] is TaskSchedulerException)) { Assert.True(false, string.Format(" > FAILED. Wrong inner exception thrown from Wait() (sync): {0}", ae.InnerExceptions[0].GetType().Name)); } } catch (Exception e) { Assert.True(false, string.Format(" > FAILED. Wrong exception thrown (sync): {0}", e)); } Task tc2 = completedTask.ContinueWith(delegate { }, CancellationToken.None, TaskContinuationOptions.None, bts); Debug.WriteLine(" -- Waiting on Faulted task (there's a problem if we deadlock)..."); try { tc2.Wait(); Assert.True(false, string.Format(" > FAILED. No exception thrown (async).")); } catch (AggregateException ae) { if (!(ae.InnerExceptions[0] is TaskSchedulerException)) { Assert.True(false, string.Format(" > FAILED. Wrong inner exception thrown from Wait() (async): {0}", ae.InnerExceptions[0].GetType().Name)); } } catch (Exception e) { Assert.True(false, string.Format(" > FAILED. Wrong exception thrown (async): {0}", e)); } // Test Wait()/inlining Debug.WriteLine(" -- testing Task.Wait(task started on buggy scheduler)"); BuggyTaskScheduler bts2 = new BuggyTaskScheduler(false); // won't throw on QueueTask Task t4 = new Task(delegate { }); t4.Start(bts2); try { t4.Wait(); Assert.True(false, string.Format(" > FAILED. Expected inlining exception")); } catch (TaskSchedulerException) { } catch (Exception e) { Assert.True(false, string.Format(" > FAILED. Wrong exception thrown: {0}", e)); } }
public static void GetScheduledTasksForDebugger_DebuggerAttached_ReturnsTasksFromCustomSchedulers() { var nonExecutingScheduler = new BuggyTaskScheduler(faultQueues: false); Task[] queuedTasks = (from i in Enumerable.Range(0, 10) select Task.Factory.StartNew(() => { }, CancellationToken.None, TaskCreationOptions.None, nonExecutingScheduler)).ToArray(); MethodInfo getScheduledTasksForDebuggerMethod = typeof(TaskScheduler).GetTypeInfo().GetDeclaredMethod("GetScheduledTasksForDebugger"); Task[] foundTasks = getScheduledTasksForDebuggerMethod.Invoke(nonExecutingScheduler, null) as Task[]; Assert.Superset(new HashSet<Task>(queuedTasks), new HashSet<Task>(foundTasks)); GC.KeepAlive(nonExecutingScheduler); }