BlobStorageTest.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  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_BlobStorageTest::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_Blob */
  32. require_once 'Zend/Service/WindowsAzure/Storage/Blob.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_BlobStorageTest extends PHPUnit_Framework_TestCase
  42. {
  43. static $path;
  44. public function __construct()
  45. {
  46. self::$path = dirname(__FILE__).'/_files/';
  47. }
  48. public static function main()
  49. {
  50. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  51. $suite = new PHPUnit_Framework_TestSuite("Zend_Service_WindowsAzure_BlobStorageTest");
  52. $result = PHPUnit_TextUI_TestRunner::run($suite);
  53. }
  54. }
  55. /**
  56. * Test setup
  57. */
  58. protected function setUp()
  59. {
  60. }
  61. /**
  62. * Test teardown
  63. */
  64. protected function tearDown()
  65. {
  66. $storageClient = $this->createStorageInstance();
  67. for ($i = 1; $i <= self::$uniqId; $i++)
  68. {
  69. try { $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_CONTAINER_PREFIX . $i); } catch (Exception $e) { }
  70. }
  71. try { $storageClient->deleteContainer('$root'); } catch (Exception $e) { }
  72. }
  73. protected function createStorageInstance()
  74. {
  75. $storageClient = null;
  76. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNONPROD)
  77. {
  78. $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_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));
  79. } else {
  80. $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_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));
  81. }
  82. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) {
  83. $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);
  84. }
  85. return $storageClient;
  86. }
  87. protected static $uniqId = 0;
  88. protected function generateName()
  89. {
  90. self::$uniqId++;
  91. return TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_CONTAINER_PREFIX . self::$uniqId;
  92. }
  93. /**
  94. * Test container exists
  95. */
  96. public function testContainerExists()
  97. {
  98. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  99. $containerName1 = $this->generateName();
  100. $containerName2 = $this->generateName();
  101. $storageClient = $this->createStorageInstance();
  102. $storageClient->createContainer($containerName1);
  103. $storageClient->createContainer($containerName2);
  104. $result = $storageClient->containerExists($containerName1);
  105. $this->assertTrue($result);
  106. $result = $storageClient->containerExists(md5(time()));
  107. $this->assertFalse($result);
  108. }
  109. }
  110. /**
  111. * Test blob exists
  112. */
  113. public function testBlobExists()
  114. {
  115. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  116. $containerName = $this->generateName();
  117. $storageClient = $this->createStorageInstance();
  118. $storageClient->createContainer($containerName);
  119. $storageClient->putBlob($containerName, 'WindowsAzure1.gif', self::$path . 'WindowsAzure.gif');
  120. $storageClient->putBlob($containerName, 'WindowsAzure2.gif', self::$path . 'WindowsAzure.gif');
  121. $result = $storageClient->blobExists($containerName, 'WindowsAzure1.gif');
  122. $this->assertTrue($result);
  123. $result = $storageClient->blobExists($containerName, md5(time()));
  124. $this->assertFalse($result);
  125. }
  126. }
  127. /**
  128. * Test create container
  129. */
  130. public function testCreateContainer()
  131. {
  132. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  133. $containerName = $this->generateName();
  134. $storageClient = $this->createStorageInstance();
  135. $result = $storageClient->createContainer($containerName);
  136. $this->assertEquals($containerName, $result->Name);
  137. }
  138. }
  139. /**
  140. * Test get container acl
  141. */
  142. public function testGetContainerAcl()
  143. {
  144. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  145. $containerName = $this->generateName();
  146. $storageClient = $this->createStorageInstance();
  147. $storageClient->createContainer($containerName);
  148. $acl = $storageClient->getContainerAcl($containerName);
  149. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE, $acl);
  150. }
  151. }
  152. /**
  153. * Test set container acl
  154. */
  155. public function testSetContainerAcl()
  156. {
  157. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  158. $containerName = $this->generateName();
  159. $storageClient = $this->createStorageInstance();
  160. $storageClient->createContainer($containerName);
  161. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_BLOB);
  162. $acl = $storageClient->getContainerAcl($containerName);
  163. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_BLOB, $acl);
  164. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER);
  165. $acl = $storageClient->getContainerAcl($containerName);
  166. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER, $acl);
  167. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE);
  168. $acl = $storageClient->getContainerAcl($containerName);
  169. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE, $acl);
  170. }
  171. }
  172. /**
  173. * Test set container acl advanced
  174. */
  175. public function testSetContainerAclAdvanced()
  176. {
  177. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  178. $containerName = $this->generateName();
  179. $storageClient = $this->createStorageInstance();
  180. $storageClient->createContainer($containerName);
  181. $storageClient->setContainerAcl(
  182. $containerName,
  183. Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE,
  184. array(
  185. new Zend_Service_WindowsAzure_Storage_SignedIdentifier('ABCDEF', '2009-10-10', '2009-10-11', 'r')
  186. )
  187. );
  188. $acl = $storageClient->getContainerAcl($containerName, true);
  189. $this->assertEquals(1, count($acl));
  190. }
  191. }
  192. /**
  193. * Test set container metadata
  194. */
  195. public function testSetContainerMetadata()
  196. {
  197. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  198. $containerName = $this->generateName();
  199. $storageClient = $this->createStorageInstance();
  200. $storageClient->createContainer($containerName);
  201. $storageClient->setContainerMetadata($containerName, array(
  202. 'createdby' => 'PHPAzure',
  203. ));
  204. $metadata = $storageClient->getContainerMetadata($containerName);
  205. $this->assertEquals('PHPAzure', $metadata['createdby']);
  206. }
  207. }
  208. /**
  209. * Test list containers
  210. */
  211. public function testListContainers()
  212. {
  213. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  214. $containerName1 = 'testlist1';
  215. $containerName2 = 'testlist2';
  216. $containerName3 = 'testlist3';
  217. $storageClient = $this->createStorageInstance();
  218. $storageClient->createContainer($containerName1);
  219. $storageClient->createContainer($containerName2);
  220. $storageClient->createContainer($containerName3);
  221. $result1 = $storageClient->listContainers('testlist');
  222. $result2 = $storageClient->listContainers('testlist', 1);
  223. // cleanup first
  224. $storageClient->deleteContainer($containerName1);
  225. $storageClient->deleteContainer($containerName2);
  226. $storageClient->deleteContainer($containerName3);
  227. $this->assertEquals(3, count($result1));
  228. $this->assertEquals($containerName2, $result1[1]->Name);
  229. $this->assertEquals(1, count($result2));
  230. }
  231. }
  232. /**
  233. * Test list containers with metadata
  234. */
  235. public function testListContainersWithMetadata()
  236. {
  237. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  238. $containerName = $this->generateName();
  239. $storageClient = $this->createStorageInstance();
  240. $storageClient->createContainer($containerName, array(
  241. 'createdby' => 'PHPAzure',
  242. 'ownedby' => 'PHPAzure',
  243. ));
  244. $result = $storageClient->listContainers($containerName, null, null, 'metadata');
  245. $this->assertEquals('PHPAzure', $result[0]->Metadata['createdby']);
  246. $this->assertEquals('PHPAzure', $result[0]->Metadata['ownedby']);
  247. }
  248. }
  249. /**
  250. * Test put blob
  251. */
  252. public function testPutBlob()
  253. {
  254. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  255. $containerName = $this->generateName();
  256. $storageClient = $this->createStorageInstance();
  257. $storageClient->createContainer($containerName);
  258. $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  259. $this->assertEquals($containerName, $result->Container);
  260. $this->assertEquals('images/WindowsAzure.gif', $result->Name);
  261. }
  262. }
  263. /**
  264. * Test put blob data
  265. */
  266. public function testPutBlobData()
  267. {
  268. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  269. $containerName = $this->generateName();
  270. $storageClient = $this->createStorageInstance();
  271. $storageClient->createContainer($containerName);
  272. $result = $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!');
  273. $this->assertEquals($containerName, $result->Container);
  274. $this->assertEquals('test.txt', $result->Name);
  275. }
  276. }
  277. /**
  278. * Test put large blob
  279. */
  280. public function testPutLargeBlob()
  281. {
  282. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS && TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNLARGEBLOB) {
  283. // Create a file > Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE
  284. $fileName = $this->_createLargeFile();
  285. // Execute test
  286. $containerName = $this->generateName();
  287. $storageClient = $this->createStorageInstance();
  288. $storageClient->createContainer($containerName);
  289. $result = $storageClient->putLargeBlob($containerName, 'LargeFile.txt', $fileName);
  290. $this->assertEquals($containerName, $result->Container);
  291. $this->assertEquals('LargeFile.txt', $result->Name);
  292. // Get block list
  293. $blockList = $storageClient->getBlockList($containerName, 'LargeFile.txt');
  294. $this->assertTrue(count($blockList['CommittedBlocks']) > 0);
  295. // Remove file
  296. unlink($fileName);
  297. }
  298. }
  299. /**
  300. * Test get blob
  301. */
  302. public function testGetBlob()
  303. {
  304. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  305. $containerName = $this->generateName();
  306. $storageClient = $this->createStorageInstance();
  307. $storageClient->createContainer($containerName);
  308. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  309. $fileName = tempnam('', 'tst');
  310. $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', $fileName);
  311. $this->assertTrue(file_exists($fileName));
  312. $this->assertEquals(
  313. file_get_contents(self::$path . 'WindowsAzure.gif'),
  314. file_get_contents($fileName)
  315. );
  316. // Remove file
  317. unlink($fileName);
  318. }
  319. }
  320. /**
  321. * Test get blob data
  322. */
  323. public function testGetBlobData()
  324. {
  325. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  326. $containerName = $this->generateName();
  327. $storageClient = $this->createStorageInstance();
  328. $storageClient->createContainer($containerName);
  329. $result = $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!');
  330. $data = $storageClient->getBlobData($containerName, 'test.txt');
  331. $this->assertEquals(
  332. 'Hello World!',
  333. $data
  334. );
  335. }
  336. }
  337. /**
  338. * Test snapshot blob
  339. */
  340. public function testSnapshotBlob()
  341. {
  342. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  343. $containerName = $this->generateName();
  344. $storageClient = $this->createStorageInstance();
  345. $storageClient->createContainer($containerName);
  346. $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  347. $this->assertEquals($containerName, $result->Container);
  348. $this->assertEquals('images/WindowsAzure.gif', $result->Name);
  349. $snapshotId = $storageClient->snapshotBlob($containerName, 'images/WindowsAzure.gif');
  350. $fileName = tempnam('', 'tst');
  351. $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', $fileName, $snapshotId);
  352. $this->assertTrue(file_exists($fileName));
  353. $this->assertEquals(
  354. file_get_contents(self::$path . 'WindowsAzure.gif'),
  355. file_get_contents($fileName)
  356. );
  357. // Remove file
  358. unlink($fileName);
  359. }
  360. }
  361. /**
  362. * Test lease blob
  363. */
  364. public function testLeaseBlob()
  365. {
  366. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  367. $containerName = $this->generateName();
  368. $storageClient = $this->createStorageInstance();
  369. $storageClient->createContainer($containerName);
  370. $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!');
  371. // Acquire a lease
  372. $lease = $storageClient->leaseBlob($containerName, 'test.txt', Zend_Service_WindowsAzure_Storage_Blob::LEASE_ACQUIRE);
  373. $this->assertNotEquals('', $lease->LeaseId);
  374. // Second lease should not be possible
  375. $exceptionThrown = false;
  376. try {
  377. $storageClient->leaseBlob($containerName, 'test.txt', Zend_Service_WindowsAzure_Storage_Blob::LEASE_ACQUIRE);
  378. } catch (Exception $e) {
  379. $exceptionThrown = true;
  380. }
  381. $this->assertTrue($exceptionThrown);
  382. // Delete should not be possible
  383. $exceptionThrown = false;
  384. try {
  385. $storageClient->deleteBlob($containerName, 'test.txt');
  386. } catch (Exception $e) {
  387. $exceptionThrown = true;
  388. }
  389. $this->markTestIncomplete('Test inconclusive. Verify http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/9ae25614-b1da-43ab-abca-644abc034eb3 for info.');
  390. $this->assertTrue($exceptionThrown);
  391. // But should work when a lease id is supplied
  392. $exceptionThrown = false;
  393. try {
  394. $storageClient->putBlobData($containerName, 'test.txt', 'Hello!');
  395. } catch (Exception $e) {
  396. $exceptionThrown = true;
  397. }
  398. $this->assertFalse($exceptionThrown);
  399. }
  400. }
  401. /**
  402. * Test set blob properties
  403. */
  404. public function testSetBlobProperties()
  405. {
  406. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  407. $containerName = $this->generateName();
  408. $storageClient = $this->createStorageInstance();
  409. $storageClient->createContainer($containerName);
  410. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  411. $storageClient->setBlobProperties($containerName, 'images/WindowsAzure.gif', null, array(
  412. 'x-ms-blob-content-language' => 'nl-BE',
  413. 'x-ms-blob-content-type' => 'image/gif'
  414. ));
  415. $blobInstance = $storageClient->getBlobInstance($containerName, 'images/WindowsAzure.gif');
  416. $this->assertEquals('nl-BE', $blobInstance->ContentLanguage);
  417. $this->assertEquals('image/gif', $blobInstance->ContentType);
  418. }
  419. }
  420. /**
  421. * Test set blob metadata
  422. */
  423. public function testSetBlobMetadata()
  424. {
  425. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  426. $containerName = $this->generateName();
  427. $storageClient = $this->createStorageInstance();
  428. $storageClient->createContainer($containerName);
  429. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  430. $storageClient->setBlobMetadata($containerName, 'images/WindowsAzure.gif', array(
  431. 'createdby' => 'PHPAzure',
  432. ));
  433. $metadata = $storageClient->getBlobMetadata($containerName, 'images/WindowsAzure.gif');
  434. $this->assertEquals('PHPAzure', $metadata['createdby']);
  435. }
  436. }
  437. /**
  438. * Test set blob metadata, ensuring no additional headers can be added.
  439. */
  440. public function testSetBlobMetadata_Security_AdditionalHeaders()
  441. {
  442. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  443. $containerName = $this->generateName();
  444. $storageClient = $this->createStorageInstance();
  445. $storageClient->createContainer($containerName);
  446. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  447. $exceptionThrown = false;
  448. try {
  449. // adding a newline should not be possible...
  450. $storageClient->setBlobMetadata($containerName, 'images/WindowsAzure.gif', array(
  451. 'createdby' => "PHPAzure\nx-ms-meta-something:false",
  452. ));
  453. } catch (Exception $ex) {
  454. $exceptionThrown = true;
  455. }
  456. $this->assertTrue($exceptionThrown);
  457. }
  458. }
  459. /**
  460. * Test delete blob
  461. */
  462. public function testDeleteBlob()
  463. {
  464. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  465. $containerName = $this->generateName();
  466. $storageClient = $this->createStorageInstance();
  467. $storageClient->createContainer($containerName);
  468. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  469. $storageClient->deleteBlob($containerName, 'images/WindowsAzure.gif');
  470. $result = $storageClient->listBlobs($containerName);
  471. $this->assertEquals(0, count($result));
  472. }
  473. }
  474. /**
  475. * Test list blobs
  476. */
  477. public function testListBlobs()
  478. {
  479. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  480. $containerName = $this->generateName();
  481. $storageClient = $this->createStorageInstance();
  482. $storageClient->createContainer($containerName);
  483. $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif');
  484. $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif');
  485. $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif');
  486. $storageClient->putBlob($containerName, 'images/WindowsAzure4.gif', self::$path . 'WindowsAzure.gif');
  487. $storageClient->putBlob($containerName, 'images/WindowsAzure5.gif', self::$path . 'WindowsAzure.gif');
  488. $result1 = $storageClient->listBlobs($containerName);
  489. $this->assertEquals(5, count($result1));
  490. $this->assertEquals('images/WindowsAzure5.gif', $result1[4]->Name);
  491. $result2 = $storageClient->listBlobs($containerName, '', '', 2);
  492. $this->assertEquals(2, count($result2));
  493. }
  494. }
  495. /**
  496. * Test list blobs with all includes
  497. */
  498. public function testListBlobsWithAllIncludes()
  499. {
  500. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  501. $containerName = $this->generateName();
  502. $storageClient = $this->createStorageInstance();
  503. $storageClient->createContainer($containerName);
  504. $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif', array(
  505. 'createdby' => 'PHPAzure',
  506. 'ownedby' => 'PHPAzure',
  507. ));
  508. $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif', array(
  509. 'createdby' => 'PHPAzure',
  510. 'ownedby' => 'PHPAzure',
  511. ));
  512. $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif', array(
  513. 'createdby' => 'PHPAzure',
  514. 'ownedby' => 'PHPAzure',
  515. ));
  516. $result = $storageClient->listBlobs($containerName, '', '', null, null, 'metadata,snapshots,uncommittedblobs');
  517. $this->assertEquals(3, count($result));
  518. $this->assertEquals('images/WindowsAzure2.gif', $result[1]->Name);
  519. $this->assertEquals('PHPAzure', $result[1]->Metadata['createdby']);
  520. $this->assertEquals('PHPAzure', $result[1]->Metadata['ownedby']);
  521. }
  522. }
  523. /**
  524. * Test copy blob
  525. */
  526. public function testCopyBlob()
  527. {
  528. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  529. $containerName = $this->generateName();
  530. $storageClient = $this->createStorageInstance();
  531. $storageClient->createContainer($containerName);
  532. $source = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  533. $this->assertEquals($containerName, $source->Container);
  534. $this->assertEquals('images/WindowsAzure.gif', $source->Name);
  535. $destination = $storageClient->copyBlob($containerName, 'images/WindowsAzure.gif', $containerName, 'images/WindowsAzureCopy.gif');
  536. $this->assertEquals($containerName, $destination->Container);
  537. $this->assertEquals('images/WindowsAzureCopy.gif', $destination->Name);
  538. $snapshotId = $storageClient->snapshotBlob($containerName, 'images/WindowsAzure.gif');
  539. $destination = $storageClient->copyBlob($containerName, 'images/WindowsAzure.gif', $containerName, 'images/WindowsAzureCopy2.gif', array(), $snapshotId);
  540. $this->assertEquals($containerName, $destination->Container);
  541. $this->assertEquals('images/WindowsAzureCopy2.gif', $destination->Name);
  542. }
  543. }
  544. /**
  545. * Test root container
  546. */
  547. public function testRootContainer()
  548. {
  549. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  550. $containerName = '$root';
  551. $storageClient = $this->createStorageInstance();
  552. $result = $storageClient->createContainer($containerName);
  553. $this->assertEquals($containerName, $result->Name);
  554. // ACL
  555. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER);
  556. $acl = $storageClient->getContainerAcl($containerName);
  557. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER, $acl);
  558. // Metadata
  559. $storageClient->setContainerMetadata($containerName, array(
  560. 'createdby' => 'PHPAzure',
  561. ));
  562. $metadata = $storageClient->getContainerMetadata($containerName);
  563. $this->assertEquals('PHPAzure', $metadata['createdby']);
  564. // List
  565. $result = $storageClient->listContainers();
  566. $this->assertEquals(1, count($result));
  567. // Put blob
  568. $result = $storageClient->putBlob($containerName, 'WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  569. $this->assertEquals($containerName, $result->Container);
  570. $this->assertEquals('WindowsAzure.gif', $result->Name);
  571. // Get blob
  572. $fileName = tempnam('', 'tst');
  573. $storageClient->getBlob($containerName, 'WindowsAzure.gif', $fileName);
  574. $this->assertTrue(file_exists($fileName));
  575. $this->assertEquals(
  576. file_get_contents(self::$path . 'WindowsAzure.gif'),
  577. file_get_contents($fileName)
  578. );
  579. // Remove file
  580. unlink($fileName);
  581. // Blob metadata
  582. $storageClient->setBlobMetadata($containerName, 'WindowsAzure.gif', array(
  583. 'createdby' => 'PHPAzure',
  584. ));
  585. $metadata = $storageClient->getBlobMetadata($containerName, 'WindowsAzure.gif');
  586. $this->assertEquals('PHPAzure', $metadata['createdby']);
  587. // List blobs
  588. $result = $storageClient->listBlobs($containerName);
  589. $this->assertEquals(1, count($result));
  590. // Delete blob
  591. $storageClient->deleteBlob($containerName, 'WindowsAzure.gif');
  592. $result = $storageClient->listBlobs($containerName);
  593. $this->assertEquals(0, count($result));
  594. }
  595. }
  596. /**
  597. * Test page blob
  598. */
  599. public function testPageBlob()
  600. {
  601. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  602. $containerName = $this->generateName();
  603. $storageClient = $this->createStorageInstance();
  604. $storageClient->createContainer($containerName);
  605. // Data to store
  606. $data1 = "Hello, World!" . str_repeat(' ', 1024 - 13);
  607. $data2 = "Hello, World!" . str_repeat(' ', 512 - 13);
  608. // 1. Create the empty page blob
  609. $storageClient->createPageBlob($containerName, 'test.txt', 1024);
  610. // 2. Upload all data
  611. $storageClient->putPage($containerName, 'test.txt', 0, 1023, $data1);
  612. // Verify contents
  613. $this->assertEquals($data1, $storageClient->getBlobData($containerName, 'test.txt'));
  614. // 3. Clear the page blob
  615. $storageClient->putPage($containerName, 'test.txt', 0, 1023, '', Zend_Service_WindowsAzure_Storage_Blob::PAGE_WRITE_CLEAR);
  616. // 4. Upload some other data in 2 pages
  617. $storageClient->putPage($containerName, 'test.txt', 0, 511, $data2);
  618. $storageClient->putPage($containerName, 'test.txt', 512, 1023, $data2);
  619. // Verify other data
  620. $this->assertEquals($data2 . $data2, $storageClient->getBlobData($containerName, 'test.txt'));
  621. }
  622. }
  623. /**
  624. * Test get page regions
  625. */
  626. public function testGetPageRegions()
  627. {
  628. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  629. $containerName = $this->generateName();
  630. $storageClient = $this->createStorageInstance();
  631. $storageClient->createContainer($containerName);
  632. // Data to store
  633. $data = "Hello, World!" . str_repeat(' ', 512 - 13);
  634. // Upload contents in 2 parts
  635. $storageClient->createPageBlob($containerName, 'test2.txt', 1024 * 1024 * 1024);
  636. $storageClient->putPage($containerName, 'test2.txt', 0, 511, $data);
  637. $storageClient->putPage($containerName, 'test2.txt', 1048576, 1049087, $data);
  638. // Get page regions
  639. $pageRegions = $storageClient->getPageRegions($containerName, 'test2.txt');
  640. // Verify
  641. $this->assertEquals(2, count($pageRegions));
  642. }
  643. }
  644. /**
  645. * Create large file
  646. *
  647. * @return string Filename
  648. */
  649. private function _createLargeFile()
  650. {
  651. $fileName = tempnam('', 'tst');
  652. $fp = fopen($fileName, 'w');
  653. for ($i = 0; $i < Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE / 1024; $i++)
  654. {
  655. fwrite($fp,
  656. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  657. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  658. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  659. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  660. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  661. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  662. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  663. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  664. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  665. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  666. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  667. );
  668. }
  669. fclose($fp);
  670. return $fileName;
  671. }
  672. }
  673. // Call Zend_Service_WindowsAzure_BlobStorageTest::main() if this source file is executed directly.
  674. if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_BlobStorageTest::main") {
  675. Zend_Service_WindowsAzure_BlobStorageTest::main();
  676. }