TestCase.php 12 KB

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