def test_workersNeeded(self):
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     for _ in range(0, 1000):  # try 1000 different numbers
         conflicts = randint(1, 100)
         multitask = randint(1, 5)
         expectedWorkers = ceil(float(conflicts) / float(multitask))
         actualWorkers = taskManager.workersNeeded(conflicts, multitask)
         self.assertEqual(actualWorkers, expectedWorkers)
 def test_addWorker(self):
     worker = Worker(workerID="W1",
                     begin=tHour(0, 00),
                     end=tHour(23, 59),
                     multitask=1)
     taskManager = TaskManager(self.tPeriod(), multitask=1)
     taskManager.addWorker(worker)
     self.assertEqual(len(taskManager.workers), 1)
 def test_taskAfterDeadline(self):
     task = TaskUnit(createdAt=tHour(0, 0),
                     deadline=tHour(21, 1),
                     profit=0,
                     processing=0,
                     release=tHour(16, 25),
                     taskID="t1")
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     with self.assertRaises(LateDeadlineException):
         taskManager.addTask(task)
 def test_finishTasks(self):
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     taskManager.addTask(self.tasks[0])
     taskManager.addTask(self.tasks[1])
     self.assertEqual(len(taskManager.taskSet.tasks), 2)
     taskManager.finishTask(self.tasks[0].taskID)
     self.assertEqual(len(taskManager.taskSet.tasks), 1)
     taskManager.finishTask(self.tasks[1].taskID)
     self.assertEqual(len(taskManager.taskSet.tasks), 0)
 def test_assignedTasksCountAndUnassignedTasksCount(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1)
     ]
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     taskManager.addTask(self.tasks[0])
     taskManager.addTask(self.tasks[1])
     taskManager.addTask(self.tasks[2])
     taskManager.addWorkers(workers)
     taskManager.assignTasksToWorkers()
     self.assertEqual(len(taskManager.assignedTasks), 2)
     self.assertEqual(len(taskManager.unassignedTasks), 1)
 def test_analyseWorkersNeededTaskSet(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=2),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=2),
     ]
     taskManager = TaskManager(period=self.tPeriod(), multitask=2)
     taskManager.addWorkers(workers)
     taskManager.addTasks(self.tasks)
     taskManager.assignTasksToWorkers()
     conflicts, nonConflicts = taskManager.analyseWorkersForNeededTaskSet()
     self.assertEqual(len(conflicts), 2)
     self.assertEqual(len(nonConflicts), 1)
 def test_removeUnkownWorker(self):
     worker = Worker(workerID="W1",
                     begin=tHour(0, 00),
                     end=tHour(23, 59),
                     multitask=1)
     taskManager = TaskManager(self.tPeriod(), multitask=1)
     taskManager.addWorker(worker)
     with self.assertRaises(UnkownWorkerException):
         taskManager.removeWorker("thisworkerdoesnotexists")
 def test_addWorkersAfterInitialAssignment(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1)
     ]
     taskManager = TaskManager(self.tPeriod(), multitask=1)
     taskManager.addTasks(self.tasks)
     taskManager.addWorkers(workers)
     taskManager.assignTasksToWorkers()
     self.assertEqual(self.tasks[0], workers[0].assignedTasks[0])
     self.assertEqual(self.tasks[1], workers[1].assignedTasks[0])
 def test_removeWorker(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1)
     ]
     taskManager = TaskManager(self.tPeriod(), multitask=1)
     taskManager.addWorkers(workers)
     taskManager.removeWorker(workers[0].workerID)
     self.assertEqual(len(taskManager.workers), 1)
 def test_addTask(self):
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     taskManager.addTask(self.tasks[0])
     self.assertEqual(taskManager.taskSet.tasks[0], self.tasks[0])
 def test_noConflictsAfterAllTasksRemoved(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
     ]
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     taskManager.addWorkers(workers)
     taskManager.addTask(self.tasks[0])
     taskManager.addTask(self.tasks[1])
     taskManager.assignTasksToWorkers()
     conflicts = taskManager.analyseWorkersForNeededTaskSet()[0]
     self.assertEqual(conflicts[0].workersNeeded, 2)
     taskManager.finishTask(self.tasks[0].taskID)
     taskManager.finishTask(self.tasks[1].taskID)
     conflicts = taskManager.analyseWorkersForNeededTaskSet()[0]
     self.assertEqual(len(conflicts), 0)  # there should be not conflicts
 def test_workerGetsAssignedAnotherTaskAfterFinishing(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
     ]
     taskManager = TaskManager(period=self.tPeriod(), multitask=1)
     taskManager.addWorkers(workers)
     taskManager.addTasks(self.tasks)
     taskManager.assignTasksToWorkers()
     self.assertEqual(len(workers[0].assignedTasks), 1)
     self.assertEqual(len(workers[1].assignedTasks), 1)
     # check that task was unnasigned from worker.
     assignedTask = workers[0].assignedTasks[0]
     taskManager.finishTask(assignedTask.taskID)
     self.assertEqual(len(workers[0].assignedTasks), 0)
     # now assign tasks if theres any more.
     taskManager.assignTasksToWorkers()
     self.assertEqual(len(workers[0].assignedTasks), 1)
    def test_finishTasksAfterAssigningTasksToWorkers(self):
        workers = [
            Worker(workerID="W1",
                   begin=tHour(0, 00),
                   end=tHour(23, 59),
                   multitask=1),
            Worker(workerID="W2",
                   begin=tHour(0, 00),
                   end=tHour(23, 59),
                   multitask=1),
            Worker(workerID="W3",
                   begin=tHour(0, 00),
                   end=tHour(23, 59),
                   multitask=1)
        ]
        taskManager = TaskManager(period=self.tPeriod(), multitask=1)
        taskManager.addTask(self.tasks[0])
        taskManager.addTask(self.tasks[1])
        taskManager.addWorkers(workers)
        taskManager.assignTasksToWorkers()
        self.assertEqual(len(taskManager.workers), 3)
        taskManager.finishTask(self.tasks[0].taskID)
        self.assertEqual(len(workers[0].assignedTasks), 0)
        self.assertEqual(len(taskManager.workers), 3)

        taskManager.finishTask(self.tasks[1].taskID)  # test with id too.
        self.assertEqual(len(workers[1].assignedTasks), 0)
        self.assertEqual(len(taskManager.workers), 3)
    def test_assignTaskToWorkersThatNeedsToBeSwapped(self, isProcessing):
        # mock task unit so its isProcessing method always returns true
        # as it is time dependent, and will fail if this test if run at certain times
        isProcessing.return_value = False

        task1 = TaskUnit(createdAt=tHour(0, 0),
                         deadline=tHour(10, 00),
                         profit=0,
                         processing=0,
                         release=tHour(9, 30),
                         taskID="t1")
        task2 = TaskUnit(createdAt=tHour(0, 0),
                         deadline=tHour(11, 00),
                         profit=0,
                         processing=0,
                         release=tHour(9, 40),
                         taskID="t2")
        task3 = TaskUnit(createdAt=tHour(0, 0),
                         deadline=tHour(12, 00),
                         profit=0,
                         processing=0,
                         release=tHour(11, 30),
                         taskID="t3")
        workers = [
            Worker(workerID="W4",
                   begin=tHour(0, 00),
                   end=tHour(23, 59),
                   multitask=1),
            Worker(workerID="W1",
                   begin=tHour(0, 00),
                   end=tHour(23, 59),
                   multitask=1)
        ]
        taskManager = TaskManager(period=self.tPeriod(), multitask=1)
        taskManager.addTask(task2)
        taskManager.addTask(task3)
        taskManager.addWorkers(workers)
        taskManager.assignTasksToWorkers()
        self.assertEqual(task2, workers[0].assignedTasks[0])
        self.assertEqual(task3, workers[1].assignedTasks[0])
        taskManager.addTask(
            task1)  # earlier release, therfore should be swapped.
        taskManager.assignTasksToWorkers()
        self.assertEqual(
            task1, workers[0].assignedTasks[0])  # should be assigned to worker
        self.assertIsNone(
            task3.assignedWorker)  # workers for task3 should be None
 def test_assignTasksToWorkers(self):
     initialWorkers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W3",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1)
     ]
     extraWorkers = [
         Worker(workerID="W4",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1)
     ]
     taskManager = TaskManager(self.tPeriod(), multitask=1)
     taskManager.addTasks(self.tasks)
     taskManager.addWorkers(initialWorkers)
     taskManager.assignTasksToWorkers()
     self.assertEqual(self.tasks[0],
                      initialWorkers[0].assignedTasks[0])  #check w1
     self.assertEqual(self.tasks[1],
                      initialWorkers[1].assignedTasks[0])  #check w2
     self.assertEqual(self.tasks[2],
                      initialWorkers[2].assignedTasks[0])  #check w3
     self.assertEqual(taskManager.unassignedTasks[0], self.tasks[3])
     self.assertEqual(taskManager.unassignedTasks[1], self.tasks[4])
     self.assertEqual(taskManager.unassignedTasks[2], self.tasks[5])
     #add more tasks and make sure they were assigned to the new workers.
     taskManager.addWorkers(extraWorkers)
     taskManager.assignTasksToWorkers()
     self.assertEqual(self.tasks[3],
                      extraWorkers[0].assignedTasks[0])  #check w4
     self.assertEqual(self.tasks[4],
                      extraWorkers[1].assignedTasks[0])  #check w5
     self.assertEqual(taskManager.unassignedTasks[0], self.tasks[5])
 def test_removeWorkerAfterAssigningTasks(self):
     workers = [
         Worker(workerID="W1",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1),
         Worker(workerID="W2",
                begin=tHour(0, 00),
                end=tHour(23, 59),
                multitask=1)
     ]
     taskManager = TaskManager(self.tPeriod(), multitask=1)
     taskManager.addTasks([self.tasks[0], self.tasks[1]])
     taskManager.addWorkers(workers)
     taskManager.assignTasksToWorkers()
     # make sure the exception is thrown as the tasks are not finished yet.
     with self.assertRaises(UnfinishedTasksHeldByWorkerException):
         taskManager.removeWorker(workers[0].workerID)
     # finish the tasks and remove workers
     taskManager.finishTask(self.tasks[0].taskID)
     taskManager.removeWorker(workers[0].workerID)
     self.assertEqual(len(taskManager.workers), 1)
     taskManager.finishTask(self.tasks[1].taskID)
     taskManager.removeWorker(workers[1].workerID)
     self.assertEqual(len(taskManager.workers), 0)