TableStorageTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  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-2011 Zend Technologies USA Inc. (http://www.zend.com)
  20. * @license http://framework.zend.com/license/new-bsd New BSD License
  21. */
  22. /** Zend_Service_WindowsAzure_Storage_Table */
  23. require_once 'Zend/Service/WindowsAzure/Storage/Table.php';
  24. /**
  25. * @category Zend
  26. * @package Zend_Service_WindowsAzure
  27. * @subpackage UnitTests
  28. * @version $Id$
  29. * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
  30. * @license http://framework.zend.com/license/new-bsd New BSD License
  31. */
  32. class Zend_Service_WindowsAzure_TableStorageTest extends PHPUnit_Framework_TestCase
  33. {
  34. protected static $uniqId = 0;
  35. public function __construct()
  36. {
  37. }
  38. /**
  39. * Test setup
  40. */
  41. protected function setUp()
  42. {
  43. if (!TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  44. $this->markTestSkipped('This test case requires TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS to be enabled.');
  45. }
  46. }
  47. /**
  48. * Test teardown
  49. */
  50. protected function tearDown()
  51. {
  52. if ($this->status == PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED) {
  53. return;
  54. }
  55. $storageClient = $this->createStorageInstance();
  56. for ($i = 1; $i <= self::$uniqId; $i++)
  57. {
  58. try { $storageClient->deleteTable(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . $i); } catch (Exception $e) { }
  59. }
  60. }
  61. protected function createStorageInstance()
  62. {
  63. $storageClient = null;
  64. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNONPROD) {
  65. $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));
  66. } else {
  67. $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));
  68. }
  69. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) {
  70. $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);
  71. }
  72. return $storageClient;
  73. }
  74. protected function generateName()
  75. {
  76. self::$uniqId++;
  77. return TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . self::$uniqId;
  78. }
  79. /**
  80. * Test create table
  81. */
  82. public function testCreateTable()
  83. {
  84. $tableName = $this->generateName();
  85. $storageClient = $this->createStorageInstance();
  86. $result = $storageClient->createTable($tableName);
  87. $this->assertEquals($tableName, $result->Name);
  88. $result = $storageClient->listTables();
  89. $this->assertEquals(1, count($result));
  90. $this->assertEquals($tableName, $result[0]->Name);
  91. }
  92. /**
  93. * Test table exists
  94. */
  95. public function testTableExists()
  96. {
  97. $tableName1 = $this->generateName();
  98. $tableName2 = $this->generateName();
  99. $storageClient = $this->createStorageInstance();
  100. $storageClient->createTable($tableName1);
  101. $storageClient->createTable($tableName2);
  102. $result = $storageClient->tableExists($tableName2);
  103. $this->assertTrue($result);
  104. $result = $storageClient->tableExists(md5(time()));
  105. $this->assertFalse($result);
  106. }
  107. /**
  108. * Test list tables
  109. */
  110. public function testListTables()
  111. {
  112. $tableName1 = $this->generateName();
  113. $tableName2 = $this->generateName();
  114. $storageClient = $this->createStorageInstance();
  115. $storageClient->createTable($tableName1);
  116. $storageClient->createTable($tableName2);
  117. $result = $storageClient->listTables();
  118. $this->assertEquals(2, count($result));
  119. $this->assertEquals($tableName1, $result[0]->Name);
  120. $this->assertEquals($tableName2, $result[1]->Name);
  121. }
  122. /**
  123. * Test delete table
  124. */
  125. public function testDeleteTable()
  126. {
  127. $tableName = $this->generateName();
  128. $storageClient = $this->createStorageInstance();
  129. $storageClient->createTable($tableName);
  130. $storageClient->deleteTable($tableName);
  131. $result = $storageClient->listTables();
  132. $this->assertEquals(0, count($result));
  133. }
  134. /**
  135. * Test insert entity
  136. */
  137. public function testInsertEntity()
  138. {
  139. $tableName = $this->generateName();
  140. $storageClient = $this->createStorageInstance();
  141. $storageClient->createTable($tableName);
  142. $entities = $this->_generateEntities(1);
  143. $entity = $entities[0];
  144. $result = $storageClient->insertEntity($tableName, $entity);
  145. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  146. $this->assertNotEquals('', $result->getEtag());
  147. $this->assertEquals($entity, $result);
  148. }
  149. /**
  150. * Test insert entity, with XML in content. This should not break the XML sent to Windows Azure.
  151. */
  152. public function testInsertEntity_Security_HtmlSpecialChars()
  153. {
  154. $tableName = $this->generateName();
  155. $storageClient = $this->createStorageInstance();
  156. $storageClient->createTable($tableName);
  157. $entities = $this->_generateEntities(1);
  158. $entity = $entities[0];
  159. $entity->FullName = 'XML <test>'; // this should work without breaking the XML
  160. $result = $storageClient->insertEntity($tableName, $entity);
  161. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  162. $this->assertNotEquals('', $result->getEtag());
  163. $this->assertEquals($entity, $result);
  164. }
  165. /**
  166. * Test delete entity, not taking etag into account
  167. */
  168. public function testDeleteEntity_NoEtag()
  169. {
  170. $tableName = $this->generateName();
  171. $storageClient = $this->createStorageInstance();
  172. $storageClient->createTable($tableName);
  173. $entities = $this->_generateEntities(1);
  174. $entity = $entities[0];
  175. $result = $storageClient->insertEntity($tableName, $entity);
  176. $this->assertEquals($entity, $result);
  177. $storageClient->deleteEntity($tableName, $entity);
  178. }
  179. /**
  180. * Test delete entity, taking etag into account
  181. */
  182. public function testDeleteEntity_Etag()
  183. {
  184. $tableName = $this->generateName();
  185. $storageClient = $this->createStorageInstance();
  186. $storageClient->createTable($tableName);
  187. $entities = $this->_generateEntities(1);
  188. $entity = $entities[0];
  189. $result = $storageClient->insertEntity($tableName, $entity);
  190. $this->assertEquals($entity, $result);
  191. // Set "old" etag
  192. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  193. $exceptionThrown = false;
  194. try {
  195. $storageClient->deleteEntity($tableName, $entity, true);
  196. } catch (Exception $ex) {
  197. $exceptionThrown = true;
  198. }
  199. $this->assertTrue($exceptionThrown);
  200. }
  201. /**
  202. * Test retrieve entity by id
  203. */
  204. public function testRetrieveEntityById()
  205. {
  206. $tableName = $this->generateName();
  207. $storageClient = $this->createStorageInstance();
  208. $storageClient->createTable($tableName);
  209. $entities = $this->_generateEntities(1);
  210. $entity = $entities[0];
  211. $storageClient->insertEntity($tableName, $entity);
  212. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity');
  213. $this->assertEquals($entity, $result);
  214. }
  215. /**
  216. * Test retrieve entity by id (> 256 key characters)
  217. */
  218. public function testRetrieveEntityById_Large()
  219. {
  220. $tableName = $this->generateName();
  221. $storageClient = $this->createStorageInstance();
  222. $storageClient->createTable($tableName);
  223. $entities = $this->_generateEntities(1);
  224. $entity = $entities[0];
  225. $entity->setPartitionKey(str_repeat('a', 200));
  226. $entity->setRowKey(str_repeat('a', 200));
  227. $storageClient->insertEntity($tableName, $entity);
  228. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity');
  229. $this->assertEquals($entity, $result);
  230. }
  231. /**
  232. * Test retrieve entity by id, DynamicTableEntity
  233. */
  234. public function testRetrieveEntityById_DynamicTableEntity()
  235. {
  236. $tableName = $this->generateName();
  237. $storageClient = $this->createStorageInstance();
  238. $storageClient->createTable($tableName);
  239. $entities = $this->_generateEntities(1);
  240. $entity = $entities[0];
  241. $storageClient->insertEntity($tableName, $entity);
  242. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey());
  243. $this->assertEquals($entity->FullName, $result->Name);
  244. $this->assertType('Zend_Service_WindowsAzure_Storage_DynamicTableEntity', $result);
  245. }
  246. /**
  247. * Test update entity, not taking etag into account
  248. */
  249. public function testUpdateEntity_NoEtag()
  250. {
  251. $tableName = $this->generateName();
  252. $storageClient = $this->createStorageInstance();
  253. $storageClient->createTable($tableName);
  254. $entities = $this->_generateEntities(1);
  255. $entity = $entities[0];
  256. $storageClient->insertEntity($tableName, $entity);
  257. $entity->Age = 0;
  258. $result = $storageClient->updateEntity($tableName, $entity);
  259. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  260. $this->assertNotEquals('', $result->getEtag());
  261. $this->assertEquals(0, $result->Age);
  262. $this->assertEquals($entity, $result);
  263. }
  264. /**
  265. * Test update entity, taking etag into account
  266. */
  267. public function testUpdateEntity_Etag()
  268. {
  269. $tableName = $this->generateName();
  270. $storageClient = $this->createStorageInstance();
  271. $storageClient->createTable($tableName);
  272. $entities = $this->_generateEntities(1);
  273. $entity = $entities[0];
  274. $storageClient->insertEntity($tableName, $entity);
  275. $entity->Age = 0;
  276. // Set "old" etag
  277. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  278. $exceptionThrown = false;
  279. try {
  280. $storageClient->updateEntity($tableName, $entity, true);
  281. } catch (Exception $ex) {
  282. $exceptionThrown = true;
  283. }
  284. $this->assertTrue($exceptionThrown);
  285. }
  286. /**
  287. * Test merge entity, not taking etag into account
  288. */
  289. public function testMergeEntity_NoEtag()
  290. {
  291. $tableName = $this->generateName();
  292. $storageClient = $this->createStorageInstance();
  293. $storageClient->createTable($tableName);
  294. $entities = $this->_generateEntities(1);
  295. $entity = $entities[0];
  296. $storageClient->insertEntity($tableName, $entity);
  297. $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey());
  298. $dynamicEntity->Myproperty = 10;
  299. $dynamicEntity->Otherproperty = "Test";
  300. $dynamicEntity->Age = 0;
  301. $storageClient->mergeEntity($tableName, $dynamicEntity, false, array('Myproperty', 'Otherproperty')); // only update 'Myproperty' and 'Otherproperty'
  302. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey());
  303. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  304. $this->assertNotEquals('', $result->getEtag());
  305. $this->assertNotEquals(0, $result->Age);
  306. $this->assertEquals($entity->FullName, $result->Name);
  307. $this->assertEquals($dynamicEntity->Myproperty, $result->Myproperty);
  308. $this->assertEquals($dynamicEntity->Otherproperty, $result->Otherproperty);
  309. }
  310. /**
  311. * Test merge entity, taking etag into account
  312. */
  313. public function testMergeEntity_Etag()
  314. {
  315. $tableName = $this->generateName();
  316. $storageClient = $this->createStorageInstance();
  317. $storageClient->createTable($tableName);
  318. $entities = $this->_generateEntities(1);
  319. $entity = $entities[0];
  320. $storageClient->insertEntity($tableName, $entity);
  321. $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey());
  322. $dynamicEntity->Myproperty = 10;
  323. $dynamicEntity->Otherproperty = "Test";
  324. $dynamicEntity->Age = 0;
  325. // Set "old" etag
  326. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  327. $exceptionThrown = false;
  328. try {
  329. $storageClient->mergeEntity($tableName, $dynamicEntity, true);
  330. } catch (Exception $ex) {
  331. $exceptionThrown = true;
  332. }
  333. $this->assertTrue($exceptionThrown);
  334. }
  335. /**
  336. * Test retrieve entities, all
  337. */
  338. public function testRetrieveEntities_All()
  339. {
  340. $tableName = $this->generateName();
  341. $storageClient = $this->createStorageInstance();
  342. $storageClient->createTable($tableName);
  343. $entities = $this->_generateEntities(20);
  344. foreach ($entities as $entity)
  345. {
  346. $storageClient->insertEntity($tableName, $entity);
  347. }
  348. $result = $storageClient->retrieveEntities($tableName, 'TSTest_TestEntity');
  349. $this->assertEquals(20, count($result));
  350. }
  351. /**
  352. * Test retrieve entities, all, DynamicTableEntity
  353. */
  354. public function testRetrieveEntities_All_DynamicTableEntity()
  355. {
  356. $tableName = $this->generateName();
  357. $storageClient = $this->createStorageInstance();
  358. $storageClient->createTable($tableName);
  359. $entities = $this->_generateEntities(20);
  360. foreach ($entities as $entity)
  361. {
  362. $storageClient->insertEntity($tableName, $entity);
  363. }
  364. $result = $storageClient->retrieveEntities($tableName);
  365. $this->assertEquals(20, count($result));
  366. foreach ($result as $item)
  367. {
  368. $this->assertType('Zend_Service_WindowsAzure_Storage_DynamicTableEntity', $item);
  369. }
  370. }
  371. /**
  372. * Test retrieve entities, filtered
  373. */
  374. public function testRetrieveEntities_Filtered()
  375. {
  376. $tableName = $this->generateName();
  377. $storageClient = $this->createStorageInstance();
  378. $storageClient->createTable($tableName);
  379. $entities = $this->_generateEntities(5);
  380. foreach ($entities as $entity)
  381. {
  382. $storageClient->insertEntity($tableName, $entity);
  383. }
  384. $result = $storageClient->retrieveEntities($tableName, 'PartitionKey eq \'' . $entities[0]->getPartitionKey() . '\' and RowKey eq \'' . $entities[0]->getRowKey() . '\'', 'TSTest_TestEntity');
  385. $this->assertEquals(1, count($result));
  386. }
  387. /**
  388. * Test retrieve entities, fluent interface
  389. */
  390. public function testRetrieveEntities_Fluent1()
  391. {
  392. $tableName = $this->generateName();
  393. $storageClient = $this->createStorageInstance();
  394. $storageClient->createTable($tableName);
  395. $entities = $this->_generateEntities(10);
  396. foreach ($entities as $entity)
  397. {
  398. $storageClient->insertEntity($tableName, $entity);
  399. }
  400. $result = $storageClient->retrieveEntities(
  401. $storageClient->select()
  402. ->from($tableName)
  403. ->where('Name eq ?', $entities[0]->FullName)
  404. ->andWhere('RowKey eq ?', $entities[0]->getRowKey()),
  405. 'TSTest_TestEntity'
  406. );
  407. $this->assertEquals(1, count($result));
  408. $this->assertEquals($entities[0], $result[0]);
  409. }
  410. /**
  411. * Test retrieve entities, fluent interface
  412. */
  413. public function testRetrieveEntities_Fluent2()
  414. {
  415. $tableName = $this->generateName();
  416. $storageClient = $this->createStorageInstance();
  417. $storageClient->createTable($tableName);
  418. $entities = $this->_generateEntities(10);
  419. foreach ($entities as $entity)
  420. {
  421. $storageClient->insertEntity($tableName, $entity);
  422. }
  423. $result = $storageClient->retrieveEntities(
  424. $storageClient->select()
  425. ->from($tableName)
  426. ->where('Name eq ?', $entities[0]->FullName)
  427. ->andWhere('PartitionKey eq ?', $entities[0]->getPartitionKey()),
  428. 'TSTest_TestEntity'
  429. );
  430. $this->assertEquals(1, count($result));
  431. $this->assertEquals($entities[0], $result[0]);
  432. }
  433. /**
  434. * Test retrieve entities, fluent interface, top specification
  435. */
  436. public function testRetrieveEntities_Fluent_Top()
  437. {
  438. $tableName = $this->generateName();
  439. $storageClient = $this->createStorageInstance();
  440. $storageClient->createTable($tableName);
  441. $entities = $this->_generateEntities(10);
  442. foreach ($entities as $entity)
  443. {
  444. $storageClient->insertEntity($tableName, $entity);
  445. }
  446. $result = $storageClient->retrieveEntities(
  447. $storageClient->select()->top(4)
  448. ->from($tableName),
  449. 'TSTest_TestEntity'
  450. );
  451. $this->assertEquals(4, count($result));
  452. }
  453. /**
  454. * Test batch commit, success
  455. */
  456. public function testBatchCommit_Success()
  457. {
  458. $tableName = $this->generateName();
  459. $storageClient = $this->createStorageInstance();
  460. $storageClient->createTable($tableName);
  461. $entities = $this->_generateEntities(20);
  462. $entities1 = array_slice($entities, 0, 10);
  463. $entities2 = array_slice($entities, 10, 10);
  464. // Insert entities
  465. foreach ($entities1 as $entity)
  466. {
  467. $storageClient->insertEntity($tableName, $entity);
  468. }
  469. // Start batch
  470. $batch = $storageClient->startBatch();
  471. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  472. // Insert entities in batch
  473. foreach ($entities2 as $entity)
  474. {
  475. $storageClient->insertEntity($tableName, $entity);
  476. }
  477. // Delete entities
  478. foreach ($entities1 as $entity)
  479. {
  480. $storageClient->deleteEntity($tableName, $entity);
  481. }
  482. // Commit
  483. $batch->commit();
  484. // Verify
  485. $result = $storageClient->retrieveEntities($tableName);
  486. $this->assertEquals(10, count($result));
  487. }
  488. /**
  489. * Test batch rollback, success
  490. */
  491. public function testBatchRollback_Success()
  492. {
  493. $tableName = $this->generateName();
  494. $storageClient = $this->createStorageInstance();
  495. $storageClient->createTable($tableName);
  496. $entities = $this->_generateEntities(10);
  497. // Start batch
  498. $batch = $storageClient->startBatch();
  499. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  500. // Insert entities in batch
  501. foreach ($entities as $entity)
  502. {
  503. $storageClient->insertEntity($tableName, $entity);
  504. }
  505. // Rollback
  506. $batch->rollback();
  507. // Verify
  508. $result = $storageClient->retrieveEntities($tableName);
  509. $this->assertEquals(0, count($result));
  510. }
  511. /**
  512. * Test batch commit, fail updates
  513. */
  514. public function testBatchCommit_FailUpdates()
  515. {
  516. $tableName = $this->generateName();
  517. $storageClient = $this->createStorageInstance();
  518. $storageClient->createTable($tableName);
  519. $entities = $this->_generateEntities(10);
  520. foreach ($entities as $entity)
  521. {
  522. $storageClient->insertEntity($tableName, $entity);
  523. }
  524. // Make some entity updates with "old" etags
  525. $entities[0]->Age = 0;
  526. $entities[0]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  527. $entities[1]->Age = 0;
  528. $entities[1]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  529. $entities[2]->Age = 0;
  530. // Start batch
  531. $batch = $storageClient->startBatch();
  532. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  533. // Update entities in batch
  534. $storageClient->updateEntity($tableName, $entities[0], true);
  535. $storageClient->updateEntity($tableName, $entities[1], true);
  536. $storageClient->updateEntity($tableName, $entities[2], true);
  537. // Commit
  538. $exceptionThrown = false;
  539. try {
  540. $batch->commit();
  541. } catch (Exception $ex) {
  542. $exceptionThrown = true;
  543. }
  544. $this->assertTrue($exceptionThrown);
  545. }
  546. /**
  547. * Test batch commit, fail partition
  548. */
  549. public function testBatchCommit_FailPartition()
  550. {
  551. $tableName = $this->generateName();
  552. $storageClient = $this->createStorageInstance();
  553. $storageClient->createTable($tableName);
  554. $entities = $this->_generateEntities(10);
  555. // Start batch
  556. $batch = $storageClient->startBatch();
  557. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  558. // Insert entities in batch
  559. foreach ($entities as $entity)
  560. {
  561. $entity->setPartitionKey('partition' . rand(1, 9));
  562. $storageClient->insertEntity($tableName, $entity);
  563. }
  564. // Commit
  565. $exceptionThrown = false;
  566. try {
  567. $batch->commit();
  568. } catch (Exception $ex) {
  569. $exceptionThrown = true;
  570. }
  571. $this->assertTrue($exceptionThrown);
  572. // Verify
  573. $result = $storageClient->retrieveEntities($tableName);
  574. $this->assertEquals(0, count($result));
  575. }
  576. /**
  577. * Generate entities
  578. *
  579. * @param int $amount Number of entities to generate
  580. * @return array Array of TSTest_TestEntity
  581. */
  582. protected function _generateEntities($amount = 1)
  583. {
  584. $returnValue = array();
  585. for ($i = 0; $i < $amount; $i++)
  586. {
  587. $entity = new TSTest_TestEntity('partition1', 'row' . ($i + 1));
  588. $entity->FullName = md5(uniqid(rand(), true));
  589. $entity->Age = rand(1, 130);
  590. $entity->Visible = rand(1,2) == 1;
  591. $returnValue[] = $entity;
  592. }
  593. return $returnValue;
  594. }
  595. }
  596. /**
  597. * Test Zend_Service_WindowsAzure_Storage_TableEntity class
  598. */
  599. class TSTest_TestEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
  600. {
  601. /**
  602. * @azure Name
  603. */
  604. public $FullName;
  605. /**
  606. * @azure Age Edm.Int64
  607. */
  608. public $Age;
  609. /**
  610. * @azure Visible Edm.Boolean
  611. */
  612. public $Visible = false;
  613. }