TableStorageTest.php 27 KB

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