TableStorageTest.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  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-2010 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$
  38. * @copyright Copyright (c) 2005-2010 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 insert entity, with XML in content. This should not break the XML sent to Windows Azure.
  171. */
  172. public function testInsertEntity_Security_HtmlSpecialChars()
  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. $entity->FullName = 'XML <test>'; // this should work without breaking the XML
  181. $result = $storageClient->insertEntity($tableName, $entity);
  182. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  183. $this->assertNotEquals('', $result->getEtag());
  184. $this->assertEquals($entity, $result);
  185. }
  186. }
  187. /**
  188. * Test delete entity, not taking etag into account
  189. */
  190. public function testDeleteEntity_NoEtag()
  191. {
  192. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  193. $tableName = $this->generateName();
  194. $storageClient = $this->createStorageInstance();
  195. $storageClient->createTable($tableName);
  196. $entities = $this->_generateEntities(1);
  197. $entity = $entities[0];
  198. $result = $storageClient->insertEntity($tableName, $entity);
  199. $this->assertEquals($entity, $result);
  200. $storageClient->deleteEntity($tableName, $entity);
  201. }
  202. }
  203. /**
  204. * Test delete entity, taking etag into account
  205. */
  206. public function testDeleteEntity_Etag()
  207. {
  208. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  209. $tableName = $this->generateName();
  210. $storageClient = $this->createStorageInstance();
  211. $storageClient->createTable($tableName);
  212. $entities = $this->_generateEntities(1);
  213. $entity = $entities[0];
  214. $result = $storageClient->insertEntity($tableName, $entity);
  215. $this->assertEquals($entity, $result);
  216. // Set "old" etag
  217. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  218. $exceptionThrown = false;
  219. try {
  220. $storageClient->deleteEntity($tableName, $entity, true);
  221. } catch (Exception $ex) {
  222. $exceptionThrown = true;
  223. }
  224. $this->assertTrue($exceptionThrown);
  225. }
  226. }
  227. /**
  228. * Test retrieve entity by id
  229. */
  230. public function testRetrieveEntityById()
  231. {
  232. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  233. $tableName = $this->generateName();
  234. $storageClient = $this->createStorageInstance();
  235. $storageClient->createTable($tableName);
  236. $entities = $this->_generateEntities(1);
  237. $entity = $entities[0];
  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 (> 256 key characters)
  245. */
  246. public function testRetrieveEntityById_Large()
  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. $entity->setPartitionKey(str_repeat('a', 200));
  255. $entity->setRowKey(str_repeat('a', 200));
  256. $storageClient->insertEntity($tableName, $entity);
  257. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity');
  258. $this->assertEquals($entity, $result);
  259. }
  260. }
  261. /**
  262. * Test retrieve entity by id, DynamicTableEntity
  263. */
  264. public function testRetrieveEntityById_DynamicTableEntity()
  265. {
  266. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  267. $tableName = $this->generateName();
  268. $storageClient = $this->createStorageInstance();
  269. $storageClient->createTable($tableName);
  270. $entities = $this->_generateEntities(1);
  271. $entity = $entities[0];
  272. $storageClient->insertEntity($tableName, $entity);
  273. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey());
  274. $this->assertEquals($entity->FullName, $result->Name);
  275. $this->assertType('Zend_Service_WindowsAzure_Storage_DynamicTableEntity', $result);
  276. }
  277. }
  278. /**
  279. * Test update entity, not taking etag into account
  280. */
  281. public function testUpdateEntity_NoEtag()
  282. {
  283. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  284. $tableName = $this->generateName();
  285. $storageClient = $this->createStorageInstance();
  286. $storageClient->createTable($tableName);
  287. $entities = $this->_generateEntities(1);
  288. $entity = $entities[0];
  289. $storageClient->insertEntity($tableName, $entity);
  290. $entity->Age = 0;
  291. $result = $storageClient->updateEntity($tableName, $entity);
  292. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  293. $this->assertNotEquals('', $result->getEtag());
  294. $this->assertEquals(0, $result->Age);
  295. $this->assertEquals($entity, $result);
  296. }
  297. }
  298. /**
  299. * Test update entity, taking etag into account
  300. */
  301. public function testUpdateEntity_Etag()
  302. {
  303. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  304. $tableName = $this->generateName();
  305. $storageClient = $this->createStorageInstance();
  306. $storageClient->createTable($tableName);
  307. $entities = $this->_generateEntities(1);
  308. $entity = $entities[0];
  309. $storageClient->insertEntity($tableName, $entity);
  310. $entity->Age = 0;
  311. // Set "old" etag
  312. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  313. $exceptionThrown = false;
  314. try {
  315. $storageClient->updateEntity($tableName, $entity, true);
  316. } catch (Exception $ex) {
  317. $exceptionThrown = true;
  318. }
  319. $this->assertTrue($exceptionThrown);
  320. }
  321. }
  322. /**
  323. * Test merge entity, not taking etag into account
  324. */
  325. public function testMergeEntity_NoEtag()
  326. {
  327. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  328. $tableName = $this->generateName();
  329. $storageClient = $this->createStorageInstance();
  330. $storageClient->createTable($tableName);
  331. $entities = $this->_generateEntities(1);
  332. $entity = $entities[0];
  333. $storageClient->insertEntity($tableName, $entity);
  334. $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey());
  335. $dynamicEntity->Myproperty = 10;
  336. $dynamicEntity->Otherproperty = "Test";
  337. $dynamicEntity->Age = 0;
  338. $storageClient->mergeEntity($tableName, $dynamicEntity, false, array('Myproperty', 'Otherproperty')); // only update 'Myproperty' and 'Otherproperty'
  339. $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey());
  340. $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp());
  341. $this->assertNotEquals('', $result->getEtag());
  342. $this->assertNotEquals(0, $result->Age);
  343. $this->assertEquals($entity->FullName, $result->Name);
  344. $this->assertEquals($dynamicEntity->Myproperty, $result->Myproperty);
  345. $this->assertEquals($dynamicEntity->Otherproperty, $result->Otherproperty);
  346. }
  347. }
  348. /**
  349. * Test merge entity, taking etag into account
  350. */
  351. public function testMergeEntity_Etag()
  352. {
  353. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  354. $tableName = $this->generateName();
  355. $storageClient = $this->createStorageInstance();
  356. $storageClient->createTable($tableName);
  357. $entities = $this->_generateEntities(1);
  358. $entity = $entities[0];
  359. $storageClient->insertEntity($tableName, $entity);
  360. $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey());
  361. $dynamicEntity->Myproperty = 10;
  362. $dynamicEntity->Otherproperty = "Test";
  363. $dynamicEntity->Age = 0;
  364. // Set "old" etag
  365. $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  366. $exceptionThrown = false;
  367. try {
  368. $storageClient->mergeEntity($tableName, $dynamicEntity, true);
  369. } catch (Exception $ex) {
  370. $exceptionThrown = true;
  371. }
  372. $this->assertTrue($exceptionThrown);
  373. }
  374. }
  375. /**
  376. * Test retrieve entities, all
  377. */
  378. public function testRetrieveEntities_All()
  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, 'TSTest_TestEntity');
  390. $this->assertEquals(20, count($result));
  391. }
  392. }
  393. /**
  394. * Test retrieve entities, all, DynamicTableEntity
  395. */
  396. public function testRetrieveEntities_All_DynamicTableEntity()
  397. {
  398. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  399. $tableName = $this->generateName();
  400. $storageClient = $this->createStorageInstance();
  401. $storageClient->createTable($tableName);
  402. $entities = $this->_generateEntities(20);
  403. foreach ($entities as $entity)
  404. {
  405. $storageClient->insertEntity($tableName, $entity);
  406. }
  407. $result = $storageClient->retrieveEntities($tableName);
  408. $this->assertEquals(20, count($result));
  409. foreach ($result as $item)
  410. {
  411. $this->assertType('Zend_Service_WindowsAzure_Storage_DynamicTableEntity', $item);
  412. }
  413. }
  414. }
  415. /**
  416. * Test retrieve entities, filtered
  417. */
  418. public function testRetrieveEntities_Filtered()
  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(5);
  425. foreach ($entities as $entity)
  426. {
  427. $storageClient->insertEntity($tableName, $entity);
  428. }
  429. $result = $storageClient->retrieveEntities($tableName, 'PartitionKey eq \'' . $entities[0]->getPartitionKey() . '\' and RowKey eq \'' . $entities[0]->getRowKey() . '\'', 'TSTest_TestEntity');
  430. $this->assertEquals(1, count($result));
  431. }
  432. }
  433. /**
  434. * Test retrieve entities, fluent interface
  435. */
  436. public function testRetrieveEntities_Fluent1()
  437. {
  438. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  439. $tableName = $this->generateName();
  440. $storageClient = $this->createStorageInstance();
  441. $storageClient->createTable($tableName);
  442. $entities = $this->_generateEntities(10);
  443. foreach ($entities as $entity)
  444. {
  445. $storageClient->insertEntity($tableName, $entity);
  446. }
  447. $result = $storageClient->retrieveEntities(
  448. $storageClient->select()
  449. ->from($tableName)
  450. ->where('Name eq ?', $entities[0]->FullName)
  451. ->andWhere('RowKey eq ?', $entities[0]->getRowKey()),
  452. 'TSTest_TestEntity'
  453. );
  454. $this->assertEquals(1, count($result));
  455. $this->assertEquals($entities[0], $result[0]);
  456. }
  457. }
  458. /**
  459. * Test retrieve entities, fluent interface
  460. */
  461. public function testRetrieveEntities_Fluent2()
  462. {
  463. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  464. $tableName = $this->generateName();
  465. $storageClient = $this->createStorageInstance();
  466. $storageClient->createTable($tableName);
  467. $entities = $this->_generateEntities(10);
  468. foreach ($entities as $entity)
  469. {
  470. $storageClient->insertEntity($tableName, $entity);
  471. }
  472. $result = $storageClient->retrieveEntities(
  473. $storageClient->select()
  474. ->from($tableName)
  475. ->where('Name eq ?', $entities[0]->FullName)
  476. ->andWhere('PartitionKey eq ?', $entities[0]->getPartitionKey()),
  477. 'TSTest_TestEntity'
  478. );
  479. $this->assertEquals(1, count($result));
  480. $this->assertEquals($entities[0], $result[0]);
  481. }
  482. }
  483. /**
  484. * Test retrieve entities, fluent interface, top specification
  485. */
  486. public function testRetrieveEntities_Fluent_Top()
  487. {
  488. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  489. $tableName = $this->generateName();
  490. $storageClient = $this->createStorageInstance();
  491. $storageClient->createTable($tableName);
  492. $entities = $this->_generateEntities(10);
  493. foreach ($entities as $entity)
  494. {
  495. $storageClient->insertEntity($tableName, $entity);
  496. }
  497. $result = $storageClient->retrieveEntities(
  498. $storageClient->select()->top(4)
  499. ->from($tableName),
  500. 'TSTest_TestEntity'
  501. );
  502. $this->assertEquals(4, count($result));
  503. }
  504. }
  505. /**
  506. * Test batch commit, success
  507. */
  508. public function testBatchCommit_Success()
  509. {
  510. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  511. $tableName = $this->generateName();
  512. $storageClient = $this->createStorageInstance();
  513. $storageClient->createTable($tableName);
  514. $entities = $this->_generateEntities(20);
  515. $entities1 = array_slice($entities, 0, 10);
  516. $entities2 = array_slice($entities, 10, 10);
  517. // Insert entities
  518. foreach ($entities1 as $entity)
  519. {
  520. $storageClient->insertEntity($tableName, $entity);
  521. }
  522. // Start batch
  523. $batch = $storageClient->startBatch();
  524. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  525. // Insert entities in batch
  526. foreach ($entities2 as $entity)
  527. {
  528. $storageClient->insertEntity($tableName, $entity);
  529. }
  530. // Delete entities
  531. foreach ($entities1 as $entity)
  532. {
  533. $storageClient->deleteEntity($tableName, $entity);
  534. }
  535. // Commit
  536. $batch->commit();
  537. // Verify
  538. $result = $storageClient->retrieveEntities($tableName);
  539. $this->assertEquals(10, count($result));
  540. }
  541. }
  542. /**
  543. * Test batch rollback, success
  544. */
  545. public function testBatchRollback_Success()
  546. {
  547. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  548. $tableName = $this->generateName();
  549. $storageClient = $this->createStorageInstance();
  550. $storageClient->createTable($tableName);
  551. $entities = $this->_generateEntities(10);
  552. // Start batch
  553. $batch = $storageClient->startBatch();
  554. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  555. // Insert entities in batch
  556. foreach ($entities as $entity)
  557. {
  558. $storageClient->insertEntity($tableName, $entity);
  559. }
  560. // Rollback
  561. $batch->rollback();
  562. // Verify
  563. $result = $storageClient->retrieveEntities($tableName);
  564. $this->assertEquals(0, count($result));
  565. }
  566. }
  567. /**
  568. * Test batch commit, fail updates
  569. */
  570. public function testBatchCommit_FailUpdates()
  571. {
  572. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  573. $tableName = $this->generateName();
  574. $storageClient = $this->createStorageInstance();
  575. $storageClient->createTable($tableName);
  576. $entities = $this->_generateEntities(10);
  577. foreach ($entities as $entity)
  578. {
  579. $storageClient->insertEntity($tableName, $entity);
  580. }
  581. // Make some entity updates with "old" etags
  582. $entities[0]->Age = 0;
  583. $entities[0]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  584. $entities[1]->Age = 0;
  585. $entities[1]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"');
  586. $entities[2]->Age = 0;
  587. // Start batch
  588. $batch = $storageClient->startBatch();
  589. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  590. // Update entities in batch
  591. $storageClient->updateEntity($tableName, $entities[0], true);
  592. $storageClient->updateEntity($tableName, $entities[1], true);
  593. $storageClient->updateEntity($tableName, $entities[2], true);
  594. // Commit
  595. $exceptionThrown = false;
  596. try {
  597. $batch->commit();
  598. } catch (Exception $ex) {
  599. $exceptionThrown = true;
  600. }
  601. $this->assertTrue($exceptionThrown);
  602. }
  603. }
  604. /**
  605. * Test batch commit, fail partition
  606. */
  607. public function testBatchCommit_FailPartition()
  608. {
  609. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) {
  610. $tableName = $this->generateName();
  611. $storageClient = $this->createStorageInstance();
  612. $storageClient->createTable($tableName);
  613. $entities = $this->_generateEntities(10);
  614. // Start batch
  615. $batch = $storageClient->startBatch();
  616. $this->assertType('Zend_Service_WindowsAzure_Storage_Batch', $batch);
  617. // Insert entities in batch
  618. foreach ($entities as $entity)
  619. {
  620. $entity->setPartitionKey('partition' . rand(1, 9));
  621. $storageClient->insertEntity($tableName, $entity);
  622. }
  623. // Commit
  624. $exceptionThrown = false;
  625. try {
  626. $batch->commit();
  627. } catch (Exception $ex) {
  628. $exceptionThrown = true;
  629. }
  630. $this->assertTrue($exceptionThrown);
  631. // Verify
  632. $result = $storageClient->retrieveEntities($tableName);
  633. $this->assertEquals(0, count($result));
  634. }
  635. }
  636. /**
  637. * Generate entities
  638. *
  639. * @param int $amount Number of entities to generate
  640. * @return array Array of TSTest_TestEntity
  641. */
  642. protected function _generateEntities($amount = 1)
  643. {
  644. $returnValue = array();
  645. for ($i = 0; $i < $amount; $i++)
  646. {
  647. $entity = new TSTest_TestEntity('partition1', 'row' . ($i + 1));
  648. $entity->FullName = md5(uniqid(rand(), true));
  649. $entity->Age = rand(1, 130);
  650. $entity->Visible = rand(1,2) == 1;
  651. $returnValue[] = $entity;
  652. }
  653. return $returnValue;
  654. }
  655. }
  656. /**
  657. * Test Zend_Service_WindowsAzure_Storage_TableEntity class
  658. */
  659. class TSTest_TestEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
  660. {
  661. /**
  662. * @azure Name
  663. */
  664. public $FullName;
  665. /**
  666. * @azure Age Edm.Int64
  667. */
  668. public $Age;
  669. /**
  670. * @azure Visible Edm.Boolean
  671. */
  672. public $Visible = false;
  673. }
  674. // Call Zend_Service_WindowsAzure_TableStorageTest::main() if this source file is executed directly.
  675. if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_TableStorageTest::main") {
  676. Zend_Service_WindowsAzure_TableStorageTest::main();
  677. }