| <?php |
| /** |
| * Copyright 2007 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /** |
| * Unit tests for the PushQueue class. |
| * |
| */ |
| |
| namespace google\appengine\api\taskqueue; |
| |
| use google\appengine\api\taskqueue\PushTask; |
| use google\appengine\testing\ApiProxyTestBase; |
| use google\appengine\TaskQueueAddRequest\RequestMethod; |
| use google\appengine\TaskQueueBulkAddRequest; |
| use google\appengine\TaskQueueBulkAddResponse; |
| use google\appengine\TaskQueueServiceError\ErrorCode; |
| |
| $mockTime = 12345.6; |
| |
| // This mocks out PHP's microtime() function. |
| function microtime($get_as_float = false) { |
| if (!$get_as_float) { |
| die('microtime called with get_as_float=false'); |
| } |
| global $mockTime; |
| return $mockTime; |
| } |
| |
| class PushQueueTest extends ApiProxyTestBase { |
| |
| public function setUp() { |
| parent::setUp(); |
| $this->_SERVER = $_SERVER; |
| } |
| |
| public function tearDown() { |
| $_SERVER = $this->_SERVER; |
| parent::tearDown(); |
| } |
| |
| private static function buildBulkAddRequest($queue_name = 'default') { |
| $req = new TaskQueueBulkAddRequest(); |
| $task = $req->addAddRequest(); |
| $task->setQueueName($queue_name); |
| $task->setTaskName(''); |
| $task->setUrl('/someUrl'); |
| global $mockTime; |
| $task->setEtaUsec($mockTime * 1e6); |
| $task->setMethod(RequestMethod::POST); |
| return $req; |
| } |
| |
| private static function buildBulkAddRequestWithTwoTasks( |
| $queue_name = 'default') { |
| $req = self::buildBulkAddRequest($queue_name); |
| |
| $task = $req->addAddRequest(); |
| $task->setQueueName($queue_name); |
| $task->setTaskName(''); |
| $task->setUrl('/someOtherUrl'); |
| global $mockTime; |
| $task->setEtaUsec($mockTime * 1e6); |
| $task->setMethod(RequestMethod::POST); |
| |
| return $req; |
| } |
| |
| public function testConstructorNameWrongType() { |
| $this->setExpectedException('\InvalidArgumentException', |
| '$name must be a string. Actual type: integer'); |
| $queue = new PushQueue(54321); |
| } |
| |
| public function testGetName() { |
| $queue = new PushQueue(); |
| $this->assertEquals('default', $queue->getName()); |
| $queue = new PushQueue('fast-queue'); |
| $this->assertEquals('fast-queue', $queue->getName()); |
| } |
| |
| public function testAddTaskTooBig() { |
| $this->setExpectedException( |
| '\google\appengine\api\taskqueue\TaskQueueException', |
| 'Task greater than maximum size of ' . PushTask::MAX_TASK_SIZE_BYTES); |
| // Althought 102400 is the max size, it's for the serialized proto which |
| // includes the URL etc. |
| $task = new PushTask('/someUrl', ['field' => str_repeat('a', 102395)]); |
| (new PushQueue())->addTasks([$task]); |
| } |
| |
| public function testPushQueueAddTasksWrongType() { |
| $this->setExpectedException('\InvalidArgumentException', |
| '$tasks must be an array. Actual type: string'); |
| $queue = new PushQueue(); |
| $task_names = $queue->addTasks('not an array'); |
| } |
| |
| public function testPushQueueAddTasksWrongValueType() { |
| $this->setExpectedException('\InvalidArgumentException', |
| 'All values in $tasks must be instances of PushTask. ' . |
| 'Actual type: double'); |
| $queue = new PushQueue(); |
| $task_names = $queue->addTasks([1.0]); |
| } |
| |
| public function testPushQueueAddTasksTooMany() { |
| $this->setExpectedException('\InvalidArgumentException', |
| '$tasks must contain at most 100 tasks. Actual size: 101'); |
| $tasks = []; |
| for ($i = 0; $i < 101; $i++) { |
| $tasks[] = new PushTask('/a-url'); |
| } |
| $queue = new PushQueue(); |
| $queue->addTasks($tasks); |
| } |
| |
| public function testPushQueueAddTasksEmptyArray() { |
| $queue = new PushQueue(); |
| $task_names = $queue->addTasks([]); |
| $this->assertEquals([], $task_names); |
| $this->apiProxyMock->verify(); |
| } |
| |
| public function testPushQueueSimplestAddTasks() { |
| $req = self::buildBulkAddRequest(); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('fred'); |
| |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task = new PushTask('/someUrl'); |
| $queue = new PushQueue(); |
| $task_names = $queue->addTasks([$task]); |
| $this->assertEquals(['fred'], $task_names); |
| $this->apiProxyMock->verify(); |
| } |
| |
| public function testPushQueueAddTwoTasks() { |
| $req = self::buildBulkAddRequestWithTwoTasks(); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('fred'); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('bob'); |
| |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task1 = new PushTask('/someUrl'); |
| $task2 = new PushTask('/someOtherUrl'); |
| $queue = new PushQueue(); |
| $task_names = $queue->addTasks([$task1, $task2]); |
| $this->assertEquals(['fred', 'bob'], $task_names); |
| $this->apiProxyMock->verify(); |
| } |
| |
| public function testPushQueueAddTwoTasksNonDefaultQueue() { |
| $req = self::buildBulkAddRequestWithTwoTasks('superQ'); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('fred'); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('bob'); |
| |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task1 = new PushTask('/someUrl'); |
| $task2 = new PushTask('/someOtherUrl'); |
| $queue = new PushQueue('superQ'); |
| $task_names = $queue->addTasks([$task1, $task2]); |
| $this->assertEquals(['fred', 'bob'], $task_names); |
| $this->apiProxyMock->verify(); |
| } |
| |
| public function testPushQueueTaskAlreadyExistsError() { |
| $req = self::buildBulkAddRequestWithTwoTasks(); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('fred'); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::TOMBSTONED_TASK); |
| $task_result->setChosenTaskName('bob'); |
| |
| $this->setExpectedException( |
| '\google\appengine\api\taskqueue\TaskAlreadyExistsException'); |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task1 = new PushTask('/someUrl'); |
| $task2 = new PushTask('/someOtherUrl'); |
| $queue = new PushQueue(); |
| $queue->addTasks([$task1, $task2]); |
| $this->apiProxyMock->verify(); |
| } |
| |
| public function testPushQueueUnknownQueueError() { |
| $req = self::buildBulkAddRequestWithTwoTasks(); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('fred'); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::UNKNOWN_QUEUE); |
| $task_result->setChosenTaskName('bob'); |
| |
| $this->setExpectedException( |
| '\google\appengine\api\taskqueue\TaskQueueException', |
| 'Unknown queue'); |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task1 = new PushTask('/someUrl'); |
| $task2 = new PushTask('/someOtherUrl'); |
| $queue = new PushQueue(); |
| $queue->addTasks([$task1, $task2]); |
| $this->apiProxyMock->verify(); |
| } |
| |
| // UNKNOWN_QUEUE should take precedence over TOMBSTONED_TASK. |
| public function testPushQueueTwoErrors() { |
| $req = self::buildBulkAddRequestWithTwoTasks(); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::TOMBSTONED_TASK); |
| $task_result->setChosenTaskName('fred'); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::UNKNOWN_QUEUE); |
| $task_result->setChosenTaskName('bob'); |
| |
| $this->setExpectedException( |
| '\google\appengine\api\taskqueue\TaskQueueException', |
| 'Unknown queue'); |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task1 = new PushTask('/someUrl'); |
| $task2 = new PushTask('/someOtherUrl'); |
| $queue = new PushQueue(); |
| $queue->addTasks([$task1, $task2]); |
| $this->apiProxyMock->verify(); |
| } |
| |
| public function testPushQueueTooManyTasksError() { |
| $req = self::buildBulkAddRequestWithTwoTasks(); |
| |
| $resp = new TaskQueueBulkAddResponse(); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::OK); |
| $task_result->setChosenTaskName('fred'); |
| $task_result = $resp->addTaskResult(); |
| $task_result->setResult(ErrorCode::TOO_MANY_TASKS); |
| $task_result->setChosenTaskName('bob'); |
| |
| $this->setExpectedException( |
| '\google\appengine\api\taskqueue\TaskQueueException', |
| 'Too many tasks in request.'); |
| $this->apiProxyMock->expectCall('taskqueue', 'BulkAdd', $req, $resp); |
| |
| $task1 = new PushTask('/someUrl'); |
| $task2 = new PushTask('/someOtherUrl'); |
| $queue = new PushQueue(); |
| $queue->addTasks([$task1, $task2]); |
| $this->apiProxyMock->verify(); |
| } |
| |
| } |