private void CancellationAfterFinish(TaskManager tm, EventMonitor <TaskManager> tmMon, TaskGraphMonitor tgMon) { var labelsByState = new Dictionary <TaskState, List <string> >(); foreach (TaskState state in Enum.GetValues(typeof(TaskState))) { var labels = tgMon.Tasks.Where(t => t.State == state).Select(t => t.Label).ToList(); if (labels.Count > 0) { TaskDebug.Verbose($"Tasks with state {state}: {string.Join(", ", labels)}"); } labelsByState[state] = labels; } Assert.AreEqual(0, labelsByState[TaskState.Waiting].Count, "Some tasks are still waiting."); Assert.AreEqual(0, labelsByState[TaskState.InProgress].Count, "Some tasks are still in progress."); Assert.AreEqual(0, labelsByState[TaskState.CleaningUp].Count, "Some tasks are still in clean-up state."); Assert.AreNotEqual(0, labelsByState[TaskState.Succeeded].Count, "No tasks succeeded."); Assert.AreNotEqual(0, labelsByState[TaskState.Canceled].Count, "No task was cancelled."); Assert.AreNotEqual(0, labelsByState[TaskState.Obsolete].Count, "No task got obsolete."); }
private void RenderAfterFinish(TaskManager tm, EventMonitor <TaskManager> tmMon, TaskGraphMonitor tgMon, string fileName) { Console.WriteLine("Rendering the task graph processing animation"); TaskGraphRenderer.RenderTaskGraphAnimation(tgMon.Tasks, tgMon, System.IO.Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), fileName + ".avi"), maxWidth: 1024, format: TaskGraphRenderer.VideoFormat.AviMjpeg, fps: 3.333f); tgMon.AssertTaskEventsRespectDependencies(); }
public static void RenderTaskGraphAnimation(List <TestTask> tasks, TaskGraphMonitor tgMon, string outputFile, VideoFormat format = VideoFormat.AviMjpeg, int maxWidth = 1280, float fps = 2) { var taskStateGenerations = RebuildTaskState(tasks, tgMon); var colorSelector = new ByTaskStateSelector(TASK_STATE_COLORS); var shapeSelector = new ByQueueSelector(tasks, SHAPES, new Random(0)); var tmpDir = Path.Combine(Path.GetDirectoryName(outputFile), Path.GetFileNameWithoutExtension(outputFile)); Directory.CreateDirectory(tmpDir); var i = 0; foreach (var taskStates in taskStateGenerations) { var path = Path.Combine(tmpDir, $"{i:0000}.png"); RenderGraph(path, tasks, taskStates, colorSelector, shapeSelector); i++; } string fileExt; string codec; switch (format) { case VideoFormat.Gif: fileExt = ".gif"; codec = ""; break; case VideoFormat.AviMjpeg: default: fileExt = ".avi"; codec = "-vcodec mjpeg -huffman optimal -q:v 3"; break; } outputFile = Path.ChangeExtension(outputFile, fileExt); var c = CultureInfo.InvariantCulture; var arguments = $"-f image2 -y -r {fps.ToString(c)} -i \"{tmpDir}\\%04d.png\" -vf scale={maxWidth.ToString(c)}:-1 {codec} \"{outputFile}\""; var p = Process.Start(new ProcessStartInfo("ffmpeg", arguments) { CreateNoWindow = true, UseShellExecute = false }); p.WaitForExit(); Directory.Delete(tmpDir, true); }
private TaskGraphMonitor InitializeWithTasks(TaskManager tm, int randInit = DEF_RAND_INIT, int count = DEF_TASK_COUNT, int levels = DEF_TASK_LEVELS, int minDeps = DEF_TASK_MIN_DEPS, int maxDeps = DEF_TASK_MAX_DEPS) { var rand = new Random(randInit); var queueTags = (from wl in tm.WorkingLines select wl.QueueTag).ToArray(); var tasks = TestTaskFactory.CreateMeshedCascade(rand, count: count, levels: levels, minDeps: minDeps, maxDeps: maxDeps, queueTags: queueTags); var tgMon = new TaskGraphMonitor(tasks); tm.AddTasks(tasks); return(tgMon); }
private void GeneralTasksAfterFinish(TaskManager tm, EventMonitor <TaskManager> tmMon, TaskGraphMonitor tgMon) { var queueTags = tm.WorkingLines.Select(wl => wl.QueueTag).ToArray(); AssertState(tm, isDisposed: false, isRunning: false); tmMon.History.AssertSender(tm); tmMon.FilterHistory(ByPropertyChanges <bool>(nameof(TaskManager.IsRunning))) .AssertPropertyValues(true, false); var labels = tgMon.Tasks.Select(t => t.Label).ToList(); var beginLabels = tmMon.FilterHistory(ByEventName(nameof(TaskManager.TaskBegin))) .Select(e => ((TestTask)((TaskEventArgs)e.EventArgs).Task).Label).ToList(); var unstartedLabels = labels.Except(beginLabels).ToList(); if (unstartedLabels.Count > 0) { Debug.WriteLine("Task without begin event: " + string.Join(", ", unstartedLabels)); Assert.Fail("The following tasks did not fire a begin event: " + string.Join(", ", unstartedLabels)); } var endLabels = tmMon.FilterHistory(ByEventName(nameof(TaskManager.TaskEnd))) .Select(e => ((TestTask)((TaskEventArgs)e.EventArgs).Task).Label).ToList(); var unfinishedLabels = labels.Except(endLabels).ToList(); if (unfinishedLabels.Count > 0) { Debug.WriteLine("Task without end event: " + string.Join(", ", unfinishedLabels)); Assert.Fail("The following tasks did not fire an end event: " + string.Join(", ", unfinishedLabels)); } foreach (var taskMon in tgMon.TaskMonitors) { taskMon.History.AssertSender(taskMon.Target); taskMon.FilterHistory(ByPropertyChanges <TaskState>(nameof(ITask.State))) .AssertPropertyValues( TaskState.InProgress, TaskState.CleaningUp, TaskState.Succeeded); } tgMon.AssertTaskEventsRespectDependencies(); }
private static IEnumerable <Dictionary <TestTask, TaskState> > RebuildTaskState(List <TestTask> tasks, TaskGraphMonitor tgMon) { var taskStates = tasks.ToDictionary(t => t, t => TaskState.Waiting); foreach (var er in tgMon.History) { var ea = er.EventArgs as TaskEventArgs; if (ea != null) { taskStates[(TestTask)ea.Task] = ea.State; yield return(taskStates); } } }