/tests/Zend/Cloud/QueueService/TestCase.php

https://github.com/jtai/zf2 · PHP · 343 lines · 248 code · 35 blank · 60 comment · 11 complexity · 839a8743e30f641203b2ab606b920cfe MD5 · raw file

  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend\Cloud\QueueService
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. */
  21. namespace ZendTest\Cloud\QueueService;
  22. use Zend\Cloud\QueueService\Adapter,
  23. Zend\Config\Config,
  24. Zend\Cloud\QueueService\Factory,
  25. PHPUnit_Framework_TestCase as PHPUnitTestCase;
  26. /**
  27. * This class forces the adapter tests to implement tests for all methods on
  28. * Zend\Cloud_QueueService.
  29. *
  30. * @category Zend
  31. * @package Zend\Cloud\QueueService
  32. * @subpackage UnitTests
  33. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  34. * @license http://framework.zend.com/license/new-bsd New BSD License
  35. */
  36. abstract class TestCase extends PHPUnitTestCase
  37. {
  38. /**
  39. * Reference to queue adapter to test
  40. *
  41. * @var Zend\Cloud\QueueService
  42. */
  43. protected $_commonQueue;
  44. protected $_dummyNamePrefix = '/TestItem';
  45. protected $_dummyDataPrefix = 'TestData';
  46. protected $_clientType = 'stdClass';
  47. /**
  48. * Config object
  49. *
  50. * @var Zend\Config\Config
  51. */
  52. protected $_config;
  53. /**
  54. * Period to wait for propagation in seconds
  55. * Should be set by adapter
  56. *
  57. * @var int
  58. */
  59. protected $_waitPeriod = 1;
  60. public function setUp()
  61. {
  62. $this->_config = $this->_getConfig();
  63. $this->_commonQueue = Factory::getAdapter($this->_config);
  64. }
  65. public function testGetClient()
  66. {
  67. $this->assertInstanceOf($this->_clientType, $this->_commonQueue->getClient());
  68. }
  69. public function testCreateQueue()
  70. {
  71. try {
  72. // Create timeout default should be 30 seconds
  73. $startTime = time();
  74. $queueURL = $this->_commonQueue->createQueue('test-create-queue');
  75. $endTime = time();
  76. $this->assertNotNull($queueURL);
  77. $this->assertLessThan(30, $endTime - $startTime);
  78. $this->_commonQueue->deleteQueue($queueURL);
  79. } catch (Exception $e) {
  80. if(isset($queueURL)) $this->_commonQueue->deleteQueue($queueURL);
  81. throw $e;
  82. }
  83. }
  84. public function testDeleteQueue()
  85. {
  86. try {
  87. $queueURL = $this->_commonQueue->createQueue('test-delete-queue');
  88. $this->assertNotNull($queueURL);
  89. $this->_commonQueue->deleteQueue($queueURL);
  90. $this->_wait();
  91. $this->_wait();
  92. $this->_wait();
  93. try {
  94. $messages = $this->_commonQueue->receiveMessages($queueURL);
  95. $this->fail('An exception should have been thrown if the queue has been deleted; received ' . var_export($messages, 1));
  96. } catch (\Zend\Cloud\QueueService\Exception $e) {
  97. $this->assertTrue(true);
  98. $this->_commonQueue->deleteQueue($queueURL);
  99. return;
  100. }
  101. } catch (Exception $e) {
  102. if(isset($queueURL)) $this->_commonQueue->deleteQueue($queueURL);
  103. throw $e;
  104. }
  105. }
  106. public function testListQueues()
  107. {
  108. try {
  109. $queues = $this->_commonQueue->listQueues();
  110. $this->_wait();
  111. if (count($queues)) {
  112. foreach ($queues as $queue) {
  113. $this->_commonQueue->deleteQueue($queue);
  114. $this->_wait();
  115. }
  116. }
  117. $queueURL1 = $this->_commonQueue->createQueue('test-list-queue1');
  118. $this->assertNotNull($queueURL1);
  119. $this->_wait();
  120. $queueURL2 = $this->_commonQueue->createQueue('test-list-queue2');
  121. $this->assertNotNull($queueURL2);
  122. $this->_wait();
  123. $queues = $this->_commonQueue->listQueues();
  124. $errorMessage = "Final queues are ";
  125. foreach ($queues as $queue) {
  126. $errorMessage .= $queue . ', ';
  127. }
  128. $errorMessage .= "\nHave queue URLs $queueURL1 and $queueURL2\n";
  129. $this->assertEquals(2, count($queues), $errorMessage);
  130. // PHPUnit does an identical comparison for assertContains(), so we just
  131. // use assertTrue and in_array()
  132. $this->assertTrue(in_array($queueURL1, $queues));
  133. $this->assertTrue(in_array($queueURL2, $queues));
  134. $this->_commonQueue->deleteQueue($queueURL1);
  135. $this->_commonQueue->deleteQueue($queueURL2);
  136. } catch (Exception $e) {
  137. if (isset($queueURL1)) {
  138. $this->_commonQueue->deleteQueue($queueURL1);
  139. }
  140. if (isset($queueURL2)) {
  141. $this->_commonQueue->deleteQueue($queueURL2);
  142. }
  143. throw $e;
  144. }
  145. }
  146. public function testStoresAndFetchesQueueMetadata()
  147. {
  148. try {
  149. $queueURL = $this->_commonQueue->createQueue('test-fetch-queue-metadata');
  150. $this->assertNotNull($queueURL);
  151. $this->_wait();
  152. $this->_commonQueue->storeQueueMetadata($queueURL, array('purpose' => 'test'));
  153. $this->_wait();
  154. $metadata = $this->_commonQueue->fetchQueueMetadata($queueURL);
  155. $this->assertTrue(is_array($metadata));
  156. $this->assertGreaterThan(0, count($metadata));
  157. $this->_commonQueue->deleteQueue($queueURL);
  158. } catch (Exception $e) {
  159. if (isset($queueURL)) {
  160. $this->_commonQueue->deleteQueue($queueURL);
  161. }
  162. throw $e;
  163. }
  164. }
  165. public function testSendMessage()
  166. {
  167. try {
  168. $queueURL = $this->_commonQueue->createQueue('test-send-message');
  169. $this->assertNotNull($queueURL);
  170. $this->_wait();
  171. $message = 'testSendMessage - Message 1';
  172. $this->_commonQueue->sendMessage($queueURL, $message);
  173. $this->_wait();
  174. $receivedMessages = $this->_commonQueue->receiveMessages($queueURL);
  175. $this->assertInstanceOf('Zend\Cloud\QueueService\MessageSet', $receivedMessages);
  176. $this->assertEquals(1, count($receivedMessages));
  177. foreach ($receivedMessages as $m) {
  178. $this->assertEquals($message, $m->getBody());
  179. }
  180. $this->_commonQueue->deleteQueue($queueURL);
  181. } catch (Exception $e) {
  182. if(isset($queueURL)) $this->_commonQueue->deleteQueue($queueURL);
  183. throw $e;
  184. }
  185. }
  186. public function testReceiveMessages()
  187. {
  188. $queueURL = null;
  189. try {
  190. $queueURL = $this->_commonQueue->createQueue('test-receive-messages');
  191. $this->assertNotNull($queueURL);
  192. $this->_wait();
  193. $message1 = 'testReceiveMessages - Message 1';
  194. $message2 = 'testReceiveMessages - Message 2';
  195. $this->_commonQueue->sendMessage($queueURL, $message1);
  196. $this->_commonQueue->sendMessage($queueURL, $message2);
  197. $this->_wait();
  198. $this->_wait();
  199. // receive one message
  200. $receivedMessages1 = $this->_commonQueue->receiveMessages($queueURL);
  201. $this->assertInstanceOf('Zend\Cloud\QueueService\MessageSet', $receivedMessages1);
  202. $this->assertEquals(1, count($receivedMessages1));
  203. foreach ($receivedMessages1 as $receivedMessage1) {
  204. $this->assertInstanceOf('Zend\Cloud\QueueService\Message', $receivedMessage1);
  205. }
  206. // cleanup the queue
  207. foreach ($receivedMessages1 as $message) {
  208. $this->_commonQueue->deleteMessage($queueURL, $message);
  209. }
  210. $this->_wait();
  211. $this->_wait();
  212. // send 2 messages again
  213. $this->_commonQueue->sendMessage($queueURL, $message1);
  214. $this->_commonQueue->sendMessage($queueURL, $message2);
  215. $this->_wait();
  216. $this->_wait();
  217. $this->_wait();
  218. $this->_wait();
  219. // receive both messages
  220. $receivedMessages2 = $this->_commonQueue->receiveMessages($queueURL, 2);
  221. $this->assertInstanceOf('Zend\Cloud\QueueService\MessageSet', $receivedMessages2);
  222. $this->assertEquals(2, count($receivedMessages2));
  223. $tests = array();
  224. foreach ($receivedMessages2 as $message) {
  225. $tests[] = $message;
  226. }
  227. $texts = array($tests[0]->getBody(), $tests[1]->getBody());
  228. $this->assertContains($message1, $texts);
  229. $this->assertContains($message2, $texts);
  230. $this->_commonQueue->deleteQueue($queueURL);
  231. } catch (Exception $e) {
  232. if (isset($queueURL)) {
  233. $this->_commonQueue->deleteQueue($queueURL);
  234. }
  235. throw $e;
  236. }
  237. }
  238. public function testDeleteMessage()
  239. {
  240. try {
  241. $queueURL = $this->_commonQueue->createQueue('test-delete-messages');
  242. $this->assertNotNull($queueURL);
  243. $this->_wait();
  244. $this->_wait();
  245. $message1 = 'testDeleteMessage - Message 1';
  246. $this->_commonQueue->sendMessage($queueURL, $message1);
  247. $this->_wait();
  248. $this->_wait();
  249. $receivedMessages1 = $this->_commonQueue->receiveMessages($queueURL);
  250. // should receive one $message1
  251. $this->assertInstanceOf('Zend\Cloud\QueueService\MessageSet', $receivedMessages1);
  252. $this->assertEquals(1, count($receivedMessages1));
  253. foreach ($receivedMessages1 as $receivedMessage1) {
  254. $this->assertEquals($message1, $receivedMessage1->getBody());
  255. }
  256. $this->_commonQueue->deleteMessage($queueURL, $receivedMessage1);
  257. $this->_wait();
  258. $this->_wait();
  259. // now there should be no messages left
  260. $receivedMessages2 = $this->_commonQueue->receiveMessages($queueURL);
  261. $this->assertInstanceOf('Zend\Cloud\QueueService\MessageSet', $receivedMessages2);
  262. $this->assertEquals(0, count($receivedMessages2));
  263. $this->_commonQueue->deleteQueue($queueURL);
  264. } catch (Exception $e) {
  265. if(isset($queueURL)) $this->_commonQueue->deleteQueue($queueURL);
  266. throw $e;
  267. }
  268. }
  269. public function testPeekMessages()
  270. {
  271. try {
  272. $queueURL = $this->_commonQueue->createQueue('test-peek-messages');
  273. $this->assertNotNull($queueURL);
  274. $this->_wait();
  275. $message1 = 'testPeekMessage - Message 1';
  276. $this->_commonQueue->sendMessage($queueURL, $message1);
  277. $this->_wait();
  278. $peekedMessages = $this->_commonQueue->peekMessages($queueURL, 1);
  279. foreach ($peekedMessages as $message) {
  280. $this->assertEquals($message1, $message->getBody());
  281. break;
  282. }
  283. // and again
  284. $peekedMessages = $this->_commonQueue->peekMessages($queueURL, 1);
  285. foreach ($peekedMessages as $message) {
  286. $this->assertEquals($message1, $message->getBody());
  287. break;
  288. }
  289. $this->_commonQueue->deleteQueue($queueURL);
  290. } catch (Exception $e) {
  291. if(isset($queueURL)) $this->_commonQueue->deleteQueue($queueURL);
  292. throw $e;
  293. }
  294. }
  295. protected function _wait($duration = null)
  296. {
  297. if (null === $duration) {
  298. $duration = $this->_waitPeriod;
  299. }
  300. sleep($duration);
  301. }
  302. /**
  303. * Get adapter configuration for concrete test
  304. *
  305. * @returns Zend\Config\Config
  306. */
  307. abstract protected function _getConfig();
  308. }