Ejemplo n.º 1
0
        private void MultipleWorkerMultipleTaskTestCase(WorkingLine wl, EventMonitor <WorkingLine> wlMon)
        {
            var q        = wl.Queue;
            var tasks    = Enumerable.Range(0, 30).Select(i => new TestTask($"multi {i}")).ToArray();
            var taskMons = tasks.Select(t => new EventMonitor <TestTask>(t)).ToArray();

            Assert.IsTrue(q.IsEmpty);
            wl.Enqueue(tasks);

            wl.WaitForEnd(timeout: 10000);

            Assert.IsTrue(q.IsEmpty);
            AssertState(wl, isDisposed: false, busy: false);
            Assert.AreEqual(tasks.Length, wlMon.FilterHistory(ByEventName(nameof(WorkingLine.TaskBegin))).Count);
            Assert.AreEqual(tasks.Length, wlMon.FilterHistory(ByEventName(nameof(WorkingLine.TaskEnd))).Count);
            wlMon.History.AssertSender(wl);
            wlMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkingLine.Busy)))
            .AssertPropertyValues(true, false);
            wlMon.FilterHistory(ByPropertyChanges <int>(nameof(WorkingLine.BusyWorkerCount)))
            .AssertPropertyValueChanges <int>()
            .AssertPropertyValues(1, 2, 3, 2, 1, 0);

            for (int i = 0; i < tasks.Length; i++)
            {
                var task    = tasks[i];
                var taskMon = taskMons[i];
                taskMon.History.AssertSender(task);
                taskMon.FilterHistory(ByPropertyChanges <TaskState>(nameof(ITask.State)))
                .AssertPropertyValues(
                    TaskState.InProgress,
                    TaskState.CleaningUp,
                    TaskState.Succeeded);
            }
        }
Ejemplo n.º 2
0
        private void SingleTaskTestAfterFinish(TaskManager tm, EventMonitor <TaskManager> tmMon,
                                               EventMonitor <TestTask> taskMon)
        {
            AssertState(tm, isDisposed: false, isRunning: false);
            tmMon.FilterHistory(ByEventName(
                                    nameof(TaskManager.IsRunningChanged),
                                    nameof(TaskManager.Started),
                                    nameof(TaskManager.Finished),
                                    nameof(TaskManager.TaskBegin),
                                    nameof(TaskManager.TaskEnd)))
            .AssertSender(tm)
            .AssertEventNames(
                nameof(TaskManager.Started),
                nameof(TaskManager.IsRunningChanged),
                nameof(TaskManager.TaskBegin),
                nameof(TaskManager.TaskEnd),
                nameof(TaskManager.IsRunningChanged),
                nameof(TaskManager.Finished));
            tmMon.FilterHistory(ByPropertyChanges <bool>(nameof(TaskManager.IsRunning)))
            .AssertPropertyValues(true, false);

            taskMon.History.AssertSender(taskMon.Target);
            taskMon.FilterHistory(ByPropertyChanges <TaskState>(nameof(ITask.State)))
            .AssertPropertyValues(
                TaskState.InProgress,
                TaskState.CleaningUp,
                TaskState.Succeeded);
        }
Ejemplo n.º 3
0
        private void WithWorkerThread(Action <WorkerThread, EventMonitor <WorkerThread> > testCase, bool started = true, bool expectStopped = false)
        {
            var wt    = CreateWorkerThread();
            var wtMon = new EventMonitor <WorkerThread>(wt);

            if (started)
            {
                wt.Start();
                AssertState(wt, isDisposed: false, isAlive: true, busy: false);
                wtMon.History.AssertSender(wt);
                wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.IsAlive)))
                .AssertPropertyValues(true);
            }
            wtMon.ClearHistory();

            testCase(wt, wtMon);

            wtMon.ClearHistory();

            wt.Queue.Dispose();
            wt.Dispose();
            AssertState(wt, isDisposed: true, isAlive: false, busy: false);
            wtMon.History.AssertSender(wt);
            if (expectStopped)
            {
                Assert.IsTrue(
                    wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.IsAlive)))
                    .IsEmpty);
            }
            else
            {
                wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.IsAlive)))
                .AssertPropertyValues(false);
            }
        }
Ejemplo n.º 4
0
        private void MultiTaskTestCase(WorkerThread wt, EventMonitor <WorkerThread> wtMon)
        {
            var q     = wt.Queue;
            var tasks = new[] {
                new TestTask("multi 1"),
                new TestTask("multi 2"),
                new TestTask("multi 3")
            };
            var taskMons = tasks.Select(t => new EventMonitor <TestTask>(t)).ToArray();

            foreach (var task in tasks)
            {
                q.Enqueue(task);
            }

            Assert.IsTrue(wt.WaitForEnd(timeout: 10000));

            Assert.IsTrue(q.IsEmpty);
            AssertState(wt, isDisposed: false, isAlive: true, busy: false);

            var wtHist = wtMon.History;

            wtHist.AssertSender(wt);
            wtHist.AssertEventNames(
                nameof(WorkerThread.BusyChanged),
                nameof(WorkerThread.CurrentTaskChanged),
                nameof(WorkerThread.TaskBegin),
                nameof(WorkerThread.TaskEnd),
                nameof(WorkerThread.CurrentTaskChanged),
                nameof(WorkerThread.TaskBegin),
                nameof(WorkerThread.TaskEnd),
                nameof(WorkerThread.CurrentTaskChanged),
                nameof(WorkerThread.TaskBegin),
                nameof(WorkerThread.TaskEnd),
                nameof(WorkerThread.CurrentTaskChanged),
                nameof(WorkerThread.BusyChanged));
            wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.Busy)))
            .AssertPropertyValues(true, false);
            wtMon.FilterHistory(ByPropertyChanges <ITask>(nameof(WorkerThread.CurrentTask)))
            .AssertPropertyValues(tasks.Concat(new TestTask[] { null }).ToArray());

            for (int i = 0; i < tasks.Length; i++)
            {
                var taskMon  = taskMons[i];
                var task     = tasks[i];
                var taskHist = taskMon.History;
                taskHist.AssertSender(task);
                var taskStateHist = taskMon.FilterHistory(ByPropertyChanges <TaskState>(nameof(ITask.State)));
                taskStateHist.AssertPropertyValues(
                    TaskState.InProgress,
                    TaskState.CleaningUp,
                    TaskState.Succeeded);
                var taskProgressHist = taskMon.FilterHistory(ByPropertyChanges <float>(nameof(ITask.Progress)));
                Assert.IsTrue(taskProgressHist.Count > 0);
                Assert.AreEqual(0f, taskProgressHist.First.GetNewValue <float>());
                Assert.AreEqual(1f, taskProgressHist.Last.GetNewValue <float>());
            }
        }
Ejemplo n.º 5
0
        private void SingleTaskTestCase(WorkerThread wt, EventMonitor <WorkerThread> wtMon)
        {
            var q       = wt.Queue;
            var task    = new TestTask("single");
            var taskMon = new EventMonitor <TestTask>(task);

            q.Enqueue(task);

            Assert.IsFalse(q.IsEmpty);
            AssertState(wt, isDisposed: false, isAlive: false, busy: false);

            wt.Start();
            wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.IsAlive)))
            .AssertPropertyValues(true);

            //WaitFor(() => task.State == TaskState.Succeeded, 1000);
            wt.WaitForEnd(timeout: 10000);

            Assert.IsTrue(q.IsEmpty);
            AssertState(wt, isDisposed: false, isAlive: true, busy: false);

            var wtHist = wtMon.History;

            wtHist.AssertSender(wt);
            wtHist.AssertEventNames(
                nameof(wt.IsAliveChanged),
                nameof(wt.BusyChanged),
                nameof(wt.CurrentTaskChanged),
                nameof(wt.TaskBegin),
                nameof(wt.TaskEnd),
                nameof(wt.CurrentTaskChanged),
                nameof(wt.BusyChanged));
            wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.IsAlive)))
            .AssertPropertyValues(true);
            wtMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkerThread.Busy)))
            .AssertPropertyValues(true, false);
            wtMon.FilterHistory(ByPropertyChanges <ITask>(nameof(WorkerThread.CurrentTask)))
            .AssertPropertyValues(task, null);

            taskMon.History.AssertSender(task);

            taskMon.FilterHistory(ByPropertyChanges <TaskState>(nameof(TestTask.State)))
            .AssertPropertyValues(
                TaskState.InProgress,
                TaskState.CleaningUp,
                TaskState.Succeeded
                );
            AssertTaskProgressRange(taskMon);
        }
Ejemplo n.º 6
0
        private void ParallelCancellationTestCase(WorkingLine wl, EventMonitor <WorkingLine> wlMon)
        {
            var q        = wl.Queue;
            var tasks    = Enumerable.Range(0, 18).Select(i => new TestTask(i.ToString())).ToArray();
            var taskMons = tasks.Select(t => new EventMonitor <TestTask>(t)).ToArray();

            var cancelTask = tasks[9];

            cancelTask.StateChanging += (s, e) =>
            {
                if (e.NewValue == TaskState.InProgress)
                {
                    wl.Cancel();
                }
            };

            wl.Enqueue(tasks);

            Assert.IsTrue(wl.WaitForEnd(timeout: 4000));

            AssertState(wl, isDisposed: false, busy: false);
            Assert.AreEqual(0, wl.CurrentTasks.Length);
            Assert.IsTrue(wl.Queue.IsEmpty);

            Assert.AreEqual(TaskState.Succeeded, tasks.First().State);
            Assert.AreEqual(TaskState.Obsolete, tasks.Last().State);
            Assert.AreEqual(tasks.Length,
                            tasks.Where(t =>
                                        t.State == TaskState.Succeeded ||
                                        t.State == TaskState.Canceled ||
                                        t.State == TaskState.Obsolete)
                            .Count());

            wlMon.FilterHistory(ByEventName(
                                    nameof(WorkingLine.BusyChanged),
                                    nameof(WorkingLine.Cancelled)))
            .AssertEventNames(
                nameof(WorkingLine.BusyChanged),
                nameof(WorkingLine.Cancelled),
                nameof(WorkingLine.BusyChanged));

            wlMon.FilterHistory(ByEventName(nameof(WorkingLine.BusyChanged)))
            .AssertPropertyValues(true, false);

            wlMon.FilterHistory(ByEventName(nameof(WorkingLine.BusyWorkerCountChanged)))
            .AssertPropertyValues(1, 2, 3, 2, 1, 0);
        }
Ejemplo n.º 7
0
        private void AssertTaskProgressRange(EventMonitor <TestTask> taskMonitor, float first = 0f, float last = 1f)
        {
            var progressHistory = taskMonitor.FilterHistory(ByPropertyChanges <float>(nameof(TestTask.Progress)));

            Assert.IsTrue(progressHistory.Count > 0, "No progress events fired.");
            Assert.AreEqual(first, progressHistory.First.GetNewValue <float>(), $"The first progress event did not signal {first}.");
            Assert.AreEqual(last, progressHistory.Last.GetNewValue <float>(), $"The last progress event did not signal {last}.");
        }
Ejemplo n.º 8
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();
        }
Ejemplo n.º 9
0
        private void SingleWorkerSingleTaskTestCase(WorkingLine wl, EventMonitor <WorkingLine> wlMon)
        {
            var q       = wl.Queue;
            var task    = new TestTask("single");
            var taskMon = new EventMonitor <TestTask>(task);

            Assert.IsTrue(q.IsEmpty);
            wl.Enqueue(task);
            Assert.IsFalse(q.IsEmpty);
            AssertState(wl, isDisposed: false, busy: false);

            wl.Start();
            wl.WaitForEnd(timeout: 10000);

            Assert.IsTrue(q.IsEmpty);
            AssertState(wl, isDisposed: false, busy: false);
            wlMon.History.AssertSender(wl);
            wlMon.FilterHistory(ByEventName(
                                    nameof(WorkingLine.TaskBegin),
                                    nameof(WorkingLine.TaskEnd)))
            .AssertEventNames(
                nameof(WorkingLine.TaskBegin),
                nameof(WorkingLine.TaskEnd));
            wlMon.FilterHistory(ByEventName(
                                    nameof(WorkingLine.BusyChanged),
                                    nameof(WorkingLine.BusyWorkerCountChanged)))
            .AssertEventNames(
                nameof(WorkingLine.BusyChanged),
                nameof(WorkingLine.BusyWorkerCountChanged),
                nameof(WorkingLine.BusyWorkerCountChanged),
                nameof(WorkingLine.BusyChanged));
            wlMon.FilterHistory(ByPropertyChanges <bool>(nameof(WorkingLine.Busy)))
            .AssertPropertyValues(true, false);
            wlMon.FilterHistory(ByPropertyChanges <int>(nameof(WorkingLine.BusyWorkerCount)))
            .AssertPropertyValues(1, 0);

            taskMon.History.AssertSender(task);
            taskMon.FilterHistory(ByPropertyChanges <TaskState>(nameof(ITask.State)))
            .AssertPropertyValues(
                TaskState.InProgress,
                TaskState.CleaningUp,
                TaskState.Succeeded);
        }
Ejemplo n.º 10
0
 private void LifeCycleTestAfterFinish(TaskManager tm, EventMonitor <TaskManager> tmMon, object cache)
 {
     AssertState(tm, isDisposed: false, isRunning: false);
     tmMon.History
     .AssertSender(tm)
     .AssertEventNames(
         nameof(TaskManager.Started),
         nameof(TaskManager.IsRunningChanged),
         nameof(TaskManager.IsRunningChanged),
         nameof(TaskManager.Finished));
     tmMon.FilterHistory(ByPropertyChanges <bool>(nameof(TaskManager.IsRunning)))
     .AssertPropertyValues(true, false);
 }