taskStorage = $tasks->getTaskStorage(); $this->taskStorage->reset(); // Reset events Events::$listeners = []; } public function testDummyTaskStorageClass() { $this->assertInstanceOf('FuzeWorks\Async\TaskStorage', $this->taskStorage); } /* ---------------------------------- Writing and reading tasks ----------------------- */ /** * @depends testDummyTaskStorageClass */ public function testAddAndReadTasks() { // Prepare a dummy task $dummyTask = new Task('testAddTask', new EmptyHandler()); // Nothing is written yet so it should be empty $this->assertEmpty($this->taskStorage->readTasks()); // Write task to storage and test properties of readTasks $this->assertTrue($this->taskStorage->addTask($dummyTask)); $output = $this->taskStorage->readTasks(); $this->assertCount(1, $output); // Get first $task = $output[0]; $this->assertEquals($dummyTask, $task); // Test if the properties match $this->assertEquals('testAddTask', $task->getId()); $this->assertInstanceOf(EmptyHandler::class, $task->getHandler()); } /** * @depends testAddAndReadTasks */ public function testReadUnfinishedTasks() { // Add the tasks $finishedTask = new Task('finishedTask', new EmptyHandler()); $finishedTask->setStatus(Task::COMPLETED); $unfinishedTask1 = new Task('unfinishedTask1', new EmptyHandler()); $unfinishedTask2 = new Task('unfinishedTask2', new EmptyHandler()); // Nothing is written yet so it should be empty $this->assertEmpty($this->taskStorage->readTasks()); // Write the tasks to TaskStorage $this->taskStorage->addTask($finishedTask); $this->taskStorage->addTask($unfinishedTask1); $this->taskStorage->addTask($unfinishedTask2); // And check whether they get properly read $this->assertCount(3, $this->taskStorage->readTasks()); // And whether the finished task gets omitted in the unfinished list $this->assertCount(2, $this->taskStorage->readTasks(true)); } /** * @depends testAddAndReadTasks */ public function testAddExistingTask() { // Prepare a dummy task $dummyTask = new Task('testAddExistingTask', new EmptyHandler()); // First check that the task storage starts empty $this->assertEmpty($this->taskStorage->readTasks()); // Then add the first task $this->assertTrue($this->taskStorage->addTask($dummyTask)); // But then add another task, which should raise an exception $this->expectException(TasksException::class); $this->taskStorage->addTask($dummyTask); } /** * @depends testAddAndReadTasks */ public function testGetTaskById() { // Prepare a dummy task $dummyTask1 = new Task('testGetTaskById1', new EmptyHandler()); $dummyTask2 = new Task('testGetTaskById2', new EmptyHandler()); // First we add both tasks $this->assertEmpty($this->taskStorage->readTasks()); $this->assertTrue($this->taskStorage->addTask($dummyTask1)); $this->assertTrue($this->taskStorage->addTask($dummyTask2)); // Afterwards, we attempt to get the separate tasks $retrievedTask1 = $this->taskStorage->getTaskById('testGetTaskById1'); $retrievedTask2 = $this->taskStorage->getTaskById('testGetTaskById2'); $this->assertInstanceOf('FuzeWorks\Async\Task', $retrievedTask1); $this->assertInstanceOf('FuzeWorks\Async\Task', $retrievedTask2); // Assert they have the values we seek $this->assertEquals('testGetTaskById1', $retrievedTask1->getId()); $this->assertEquals('testGetTaskById2', $retrievedTask2->getId()); // Test they are not the same $this->assertNotEquals($retrievedTask1, $retrievedTask2); // And test they are the initial dummy tasks $this->assertEquals($dummyTask1, $retrievedTask1); $this->assertEquals($dummyTask2, $retrievedTask2); } /** * @depends testGetTaskById */ public function testGetTaskByIdNotFound() { // Prepare a dummy task $dummyTask = new Task('testGetTaskByIdNotFound', new EmptyHandler()); // First we add the task $this->assertEmpty($this->taskStorage->readTasks()); $this->assertTrue($this->taskStorage->addTask($dummyTask)); // Afterwards we check if we can get this task $this->assertInstanceOf('FuzeWorks\Async\Task', $this->taskStorage->getTaskById('testGetTaskByIdNotFound')); // And afterwards we check if an exception is raised if none exist $this->expectException(TasksException::class); $this->taskStorage->getTaskById('DoesNotExist'); } /** * @depends testGetTaskById */ public function testModifyTask() { // Prepare a dummy task $dummyTask = new Task('testModifyTask', new EmptyHandler()); $dummyTask->setStatus(Task::RUNNING); // First we add the task $this->assertEmpty($this->taskStorage->readTasks()); $this->assertTrue($this->taskStorage->addTask($dummyTask)); // Afterwards we check if this task has the known details $this->assertEquals(Task::RUNNING, $this->taskStorage->getTaskById('testModifyTask')->getStatus()); // Then we change the task $dummyTask->setStatus(Task::FAILED); $this->assertTrue($this->taskStorage->modifyTask($dummyTask)); // And check if the details have been changed $this->assertEquals(Task::FAILED, $this->taskStorage->getTaskById('testModifyTask')->getStatus()); } /** * @depends testModifyTask */ public function testModifyTaskNotFound() { // Prepare a dummy task $dummyTask = new Task('testModifyTaskNotFound', new EmptyHandler()); // Attempt to change this task, which does not exist. $this->expectException(TasksException::class); $this->taskStorage->modifyTask($dummyTask); } /** * @depends testModifyTask */ public function testModifyTaskEvent() { // Prepare a dummy task $dummyTask = new Task('testModifyTaskEvent', new EmptyHandler()); $dummyTask->setStatus(Task::PENDING); // Then add the Task $this->taskStorage->addTask($dummyTask); // Now prepare a listener to be fired Events::addListener(function (TaskModifyEvent $event){ $task = $event->getTask(); $this->assertEquals(Task::PENDING, $task->getStatus()); $task->setStatus(Task::RUNNING); $event->updateTask($task); return $event; }, 'TaskModifyEvent', Priority::NORMAL); // Now update the task $this->assertEquals(Task::PENDING, $dummyTask->getStatus()); $this->taskStorage->modifyTask($dummyTask); // And check whether dummyTask got modified $this->assertEquals(Task::RUNNING, $dummyTask->getStatus()); // And check whether the TaskStorage has this updated version as well $modifiedTask = $this->taskStorage->getTaskById($dummyTask->getId()); $this->assertEquals(Task::RUNNING, $modifiedTask->getStatus()); } /** * @depends testModifyTaskEvent */ public function testModifyTaskCancel() { // Prepare a dummy task $dummyTask = new Task('testModifyTaskCancel', new EmptyHandler()); $dummyTask->setStatus(Task::PENDING); // Then add the Task $this->taskStorage->addTask($dummyTask); // Now prepare a listener to be fired Events::addListener(function (TaskModifyEvent $event){ $event->setCancelled(true); return $event; }, 'TaskModifyEvent', Priority::NORMAL); // Modify the task $dummyTask->setStatus(Task::SUCCESS); $this->assertFalse($this->taskStorage->modifyTask($dummyTask)); // And check that the task actually hasn't updated $modifiedTask = $this->taskStorage->getTaskById($dummyTask->getId()); $this->assertEquals(Task::PENDING, $modifiedTask->getStatus()); } /** * @depends testGetTaskById */ public function testDeleteTask() { // Prepare a dummy task $dummyTask = new Task('testDeleteTask', new EmptyHandler()); // Add the task to the storage $this->assertEmpty($this->taskStorage->readTasks()); $this->assertTrue($this->taskStorage->addTask($dummyTask)); // Test that it exists $this->assertEquals($dummyTask, $this->taskStorage->getTaskById('testDeleteTask')); // Then remove the task $this->assertTrue($this->taskStorage->deleteTask($dummyTask)); // And test that it can't be found $this->expectException(TasksException::class); $this->taskStorage->getTaskById('testDeleteTask'); } /** * @depends testDeleteTask */ public function testDeleteTaskNotFound() { // Prepare a dummy task $dummyTask = new Task('testDeleteTaskNotFound', new EmptyHandler()); // Attempt to delete this task, which does not exist. $this->expectException(TasksException::class); $this->taskStorage->deleteTask($dummyTask); } /* ---------------------------------- Writing and reading task output ----------------- */ /** * @depends testDummyTaskStorageClass */ public function testWriteAndReadTaskOutput() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskOutput', new EmptyHandler()); // First write the task output $this->taskStorage->addTask($dummyTask); $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output', 'errors', 0)); // Then try to read the output $output = $this->taskStorage->readTaskOutput($dummyTask, 1); $this->assertEquals('output', $output['output']); $this->assertEquals('errors', $output['errors']); $this->assertEquals(0, $output['statusCode']); } /** * @depends testWriteAndReadTaskOutput */ public function testWriteAndReadMultipleOutput() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadMultipleOutput', new EmptyHandler()); // Write some task output $this->taskStorage->addTask($dummyTask); $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output1', 'errors1', 0)); $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output2', 'errors2', 0)); // Then try to read all the output $output = $this->taskStorage->readTaskOutput($dummyTask, -1); $this->assertEquals([ ['output' => 'output1', 'errors' => 'errors1', 'statusCode' => 0], ['output' => 'output2', 'errors' => 'errors2', 'statusCode' => 0] ], $output); // Then try and read the latest $this->assertEquals(['output' => 'output2', 'errors' => 'errors2', 'statusCode' => 0], $this->taskStorage->readTaskOutput($dummyTask)); } /** * @depends testWriteAndReadTaskOutput */ public function testWriteAndReadTaskOutputTaskNotExist() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskOutputTaskNotExist', new EmptyHandler()); // Write output while the task does not exist yet, expect exception $this->expectException(TasksException::class); $this->taskStorage->writeTaskOutput($dummyTask, 'output', 'errors', 0); } /** * @depends testWriteAndReadTaskOutput */ public function testWriteAndReadTaskOutputAttempts() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskOutputAttempts', new EmptyHandler()); $this->taskStorage->addTask($dummyTask); // Write the different outputs. $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output0', 'errors0', 100)); $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output1', 'errors1', 101)); $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output2', 'errors2', 102)); // Attempt to load the first output $output0 = $this->taskStorage->readTaskOutput($dummyTask, 1); $this->assertEquals('output0', $output0['output']); $this->assertEquals('errors0', $output0['errors']); $this->assertEquals(100, $output0['statusCode']); // Attempt to load the second output $output1 = $this->taskStorage->readTaskOutput($dummyTask, 2); $this->assertEquals('output1', $output1['output']); $this->assertEquals('errors1', $output1['errors']); $this->assertEquals(101, $output1['statusCode']); // Attempt to load the third output $output2 = $this->taskStorage->readTaskOutput($dummyTask, 3); $this->assertEquals('output2', $output2['output']); $this->assertEquals('errors2', $output2['errors']); $this->assertEquals(102, $output2['statusCode']); // Attempt to load the default output $output = $this->taskStorage->readTaskOutput($dummyTask); $this->assertEquals('output2', $output['output']); $this->assertEquals('errors2', $output['errors']); $this->assertEquals(102, $output['statusCode']); // And to load all $this->assertEquals([ ['output' => 'output0', 'errors' => 'errors0', 'statusCode' => 100], ['output' => 'output1', 'errors' => 'errors1', 'statusCode' => 101], ['output' => 'output2', 'errors' => 'errors2', 'statusCode' => 102] ], $this->taskStorage->readTaskOutput($dummyTask, -1)); } /** * @depends testWriteAndReadTaskOutput */ public function testWriteAndReadTaskOutputNotExist() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskOutputNotExist', new EmptyHandler()); $this->taskStorage->addTask($dummyTask); $this->assertNull($this->taskStorage->readTaskOutput($dummyTask)); } /* ---------------------------------- Writing and reading task post output ------------ */ /** * @depends testDummyTaskStorageClass */ public function testWriteAndReadTaskPostOutput() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskPostOutput', new EmptyHandler()); $this->taskStorage->addTask($dummyTask); // First write the task output $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'postOutput', 'errors', 0)); // Then try to read the output $output = $this->taskStorage->readPostOutput($dummyTask, 1); $this->assertEquals('postOutput', $output['output']); $this->assertEquals('errors', $output['errors']); $this->assertEquals(0, $output['statusCode']); } /** * @depends testWriteAndReadTaskOutput */ public function testWriteAndReadMultiplePostOutput() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadMultiplePostOutput', new EmptyHandler()); // Write some task output $this->taskStorage->addTask($dummyTask); $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'output1', 'errors1', 0)); $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'output2', 'errors2', 0)); // Then try to read all the output $output = $this->taskStorage->readPostOutput($dummyTask, -1); $this->assertEquals([ ['output' => 'output1', 'errors' => 'errors1', 'statusCode' => 0], ['output' => 'output2', 'errors' => 'errors2', 'statusCode' => 0] ], $output); $this->assertEquals(['output' => 'output2', 'errors' => 'errors2', 'statusCode' => 0], $this->taskStorage->readPostOutput($dummyTask)); } /** * @depends testWriteAndReadTaskPostOutput */ public function testWriteAndReadTaskPostOutputAttempts() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskPostOutputAttempts', new EmptyHandler()); $this->taskStorage->addTask($dummyTask); // Write the different outputs $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'output0', 'errors0', 100)); $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'output1', 'errors1', 101)); $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'output2', 'errors2', 102)); // Attempt to load the first output $output0 = $this->taskStorage->readPostOutput($dummyTask, 1); $this->assertEquals('output0', $output0['output']); $this->assertEquals('errors0', $output0['errors']); $this->assertEquals(100, $output0['statusCode']); // Attempt to load the second output $output1 = $this->taskStorage->readPostOutput($dummyTask, 2); $this->assertEquals('output1', $output1['output']); $this->assertEquals('errors1', $output1['errors']); $this->assertEquals(101, $output1['statusCode']); // Attempt to load the third output $output2 = $this->taskStorage->readPostOutput($dummyTask, 3); $this->assertEquals('output2', $output2['output']); $this->assertEquals('errors2', $output2['errors']); $this->assertEquals(102, $output2['statusCode']); // Attempt to load the default output $output = $this->taskStorage->readPostOutput($dummyTask); $this->assertEquals('output2', $output['output']); $this->assertEquals('errors2', $output['errors']); $this->assertEquals(102, $output['statusCode']); // And to load all $this->assertEquals([ ['output' => 'output0', 'errors' => 'errors0', 'statusCode' => 100], ['output' => 'output1', 'errors' => 'errors1', 'statusCode' => 101], ['output' => 'output2', 'errors' => 'errors2', 'statusCode' => 102] ], $this->taskStorage->readPostOutput($dummyTask, -1)); } /** * @depends testWriteAndReadTaskPostOutput */ public function testWriteAndReadTaskPostOutputNotExist() { // Prepare a dummy task $dummyTask = new Task('testWriteAndReadTaskPostOutputNotExist', new EmptyHandler()); $this->taskStorage->addTask($dummyTask); $this->assertNull($this->taskStorage->readPostOutput($dummyTask)); } /* ---------------------------------- Data persistence and resets --------- ------------ */ /** * @depends testAddAndReadTasks * @depends testWriteAndReadTaskOutput * @depends testWriteAndReadTaskPostOutput */ public function testReset() { // Prepare a dummy task $dummyTask = new Task('testReset', new EmptyHandler()); // Add the task and some output $this->assertTrue($this->taskStorage->addTask($dummyTask)); $this->assertTrue($this->taskStorage->writeTaskOutput($dummyTask, 'output', 'errors', 100)); $this->assertTrue($this->taskStorage->writePostOutput($dummyTask, 'postOutput', 'errors', 100)); // Then reset the data $this->assertTrue($this->taskStorage->reset()); // And test if the data is actually gone $this->assertNull($this->taskStorage->readTaskOutput($dummyTask)); $this->assertNull($this->taskStorage->readPostOutput($dummyTask)); $this->expectException(TasksException::class); $this->taskStorage->getTaskById('testReset'); } }