TableStorageTest.php 32 KB

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