TableStorageTest.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  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_Service_WindowsAzure
  17. * @subpackage UnitTests
  18. * @version $Id$
  19. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  20. * @license http://framework.zend.com/license/new-bsd New BSD License
  21. */
  22. if (!defined('PHPUnit_MAIN_METHOD')) {
  23. define('PHPUnit_MAIN_METHOD', 'Zend_Service_WindowsAzure_TableStorageTest::main');
  24. }
  25. /**
  26. * Test helpers
  27. */
  28. require_once dirname(__FILE__) . '/../../../TestHelper.php';
  29. require_once dirname(__FILE__) . '/../../../TestConfiguration.php.dist';
  30. /** Zend_Service_WindowsAzure_Storage_Table */
  31. require_once 'Zend/Service/WindowsAzure/Storage/Table.php';
  32. /**
  33. * @category Zend
  34. * @package Zend_Service_WindowsAzure
  35. * @subpackage UnitTests
  36. * @version $Id$
  37. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  38. * @license http://framework.zend.com/license/new-bsd New BSD License
  39. */
  40. class Zend_Service_WindowsAzure_TableStorageTest extends PHPUnit_Framework_TestCase
  41. {
  42. public function __construct()
  43. {
  44. }
  45. public static function main()
  46. {
  47. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  48. $suite = new PHPUnit_Framework_TestSuite("Zend_Service_WindowsAzure_TableStorageTest");
  49. $result = PHPUnit_TextUI_TestRunner::run($suite);
  50. }
  51. }
  52. /**
  53. * Test setup
  54. */
  55. protected function setUp()
  56. {
  57. }
  58. /**
  59. * Test teardown
  60. */
  61. protected function tearDown()
  62. {
  63. $storageClient = $this->createStorageInstance();
  64. for ($i = 1; $i <= self::$uniqId; $i++)
  65. {
  66. try { $storageClient->deleteTable(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . $i); } catch (Exception $e) { }
  67. }
  68. }
  69. protected function createStorageInstance()
  70. {
  71. $storageClient = null;
  72. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNONPROD) {
  73. $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250));
  74. } else {
  75. $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250));
  76. }
  77. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) {
  78. $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS);
  79. }
  80. return $storageClient;
  81. }
  82. protected static $uniqId = 0;
  83. protected function generateName()
  84. {
  85. self::$uniqId++;
  86. return TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . self::$uniqId;
  87. }
  88. /**
  89. * Test create table
  90. */
  91. public function testCreateTable()
  92. {
  93. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  94. $tableName = $this->generateName();
  95. $storageClient = $this->createStorageInstance();
  96. $result = $storageClient->createTable($tableName);
  97. $this->assertEquals($tableName, $result->Name);
  98. $result = $storageClient->listTables();
  99. $this->assertEquals(1, count($result));
  100. $this->assertEquals($tableName, $result[0]->Name);
  101. }
  102. }
  103. /**
  104. * Test create table if not exists
  105. */
  106. public function testCreateTableIfNotExists()
  107. {
  108. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  109. $tableName = $this->generateName();
  110. $storageClient = $this->createStorageInstance();
  111. $result = $storageClient->tableExists($tableName);
  112. $this->assertFalse($result);
  113. $storageClient->createTableIfNotExists($tableName);
  114. $result = $storageClient->tableExists($tableName);
  115. $this->assertTrue($result);
  116. $storageClient->createTableIfNotExists($tableName);
  117. }
  118. }
  119. /**
  120. * Test table exists
  121. */
  122. public function testTableExists()
  123. {
  124. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  125. $tableName1 = $this->generateName();
  126. $tableName2 = $this->generateName();
  127. $storageClient = $this->createStorageInstance();
  128. $storageClient->createTable($tableName1);
  129. $storageClient->createTable($tableName2);
  130. $result = $storageClient->tableExists($tableName2);
  131. $this->assertTrue($result);
  132. $result = $storageClient->tableExists(md5(time()));
  133. $this->assertFalse($result);
  134. }
  135. }
  136. /**
  137. * Test list tables
  138. */
  139. public function testListTables()
  140. {
  141. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  142. $tableName1 = $this->generateName();
  143. $tableName2 = $this->generateName();
  144. $storageClient = $this->createStorageInstance();
  145. $storageClient->createTable($tableName1);
  146. $storageClient->createTable($tableName2);
  147. $result = $storageClient->listTables();
  148. $this->assertEquals(2, count($result));
  149. $this->assertEquals($tableName1, $result[0]->Name);
  150. $this->assertEquals($tableName2, $result[1]->Name);
  151. }
  152. }
  153. /**
  154. * Test delete table
  155. */
  156. public function testDeleteTable()
  157. {
  158. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  159. $tableName = $this->generateName();
  160. $storageClient = $this->createStorageInstance();
  161. $storageClient->createTable($tableName);
  162. $storageClient->deleteTable($tableName);
  163. $result = $storageClient->listTables();
  164. $this->assertEquals(0, count($result));
  165. }
  166. }
  167. /**
  168. * Test insert entity
  169. */
  170. public function testInsertEntity()
  171. {
  172. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  173. $tableName = $this->generateName();
  174. $storageClient = $this->createStorageInstance();
  175. $storageClient->createTable($tableName);
  176. $entities = $this->_generateEntities(1);
  177. $entity = $entities[0];
  178. $result = $storageClient->insertEntity($tableName, $entity);
  179. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  180. $this->assertNotEquals('', $result->getEtag());
  181. $this->assertEquals($entity, $result);
  182. }
  183. }
  184. /**
  185. * Test insert entity, with XML in content. This should not break the XML sent to Windows Azure.
  186. */
  187. public function testInsertEntity_Security_HtmlSpecialChars()
  188. {
  189. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  190. $tableName = $this->generateName();
  191. $storageClient = $this->createStorageInstance();
  192. $storageClient->createTable($tableName);
  193. $entities = $this->_generateEntities(1);
  194. $entity = $entities[0];
  195. $entity->FullName = 'XML <test>'; // this should work without breaking the XML
  196. $result = $storageClient->insertEntity($tableName, $entity);
  197. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  198. $this->assertNotEquals('', $result->getEtag());
  199. $this->assertEquals($entity, $result);
  200. }
  201. }
  202. /**
  203. * Test delete entity, not taking etag into account
  204. */
  205. public function testDeleteEntity_NoEtag()
  206. {
  207. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  208. $tableName = $this->generateName();
  209. $storageClient = $this->createStorageInstance();
  210. $storageClient->createTable($tableName);
  211. $entities = $this->_generateEntities(1);
  212. $entity = $entities[0];
  213. $result = $storageClient->insertEntity($tableName, $entity);
  214. $this->assertEquals($entity, $result);
  215. $storageClient->deleteEntity($tableName, $entity);
  216. }
  217. }
  218. /**
  219. * Test delete entity, taking etag into account
  220. */
  221. public function testDeleteEntity_Etag()
  222. {
  223. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  224. $tableName = $this->generateName();
  225. $storageClient = $this->createStorageInstance();
  226. $storageClient->createTable($tableName);
  227. $entities = $this->_generateEntities(1);
  228. $entity = $entities[0];
  229. $result = $storageClient->insertEntity($tableName, $entity);
  230. $this->assertEquals($entity, $result);
  231. // Set "old" etag
  232. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  233. $exceptionThrown = false;
  234. try {
  235. $storageClient->deleteEntity($tableName, $entity, true);
  236. } catch (Exception $ex) {
  237. $exceptionThrown = true;
  238. }
  239. $this->assertTrue($exceptionThrown);
  240. }
  241. }
  242. /**
  243. * Test retrieve entity by id
  244. */
  245. public function testRetrieveEntityById()
  246. {
  247. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  248. $tableName = $this->generateName();
  249. $storageClient = $this->createStorageInstance();
  250. $storageClient->createTable($tableName);
  251. $entities = $this->_generateEntities(1);
  252. $entity = $entities[0];
  253. $storageClient->insertEntity($tableName, $entity);
  254. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity');
  255. $this->assertEquals($entity, $result);
  256. }
  257. }
  258. /**
  259. * Test retrieve entity by id, havind less properties than the original entity.
  260. * Related to issue: http://phpazure.codeplex.com/workitem/5021
  261. */
  262. public function testRetrieveEntityById_DifferentProperties()
  263. {
  264. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  265. $tableName = $this->generateName();
  266. $storageClient = $this->createStorageInstance();
  267. $storageClient->createTable($tableName);
  268. $entities = $this->_generateEntities(1);
  269. $entity = $entities[0];
  270. $storageClient->insertEntity($tableName, $entity);
  271. $storageClient->setThrowExceptionOnMissingData(false);
  272. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity2');
  273. $this->assertEquals($entity->FullName, $result->FullName);
  274. }
  275. }
  276. /**
  277. * Test retrieve entity by id (> 256 key characters)
  278. */
  279. public function testRetrieveEntityById_Large()
  280. {
  281. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  282. $tableName = $this->generateName();
  283. $storageClient = $this->createStorageInstance();
  284. $storageClient->createTable($tableName);
  285. $entities = $this->_generateEntities(1);
  286. $entity = $entities[0];
  287. $entity->setPartitionKey(str_repeat('a', 200));
  288. $entity->setRowKey(str_repeat('a', 200));
  289. $storageClient->insertEntity($tableName, $entity);
  290. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity');
  291. $this->assertEquals($entity, $result);
  292. }
  293. }
  294. /**
  295. * Test retrieve entity by id, DynamicTableEntity
  296. */
  297. public function testRetrieveEntityById_DynamicTableEntity()
  298. {
  299. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  300. $tableName = $this->generateName();
  301. $storageClient = $this->createStorageInstance();
  302. $storageClient->createTable($tableName);
  303. $entities = $this->_generateEntities(1);
  304. $entity = $entities[0];
  305. $storageClient->insertEntity($tableName, $entity);
  306. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey());
  307. $this->assertEquals($entity->FullName, $result->Name);
  308. $this->assertTrue($result instanceof Zend_Service_WindowsAzure_Storage_DynamicTableEntity);
  309. }
  310. }
  311. /**
  312. * Test update entity, not taking etag into account
  313. */
  314. public function testUpdateEntity_NoEtag()
  315. {
  316. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  317. $tableName = $this->generateName();
  318. $storageClient = $this->createStorageInstance();
  319. $storageClient->createTable($tableName);
  320. $entities = $this->_generateEntities(1);
  321. $entity = $entities[0];
  322. $storageClient->insertEntity($tableName, $entity);
  323. $entity->Age = 0;
  324. $result = $storageClient->updateEntity($tableName, $entity);
  325. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  326. $this->assertNotEquals('', $result->getEtag());
  327. $this->assertEquals(0, $result->Age);
  328. $this->assertEquals($entity, $result);
  329. }
  330. }
  331. /**
  332. * Test update entity, taking etag into account
  333. */
  334. public function testUpdateEntity_Etag()
  335. {
  336. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  337. $tableName = $this->generateName();
  338. $storageClient = $this->createStorageInstance();
  339. $storageClient->createTable($tableName);
  340. $entities = $this->_generateEntities(1);
  341. $entity = $entities[0];
  342. $storageClient->insertEntity($tableName, $entity);
  343. $entity->Age = 0;
  344. // Set "old" etag
  345. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  346. $exceptionThrown = false;
  347. try {
  348. $storageClient->updateEntity($tableName, $entity, true);
  349. } catch (Exception $ex) {
  350. $exceptionThrown = true;
  351. }
  352. $this->assertTrue($exceptionThrown);
  353. }
  354. }
  355. /**
  356. * Test merge entity, not taking etag into account
  357. */
  358. public function testMergeEntity_NoEtag()
  359. {
  360. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  361. $tableName = $this->generateName();
  362. $storageClient = $this->createStorageInstance();
  363. $storageClient->createTable($tableName);
  364. $entities = $this->_generateEntities(1);
  365. $entity = $entities[0];
  366. $storageClient->insertEntity($tableName, $entity);
  367. $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey());
  368. $dynamicEntity->Myproperty = 10;
  369. $dynamicEntity->Otherproperty = "Test";
  370. $dynamicEntity->Age = 0;
  371. $storageClient->mergeEntity($tableName, $dynamicEntity, false, array('Myproperty', 'Otherproperty')); // only update 'Myproperty' and 'Otherproperty'
  372. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey());
  373. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  374. $this->assertNotEquals('', $result->getEtag());
  375. $this->assertNotEquals(0, $result->Age);
  376. $this->assertEquals($entity->FullName, $result->Name);
  377. $this->assertEquals($dynamicEntity->Myproperty, $result->Myproperty);
  378. $this->assertEquals($dynamicEntity->Otherproperty, $result->Otherproperty);
  379. }
  380. }
  381. /**
  382. * Test merge entity, taking etag into account
  383. */
  384. public function testMergeEntity_Etag()
  385. {
  386. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  387. $tableName = $this->generateName();
  388. $storageClient = $this->createStorageInstance();
  389. $storageClient->createTable($tableName);
  390. $entities = $this->_generateEntities(1);
  391. $entity = $entities[0];
  392. $storageClient->insertEntity($tableName, $entity);
  393. $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey());
  394. $dynamicEntity->Myproperty = 10;
  395. $dynamicEntity->Otherproperty = "Test";
  396. $dynamicEntity->Age = 0;
  397. // Set "old" etag
  398. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  399. $exceptionThrown = false;
  400. try {
  401. $storageClient->mergeEntity($tableName, $dynamicEntity, true);
  402. } catch (Exception $ex) {
  403. $exceptionThrown = true;
  404. }
  405. $this->assertTrue($exceptionThrown);
  406. }
  407. }
  408. /**
  409. * Test retrieve entities, all
  410. */
  411. public function testRetrieveEntities_All()
  412. {
  413. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  414. $tableName = $this->generateName();
  415. $storageClient = $this->createStorageInstance();
  416. $storageClient->createTable($tableName);
  417. $entities = $this->_generateEntities(20);
  418. foreach ($entities as $entity)
  419. {
  420. $storageClient->insertEntity($tableName, $entity);
  421. }
  422. $result = $storageClient->retrieveEntities($tableName, 'TSTest_TestEntity');
  423. $this->assertEquals(20, count($result));
  424. }
  425. }
  426. /**
  427. * Test retrieve entities, all, DynamicTableEntity
  428. */
  429. public function testRetrieveEntities_All_DynamicTableEntity()
  430. {
  431. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  432. $tableName = $this->generateName();
  433. $storageClient = $this->createStorageInstance();
  434. $storageClient->createTable($tableName);
  435. $entities = $this->_generateEntities(20);
  436. foreach ($entities as $entity)
  437. {
  438. $storageClient->insertEntity($tableName, $entity);
  439. }
  440. $result = $storageClient->retrieveEntities($tableName);
  441. $this->assertEquals(20, count($result));
  442. foreach ($result as $item)
  443. {
  444. $this->assertTrue($item instanceof Zend_Service_WindowsAzure_Storage_DynamicTableEntity);
  445. }
  446. }
  447. }
  448. /**
  449. * Test retrieve entities, filtered
  450. */
  451. public function testRetrieveEntities_Filtered()
  452. {
  453. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  454. $tableName = $this->generateName();
  455. $storageClient = $this->createStorageInstance();
  456. $storageClient->createTable($tableName);
  457. $entities = $this->_generateEntities(5);
  458. foreach ($entities as $entity)
  459. {
  460. $storageClient->insertEntity($tableName, $entity);
  461. }
  462. $result = $storageClient->retrieveEntities($tableName, 'PartitionKey eq \'' . $entities[0]->getPartitionKey() . '\' and RowKey eq \'' . $entities[0]->getRowKey() . '\'', 'TSTest_TestEntity');
  463. $this->assertEquals(1, count($result));
  464. }
  465. }
  466. /**
  467. * Test retrieve entities, fluent interface
  468. */
  469. public function testRetrieveEntities_Fluent1()
  470. {
  471. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  472. $tableName = $this->generateName();
  473. $storageClient = $this->createStorageInstance();
  474. $storageClient->createTable($tableName);
  475. $entities = $this->_generateEntities(10);
  476. foreach ($entities as $entity)
  477. {
  478. $storageClient->insertEntity($tableName, $entity);
  479. }
  480. $result = $storageClient->retrieveEntities(
  481. $storageClient->select()
  482. ->from($tableName)
  483. ->where('Name eq ?', $entities[0]->FullName)
  484. ->andWhere('RowKey eq ?', $entities[0]->getRowKey()),
  485. 'TSTest_TestEntity'
  486. );
  487. $this->assertEquals(1, count($result));
  488. $this->assertEquals($entities[0], $result[0]);
  489. }
  490. }
  491. /**
  492. * Test retrieve entities, fluent interface
  493. */
  494. public function testRetrieveEntities_Fluent2()
  495. {
  496. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  497. $tableName = $this->generateName();
  498. $storageClient = $this->createStorageInstance();
  499. $storageClient->createTable($tableName);
  500. $entities = $this->_generateEntities(10);
  501. foreach ($entities as $entity)
  502. {
  503. $storageClient->insertEntity($tableName, $entity);
  504. }
  505. $result = $storageClient->retrieveEntities(
  506. $storageClient->select()
  507. ->from($tableName)
  508. ->where('Name eq ?', $entities[0]->FullName)
  509. ->andWhere('PartitionKey eq ?', $entities[0]->getPartitionKey()),
  510. 'TSTest_TestEntity'
  511. );
  512. $this->assertEquals(1, count($result));
  513. $this->assertEquals($entities[0], $result[0]);
  514. }
  515. }
  516. /**
  517. * Test retrieve entities, fluent interface, top specification
  518. */
  519. public function testRetrieveEntities_Fluent_Top()
  520. {
  521. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  522. $tableName = $this->generateName();
  523. $storageClient = $this->createStorageInstance();
  524. $storageClient->createTable($tableName);
  525. $entities = $this->_generateEntities(10);
  526. foreach ($entities as $entity)
  527. {
  528. $storageClient->insertEntity($tableName, $entity);
  529. }
  530. $result = $storageClient->retrieveEntities(
  531. $storageClient->select()->top(4)
  532. ->from($tableName),
  533. 'TSTest_TestEntity'
  534. );
  535. $this->assertEquals(4, count($result));
  536. }
  537. }
  538. /**
  539. * Test batch commit, success
  540. */
  541. public function testBatchCommit_Success()
  542. {
  543. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  544. $tableName = $this->generateName();
  545. $storageClient = $this->createStorageInstance();
  546. $storageClient->createTable($tableName);
  547. $entities = $this->_generateEntities(20);
  548. $entities1 = array_slice($entities, 0, 10);
  549. $entities2 = array_slice($entities, 10, 10);
  550. // Insert entities
  551. foreach ($entities1 as $entity)
  552. {
  553. $storageClient->insertEntity($tableName, $entity);
  554. }
  555. // Start batch
  556. $batch = $storageClient->startBatch();
  557. $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch);
  558. // Insert entities in batch
  559. foreach ($entities2 as $entity)
  560. {
  561. $storageClient->insertEntity($tableName, $entity);
  562. }
  563. // Delete entities
  564. foreach ($entities1 as $entity)
  565. {
  566. $storageClient->deleteEntity($tableName, $entity);
  567. }
  568. // Commit
  569. $batch->commit();
  570. // Verify
  571. $result = $storageClient->retrieveEntities($tableName);
  572. $this->assertEquals(10, count($result));
  573. }
  574. }
  575. /**
  576. * Test batch rollback, success
  577. */
  578. public function testBatchRollback_Success()
  579. {
  580. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  581. $tableName = $this->generateName();
  582. $storageClient = $this->createStorageInstance();
  583. $storageClient->createTable($tableName);
  584. $entities = $this->_generateEntities(10);
  585. // Start batch
  586. $batch = $storageClient->startBatch();
  587. $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch);
  588. // Insert entities in batch
  589. foreach ($entities as $entity)
  590. {
  591. $storageClient->insertEntity($tableName, $entity);
  592. }
  593. // Rollback
  594. $batch->rollback();
  595. // Verify
  596. $result = $storageClient->retrieveEntities($tableName);
  597. $this->assertEquals(0, count($result));
  598. }
  599. }
  600. /**
  601. * Test batch commit, fail updates
  602. */
  603. public function testBatchCommit_FailUpdates()
  604. {
  605. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  606. $tableName = $this->generateName();
  607. $storageClient = $this->createStorageInstance();
  608. $storageClient->createTable($tableName);
  609. $entities = $this->_generateEntities(10);
  610. foreach ($entities as $entity)
  611. {
  612. $storageClient->insertEntity($tableName, $entity);
  613. }
  614. // Make some entity updates with "old" etags
  615. $entities[0]->Age = 0;
  616. $entities[0]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  617. $entities[1]->Age = 0;
  618. $entities[1]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  619. $entities[2]->Age = 0;
  620. // Start batch
  621. $batch = $storageClient->startBatch();
  622. $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch);
  623. // Update entities in batch
  624. $storageClient->updateEntity($tableName, $entities[0], true);
  625. $storageClient->updateEntity($tableName, $entities[1], true);
  626. $storageClient->updateEntity($tableName, $entities[2], true);
  627. // Commit
  628. $exceptionThrown = false;
  629. try {
  630. $batch->commit();
  631. } catch (Exception $ex) {
  632. $exceptionThrown = true;
  633. }
  634. $this->assertTrue($exceptionThrown);
  635. }
  636. }
  637. /**
  638. * Test batch commit, fail partition
  639. */
  640. public function testBatchCommit_FailPartition()
  641. {
  642. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  643. $tableName = $this->generateName();
  644. $storageClient = $this->createStorageInstance();
  645. $storageClient->createTable($tableName);
  646. $entities = $this->_generateEntities(10);
  647. // Start batch
  648. $batch = $storageClient->startBatch();
  649. $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch);
  650. // Insert entities in batch
  651. foreach ($entities as $entity)
  652. {
  653. $entity->setPartitionKey('partition' . rand(1, 9));
  654. $storageClient->insertEntity($tableName, $entity);
  655. }
  656. // Commit
  657. $exceptionThrown = false;
  658. try {
  659. $batch->commit();
  660. } catch (Exception $ex) {
  661. $exceptionThrown = true;
  662. }
  663. $this->assertTrue($exceptionThrown);
  664. // Verify
  665. $result = $storageClient->retrieveEntities($tableName);
  666. $this->assertEquals(0, count($result));
  667. }
  668. }
  669. /**
  670. * Test continuation tokens
  671. */
  672. public function testContinuationTokens()
  673. {
  674. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  675. $tableName = $this->generateName();
  676. $storageClient = $this->createStorageInstance();
  677. $storageClient->createTable($tableName);
  678. $numberOfEntities = 2500;
  679. $numberOfEntitiesPerBatch = 100;
  680. $entities = $this->_generateEntities($numberOfEntities);
  681. // Insert test data
  682. for ($i = 0; $i < $numberOfEntities; $i+=$numberOfEntitiesPerBatch) {
  683. $batch = $storageClient->startBatch();
  684. $entitiesTemp = array_slice($entities, $i, $numberOfEntitiesPerBatch);
  685. foreach ($entitiesTemp as $entity)
  686. {
  687. $storageClient->insertEntity($tableName, $entity);
  688. }
  689. $batch->commit();
  690. }
  691. // Verify
  692. $result = $storageClient->retrieveEntities($tableName);
  693. $this->assertEquals(2500, count($result));
  694. $result = $storageClient->retrieveEntities(
  695. $storageClient->select()
  696. ->from($tableName)
  697. ->where('Age ne 0')
  698. );
  699. $this->assertEquals(2500, count($result));
  700. }
  701. }
  702. /**
  703. * Test retrieve entity by id - curly brackets
  704. */
  705. public function testRetrieveEntityByIdCurlyBrackets()
  706. {
  707. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  708. $tableName = $this->generateName();
  709. $storageClient = $this->createStorageInstance();
  710. $storageClient->createTable($tableName);
  711. $entities = $this->_generateEntities(1);
  712. $entity = $entities[0];
  713. $entity->setRowKey('-1305521559_{47418E06-58CC-40CA-AE7E-F2B0BD5FD885}');
  714. $storageClient->insertEntity($tableName, $entity);
  715. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity');
  716. $this->assertEquals($entity, $result);
  717. }
  718. }
  719. /**
  720. * Generate entities
  721. *
  722. * @param int $amount Number of entities to generate
  723. * @return array Array of TSTest_TestEntity
  724. */
  725. protected function _generateEntities($amount = 1)
  726. {
  727. $returnValue = array();
  728. for ($i = 0; $i < $amount; $i++)
  729. {
  730. $entity = new TSTest_TestEntity('partition1', 'row' . ($i + 1));
  731. $entity->FullName = md5(uniqid(rand(), true));
  732. $entity->Age = rand(1, 130);
  733. $entity->Visible = rand(1,2) == 1;
  734. $entity->DateInService = new DateTime('now', new DateTimeZone('UTC'));
  735. $returnValue[] = $entity;
  736. }
  737. return $returnValue;
  738. }
  739. }
  740. /**
  741. * Test Zend_Service_WindowsAzure_Storage_TableEntity class
  742. */
  743. class TSTest_TestEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
  744. {
  745. /**
  746. * @azure Name
  747. */
  748. public $FullName;
  749. /**
  750. * @azure Age Edm.Int64
  751. */
  752. public $Age;
  753. /**
  754. * @azure Visible Edm.Boolean
  755. */
  756. public $Visible = false;
  757. /**
  758. * @azure DateInService Edm.DateTime
  759. */
  760. public $DateInService;
  761. }
  762. /**
  763. * Test Zend_Service_WindowsAzure_Storage_TableEntity class
  764. */
  765. class TSTest_TestEntity2 extends Zend_Service_WindowsAzure_Storage_TableEntity
  766. {
  767. /**
  768. * @azure Name
  769. */
  770. public $FullName;
  771. }
  772. // Call Zend_Service_WindowsAzure_TableStorageTest::main() if this source file is executed directly.
  773. if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_TableStorageTest::main") {
  774. Zend_Service_WindowsAzure_TableStorageTest::main();
  775. }