Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ parameters:
paths:
- src
level: 9
# QueuePaused/QueueResumed only exist in newer Laravel versions; the code
# guards them with class_exists(), so the ignore is unmatched on versions
# where they do exist. Don't fail when that happens.
reportUnmatchedIgnoredErrors: false
ignoreErrors:
- "/dispatchAfterCommit with no type specified/"
- message: "#Illuminate\\\\Queue\\\\Events\\\\Queue(Paused|Resumed)#"
Expand Down
5 changes: 3 additions & 2 deletions src/CloudTasksApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@
namespace Stackkit\LaravelGoogleCloudTasksQueue;

use Google\Cloud\Tasks\V2\Task;
use Google\Cloud\Tasks\V2\Queue;
use Illuminate\Support\Facades\Facade;

/**
* @method static Task createTask(string $queueName, Task $task)
* @method static void deleteTask(string $taskName)
* @method static Task getTask(string $taskName)
* @method static bool exists(string $taskName)
* @method static void pause(string $queue)
* @method static void resume(string $queue)
* @method static Queue pause(string $queue)
* @method static Queue resume(string $queue)
*/
class CloudTasksApi extends Facade
{
Expand Down
9 changes: 5 additions & 4 deletions src/CloudTasksApiConcrete.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Google\Cloud\Tasks\V2\Task;
use Google\ApiCore\ApiException;
use Google\Cloud\Tasks\V2\Queue;
use Google\Cloud\Tasks\V2\GetTaskRequest;
use Google\Cloud\Tasks\V2\CreateTaskRequest;
use Google\Cloud\Tasks\V2\DeleteTaskRequest;
Expand Down Expand Up @@ -68,13 +69,13 @@ public function exists(string $taskName): bool
return false;
}

public function pause(string $queue): void
public function pause(string $queue): Queue
{
$this->client->pauseQueue(PauseQueueRequest::build($queue));
return $this->client->pauseQueue(PauseQueueRequest::build($queue));
}

public function resume(string $queue): void
public function resume(string $queue): Queue
{
$this->client->resumeQueue(ResumeQueueRequest::build($queue));
return $this->client->resumeQueue(ResumeQueueRequest::build($queue));
}
}
5 changes: 3 additions & 2 deletions src/CloudTasksApiContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Stackkit\LaravelGoogleCloudTasksQueue;

use Google\Cloud\Tasks\V2\Task;
use Google\Cloud\Tasks\V2\Queue;

interface CloudTasksApiContract
{
Expand All @@ -16,7 +17,7 @@ public function getTask(string $taskName): Task;

public function exists(string $taskName): bool;

public function pause(string $queue): void;
public function pause(string $queue): Queue;

public function resume(string $queue): void;
public function resume(string $queue): Queue;
}
10 changes: 8 additions & 2 deletions src/CloudTasksApiFake.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use Closure;
use PHPUnit\Framework\Assert;
use Google\Cloud\Tasks\V2\Task;
use Google\Cloud\Tasks\V2\Queue;
use Google\Cloud\Tasks\V2\Queue\State;

class CloudTasksApiFake implements CloudTasksApiContract
{
Expand Down Expand Up @@ -56,14 +58,18 @@ public function exists(string $taskName): bool
return false;
}

public function pause(string $queue): void
public function pause(string $queue): Queue
{
$this->pausedQueues[$queue] = true;

return (new Queue)->setName($queue)->setState(State::PAUSED);
}

public function resume(string $queue): void
public function resume(string $queue): Queue
{
unset($this->pausedQueues[$queue]);

return (new Queue)->setName($queue)->setState(State::RUNNING);
}

public function assertTaskDeleted(string $taskName): void
Expand Down
55 changes: 4 additions & 51 deletions tests/CloudTasksApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
use Google\Cloud\Tasks\V2\HttpRequest;
use Google\Cloud\Tasks\V2\Queue\State;
use PHPUnit\Framework\Attributes\Test;
use Google\Cloud\Tasks\V2\GetQueueRequest;
use Google\Cloud\Tasks\V2\Client\CloudTasksClient;
use Stackkit\LaravelGoogleCloudTasksQueue\CloudTasksApi;

Expand Down Expand Up @@ -150,13 +149,11 @@ public function it_can_pause_queues(): void
env('CI_CLOUD_TASKS_QUEUE').'-pause'
);

$this->ensureQueueIs($queueName, State::RUNNING);

// Act
CloudTasksApi::pause($queueName);
$queue = CloudTasksApi::pause($queueName);

// Assert
$this->assertEquals(State::PAUSED, $this->waitForQueueState($queueName, State::PAUSED));
$this->assertEquals(State::PAUSED, $queue->getState());
}

#[Test]
Expand All @@ -168,54 +165,10 @@ public function it_can_resume_queues(): void
env('CI_CLOUD_TASKS_QUEUE').'-pause'
);

$this->ensureQueueIs($queueName, State::PAUSED);

// Act
CloudTasksApi::resume($queueName);
$queue = CloudTasksApi::resume($queueName);

// Assert
$this->assertEquals(State::RUNNING, $this->waitForQueueState($queueName, State::RUNNING));
}

private function getQueueState(string $queue): int
{
return $this->client->getQueue(GetQueueRequest::build($queue))->getState();
}

private function waitForQueueState(string $queue, int $waitForState): ?int
{
$state = null;
$backoff = [1, 5, 10, 30, 60];

foreach ($backoff as $delay) {
$state = $this->getQueueState($queue);

if ($state === $waitForState) {
return $state;
}

sleep($delay);
}

return $this->getQueueState($queue);
}

private function ensureQueueIs(string $queue, int $desiredState): void
{
$currentState = $this->getQueueState($queue);

if ($currentState === $desiredState) {
return;
}

if ($currentState === State::RUNNING && $desiredState === State::PAUSED) {
CloudTasksApi::pause($queue);
}

if ($currentState === State::PAUSED && $desiredState === State::RUNNING) {
CloudTasksApi::resume($queue);
}

$this->assertEquals($desiredState, $this->waitForQueueState($queue, $desiredState));
$this->assertEquals(State::RUNNING, $queue->getState());
}
}
Loading