Пример #1
0
        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.");
        }
Пример #2
0
        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();
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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();
        }
Пример #6
0
        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);
                }
            }
        }