Skip to content

Commit

Permalink
Merge pull request #219 from jeskew/feature/support-aws-sdk-v3
Browse files Browse the repository at this point in the history
Add support for using v3 of the AWS SDK for PHP
  • Loading branch information
henrikbjorn committed May 2, 2016
2 parents 11ad107 + d0f5eac commit f30c018
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 74 deletions.
4 changes: 4 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ php:

sudo: false

env:
- COMPOSER_OPTS=""
- COMPOSER_OPTS="--prefer-lowest"

cache:
directories:
- $HOME/.composer/cache/files
Expand Down
7 changes: 4 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"php": "~5.4|~7.0",
"bernard/normalt": "~1.0",
"symfony/event-dispatcher": "~2.3|~3.0",
"beberlei/assert": "~2.0"
"beberlei/assert": "~2.1"
},
"require-dev" : {
"psr/log": "~1.0",
Expand All @@ -20,10 +20,11 @@
"symfony/dependency-injection": "~2.3|~3.0",
"doctrine/dbal": "~2.3",
"iron-io/iron_mq": "~1.4",
"aws/aws-sdk-php": "~2.4",
"aws/aws-sdk-php": "~2.4|~3.0",
"pda/pheanstalk": "~3.0",
"league/container": "~1.0",
"php-amqplib/php-amqplib": "~2.5"
"php-amqplib/php-amqplib": "~2.5",
"phpspec/phpspec": "~2.0"
},
"suggest": {
"php-amqplib/php-amqplib": "Allow sending messages to an AMQP server using php-amqplib",
Expand Down
17 changes: 3 additions & 14 deletions src/Driver/SqsDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

namespace Bernard\Driver;

use Aws\Sqs\Exception\SqsException;
use Aws\Sqs\SqsClient;

/**
* Implements a Driver for use with AWS SQS client API:
* http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.Sqs.SqsClient.html
* @link http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sqs-2012-11-05.html
*
* @package Bernard
*/
Expand Down Expand Up @@ -171,19 +172,7 @@ protected function resolveUrl($queueName)
return $this->queueUrls[$queueName];
}

try {
$result = $this->sqs->getQueueUrl(['QueueName' => $queueName]);
} catch (SqsException $exception) {
if ($exception->getExceptionCode() === 'AWS.SimpleQueueService.NonExistentQueue') {
throw new SqsException(
'The queue "' . $queueName . '" is neither aliased locally to an SQS URL nor could it be resolved by SQS.',
$exception->getCode(),
$exception
);
}

throw $exception;
}
$result = $this->sqs->getQueueUrl(['QueueName' => $queueName]);

if ($result && $queueUrl = $result->get('QueueUrl')) {
return $this->queueUrls[$queueName] = $queueUrl;
Expand Down
125 changes: 70 additions & 55 deletions tests/Driver/SqsDriverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Bernard\Tests\Driver;

use Aws\Result;
use Aws\Sqs\SqsClient;
use Bernard\Driver\SqsDriver;
use Guzzle\Service\Resource\Model;
Expand All @@ -25,15 +26,15 @@ public function setUp()
))
->getMock();

$this->driver = new SqsDriver($this->sqs, array('send-newsletter' => 'url'));
$this->driver = new SqsDriver($this->sqs, ['send-newsletter' => 'url']);
}

public function testItExposesInfo()
{
$driver = new SqsDriver($this->sqs, array(), 10);
$driver = new SqsDriver($this->sqs, [], 10);

$this->assertEquals(array('prefetch' => 10), $driver->info());
$this->assertEquals(array('prefetch' => 2), $this->driver->info());
$this->assertEquals(['prefetch' => 10], $driver->info());
$this->assertEquals(['prefetch' => 2], $this->driver->info());
}

public function testItImplementsDriverInterface()
Expand All @@ -47,14 +48,14 @@ public function testItCountsNumberOfMessagesInQueue()
$this->sqs
->expects($this->once())
->method('getQueueAttributes')
->with($this->equalTo(array(
->with($this->equalTo([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX. '/'. self::DUMMY_QUEUE_NAME,
'AttributeNames' => array('ApproximateNumberOfMessages'),
)))
]))
->will($this->returnValue(
new Model(array(
'Attributes' => array('ApproximateNumberOfMessages' => 4),
))
$this->wrapResult([
'Attributes' => ['ApproximateNumberOfMessages' => 4],
])
));

$this->assertEquals(4, $this->driver->countMessages(self::DUMMY_QUEUE_NAME));
Expand All @@ -69,20 +70,20 @@ public function testUnresolveableQueueNameThrowsException()

public function testItGetsAllQueues()
{
$driver = new SqsDriver($this->sqs, array(
$driver = new SqsDriver($this->sqs, [
'import-users' => 'alreadyknowurl/import_users_prod'
));
]);

$this->sqs
->expects($this->once())
->method('listQueues')
->will($this->returnValue(new Model(array(
'QueueUrls' => array(
->will($this->returnValue($this->wrapResult([
'QueueUrls' => [
'https://sqs.eu-west-1.amazonaws.com/123123/failed',
'https://sqs.eu-west-1.amazonaws.com/123123/queue1',
'alreadyknowurl/import_users_prod',
)
))));
]
])));

$queues = array('import-users', 'failed', 'queue1');

Expand All @@ -97,18 +98,18 @@ public function testItPrefetchesMessages()
'WaitTimeSeconds' => 5,
);

$sqsMessages = new Model(array(
'Messages' => array(
array('Body' => 'message0', 'ReceiptHandle' => 'r0'),
array('Body' => 'message1', 'ReceiptHandle' => 'r1'),
),
));
$sqsMessages = $this->wrapResult([
'Messages' => [
['Body' => 'message0', 'ReceiptHandle' => 'r0'],
['Body' => 'message1', 'ReceiptHandle' => 'r1'],
],
]);

$this->sqs->expects($this->once())->method('receiveMessage')
->with($this->equalTo($query))->will($this->returnValue($sqsMessages));

$this->assertEquals(array('message0', 'r0'), $this->driver->popMessage('send-newsletter'));
$this->assertEquals(array('message1', 'r1'), $this->driver->popMessage('send-newsletter'));
$this->assertEquals(['message0', 'r0'], $this->driver->popMessage('send-newsletter'));
$this->assertEquals(['message1', 'r1'], $this->driver->popMessage('send-newsletter'));
}

public function testItPushesMessages()
Expand All @@ -117,10 +118,10 @@ public function testItPushesMessages()
$this->sqs
->expects($this->once())
->method('sendMessage')
->with($this->equalTo(array(
->with($this->equalTo([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX. '/'. self::DUMMY_QUEUE_NAME,
'MessageBody' => 'This is a message'
)));
]));
$this->driver->pushMessage('my-queue', 'This is a message');
}

Expand All @@ -129,56 +130,62 @@ public function testItPopMessages()
$this->sqs
->expects($this->at(0))
->method('getQueueUrl')
->with($this->equalTo(array(
->with($this->equalTo([
'QueueName' => self::DUMMY_QUEUE_NAME. '0',
)))
->will($this->returnValue(new Model(array('QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX. '/'. self::DUMMY_QUEUE_NAME. '0'))));
]))
->will($this->returnValue($this->wrapResult([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX
. '/'. self::DUMMY_QUEUE_NAME. '0',
])));
$this->sqs
->expects($this->at(1))
->method('receiveMessage')
->with($this->equalTo(array(
->with($this->equalTo([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX. '/'. self::DUMMY_QUEUE_NAME. '0',
'MaxNumberOfMessages' => 2,
'WaitTimeSeconds' => 5,
)))
->will($this->returnValue(new Model(array(
'Messages' => array(
array('Body' => 'message0', 'ReceiptHandle' => 'r0')
)
))));
]))
->will($this->returnValue($this->wrapResult([
'Messages' => [
['Body' => 'message0', 'ReceiptHandle' => 'r0']
]
])));

$this->sqs
->expects($this->at(2))
->method('getQueueUrl')
->with($this->equalTo(array(
->with($this->equalTo([
'QueueName' => self::DUMMY_QUEUE_NAME. '1'
)))
->will($this->returnValue(new Model(array(
]))
->will($this->returnValue($this->wrapResult([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX . '/my-queue1',
))));
])));
$this->sqs
->expects($this->at(3))
->method('receiveMessage')
->with($this->equalTo(array(
->with($this->equalTo([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX. '/my-queue1',
'MaxNumberOfMessages' => 2,
'WaitTimeSeconds' => 30,
)))
->will($this->returnValue(new Model(array(
'Messages' => array(
array('Body' => 'message1', 'ReceiptHandle' => 'r1')
)
))));

$this->assertEquals(array('message0', 'r0'), $this->driver->popMessage('my-queue0'));
$this->assertEquals(array('message1', 'r1'), $this->driver->popMessage('my-queue1', 30));
$this->assertEquals(array(null, null), $this->driver->popMessage('send-newsletter'));
]))
->will($this->returnValue($this->wrapResult([
'Messages' => [
['Body' => 'message1', 'ReceiptHandle' => 'r1'],
],
])));

$this->assertEquals(['message0', 'r0'], $this->driver->popMessage('my-queue0'));
$this->assertEquals(['message1', 'r1'], $this->driver->popMessage('my-queue1', 30));
$this->assertEquals([null, null], $this->driver->popMessage('send-newsletter'));
}

public function testAcknowledgeMessage()
{
$this->sqs->expects($this->once())->method('deleteMessage')
->with($this->equalTo(array('QueueUrl' => 'url', 'ReceiptHandle' => 'r0')));
->with($this->equalTo([
'QueueUrl' => 'url',
'ReceiptHandle' => 'r0',
]));

$this->driver->acknowledgeMessage('send-newsletter', 'r0');
}
Expand All @@ -188,9 +195,17 @@ private function assertSqsQueueUrl()
$this->sqs
->expects($this->once())
->method('getQueueUrl')
->with($this->equalTo(array(
'QueueName' => self::DUMMY_QUEUE_NAME
)))
->will($this->returnValue(new Model(array('QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX. '/'. self::DUMMY_QUEUE_NAME))));
->with($this->equalTo(['QueueName' => self::DUMMY_QUEUE_NAME]))
->will($this->returnValue($this->wrapResult([
'QueueUrl' => self::DUMMY_QUEUE_URL_PREFIX
. '/'. self::DUMMY_QUEUE_NAME,
])));
}

private function wrapResult($data = [])
{
return class_exists('Aws\Common\Aws')
? new Model($data)
: new Result($data);
}
}
5 changes: 3 additions & 2 deletions tests/travis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ fi

if [ $TRAVIS_PHP_VERSION = "hhvm" ]; then
composer require --dev mongofill/mongofill=dev-master --no-update;
composer update --no-progress --no-plugins;
else
composer update --no-progress --no-plugins $COMPOSER_OPTS;
fi

composer require --dev phpspec/phpspec:~2.0 --no-update
composer install --no-progress --no-plugins
mysql -e "CREATE DATABASE bernard_test;"
psql -c 'CREATE DATABASE bernard_test;' -U postgres

0 comments on commit f30c018

Please sign in to comment.