BlobStorageTest.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  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_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-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_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 create container if not exists
  154. */
  155. public function testCreateContainerIfNotExists()
  156. {
  157. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  158. $containerName = $this->generateName();
  159. $storageClient = $this->createStorageInstance();
  160. $result = $storageClient->containerExists($containerName);
  161. $this->assertFalse($result);
  162. $storageClient->createContainerIfNotExists($containerName);
  163. $result = $storageClient->containerExists($containerName);
  164. $this->assertTrue($result);
  165. $storageClient->createContainerIfNotExists($containerName);
  166. }
  167. }
  168. /**
  169. * Test set container acl
  170. */
  171. public function testSetContainerAcl()
  172. {
  173. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  174. $containerName = $this->generateName();
  175. $storageClient = $this->createStorageInstance();
  176. $storageClient->createContainer($containerName);
  177. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_BLOB);
  178. $acl = $storageClient->getContainerAcl($containerName);
  179. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_BLOB, $acl);
  180. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER);
  181. $acl = $storageClient->getContainerAcl($containerName);
  182. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER, $acl);
  183. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE);
  184. $acl = $storageClient->getContainerAcl($containerName);
  185. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE, $acl);
  186. }
  187. }
  188. /**
  189. * Test set container acl advanced
  190. */
  191. public function testSetContainerAclAdvanced()
  192. {
  193. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  194. $containerName = $this->generateName();
  195. $storageClient = $this->createStorageInstance();
  196. $storageClient->createContainer($containerName);
  197. require_once 'Zend/Service/WindowsAzure/Storage/SignedIdentifier.php';
  198. $storageClient->setContainerAcl(
  199. $containerName,
  200. Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE,
  201. array(
  202. new Zend_Service_WindowsAzure_Storage_SignedIdentifier('ABCDEF', '2009-10-10', '2009-10-11', 'r')
  203. )
  204. );
  205. $acl = $storageClient->getContainerAcl($containerName, true);
  206. $this->assertEquals(1, count($acl));
  207. }
  208. }
  209. /**
  210. * Test set container metadata
  211. */
  212. public function testSetContainerMetadata()
  213. {
  214. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  215. $containerName = $this->generateName();
  216. $storageClient = $this->createStorageInstance();
  217. $storageClient->createContainer($containerName);
  218. $storageClient->setContainerMetadata($containerName, array(
  219. 'createdby' => 'PHPAzure',
  220. ));
  221. $metadata = $storageClient->getContainerMetadata($containerName);
  222. $this->assertEquals('PHPAzure', $metadata['createdby']);
  223. }
  224. }
  225. /**
  226. * Test list containers
  227. */
  228. public function testListContainers()
  229. {
  230. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  231. $containerName1 = 'testlist1';
  232. $containerName2 = 'testlist2';
  233. $containerName3 = 'testlist3';
  234. $storageClient = $this->createStorageInstance();
  235. $storageClient->createContainer($containerName1);
  236. $storageClient->createContainer($containerName2);
  237. $storageClient->createContainer($containerName3);
  238. $result1 = $storageClient->listContainers('testlist');
  239. $result2 = $storageClient->listContainers('testlist', 1);
  240. // cleanup first
  241. $storageClient->deleteContainer($containerName1);
  242. $storageClient->deleteContainer($containerName2);
  243. $storageClient->deleteContainer($containerName3);
  244. $this->assertEquals(3, count($result1));
  245. $this->assertEquals($containerName2, $result1[1]->Name);
  246. $this->assertEquals(1, count($result2));
  247. }
  248. }
  249. /**
  250. * Test list containers with metadata
  251. */
  252. public function testListContainersWithMetadata()
  253. {
  254. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  255. $containerName = $this->generateName();
  256. $storageClient = $this->createStorageInstance();
  257. $storageClient->createContainer($containerName, array(
  258. 'createdby' => 'PHPAzure',
  259. 'ownedby' => 'PHPAzure',
  260. ));
  261. $result = $storageClient->listContainers($containerName, null, null, 'metadata');
  262. $this->assertEquals('PHPAzure', $result[0]->Metadata['createdby']);
  263. $this->assertEquals('PHPAzure', $result[0]->Metadata['ownedby']);
  264. }
  265. }
  266. /**
  267. * Test put blob
  268. */
  269. public function testPutBlob()
  270. {
  271. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  272. $containerName = $this->generateName();
  273. $storageClient = $this->createStorageInstance();
  274. $storageClient->createContainer($containerName);
  275. $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  276. $this->assertEquals($containerName, $result->Container);
  277. $this->assertEquals('images/WindowsAzure.gif', $result->Name);
  278. }
  279. }
  280. /**
  281. * Test put blob data
  282. */
  283. public function testPutBlobData()
  284. {
  285. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  286. $containerName = $this->generateName();
  287. $storageClient = $this->createStorageInstance();
  288. $storageClient->createContainer($containerName);
  289. $result = $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!');
  290. $this->assertEquals($containerName, $result->Container);
  291. $this->assertEquals('test.txt', $result->Name);
  292. }
  293. }
  294. /**
  295. * Test put large blob
  296. */
  297. public function testPutLargeBlob()
  298. {
  299. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS && TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNLARGEBLOB) {
  300. // Create a file > Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE
  301. $fileName = $this->_createLargeFile();
  302. // Execute test
  303. $containerName = $this->generateName();
  304. $storageClient = $this->createStorageInstance();
  305. $storageClient->createContainer($containerName);
  306. $result = $storageClient->putLargeBlob($containerName, 'LargeFile.txt', $fileName);
  307. $this->assertEquals($containerName, $result->Container);
  308. $this->assertEquals('LargeFile.txt', $result->Name);
  309. // Get block list
  310. $blockList = $storageClient->getBlockList($containerName, 'LargeFile.txt');
  311. $this->assertTrue(count($blockList['CommittedBlocks']) > 0);
  312. // Remove file
  313. unlink($fileName);
  314. }
  315. }
  316. /**
  317. * Test get blob
  318. */
  319. public function testGetBlob()
  320. {
  321. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  322. $containerName = $this->generateName();
  323. $storageClient = $this->createStorageInstance();
  324. $storageClient->createContainer($containerName);
  325. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  326. $fileName = tempnam('', 'tst');
  327. $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', $fileName);
  328. $this->assertTrue(file_exists($fileName));
  329. $this->assertEquals(
  330. file_get_contents(self::$path . 'WindowsAzure.gif'),
  331. file_get_contents($fileName)
  332. );
  333. // Remove file
  334. unlink($fileName);
  335. }
  336. }
  337. /**
  338. * Test get blob data
  339. */
  340. public function testGetBlobData()
  341. {
  342. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  343. $containerName = $this->generateName();
  344. $storageClient = $this->createStorageInstance();
  345. $storageClient->createContainer($containerName);
  346. $result = $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!');
  347. $data = $storageClient->getBlobData($containerName, 'test.txt');
  348. $this->assertEquals(
  349. 'Hello World!',
  350. $data
  351. );
  352. }
  353. }
  354. /**
  355. * Test snapshot blob
  356. */
  357. public function testSnapshotBlob()
  358. {
  359. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  360. $containerName = $this->generateName();
  361. $storageClient = $this->createStorageInstance();
  362. $storageClient->createContainer($containerName);
  363. $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  364. $this->assertEquals($containerName, $result->Container);
  365. $this->assertEquals('images/WindowsAzure.gif', $result->Name);
  366. $snapshotId = $storageClient->snapshotBlob($containerName, 'images/WindowsAzure.gif');
  367. $fileName = tempnam('', 'tst');
  368. $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', $fileName, $snapshotId);
  369. $this->assertTrue(file_exists($fileName));
  370. $this->assertEquals(
  371. file_get_contents(self::$path . 'WindowsAzure.gif'),
  372. file_get_contents($fileName)
  373. );
  374. // Remove file
  375. unlink($fileName);
  376. }
  377. }
  378. /**
  379. * Test lease blob
  380. */
  381. public function testLeaseBlob()
  382. {
  383. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  384. $containerName = $this->generateName();
  385. $storageClient = $this->createStorageInstance();
  386. $storageClient->createContainer($containerName);
  387. $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!');
  388. // Acquire a lease
  389. $lease = $storageClient->leaseBlob($containerName, 'test.txt', Zend_Service_WindowsAzure_Storage_Blob::LEASE_ACQUIRE);
  390. $this->assertNotEquals('', $lease->LeaseId);
  391. // Second lease should not be possible
  392. $exceptionThrown = false;
  393. try {
  394. $storageClient->leaseBlob($containerName, 'test.txt', Zend_Service_WindowsAzure_Storage_Blob::LEASE_ACQUIRE);
  395. } catch (Exception $e) {
  396. $exceptionThrown = true;
  397. }
  398. $this->assertTrue($exceptionThrown);
  399. // Delete should not be possible
  400. $exceptionThrown = false;
  401. try {
  402. $storageClient->deleteBlob($containerName, 'test.txt');
  403. } catch (Exception $e) {
  404. $exceptionThrown = true;
  405. }
  406. $this->markTestIncomplete('Test inconclusive. Verify http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/9ae25614-b1da-43ab-abca-644abc034eb3 for info.');
  407. $this->assertTrue($exceptionThrown);
  408. // But should work when a lease id is supplied
  409. $exceptionThrown = false;
  410. try {
  411. $storageClient->putBlobData($containerName, 'test.txt', 'Hello!');
  412. } catch (Exception $e) {
  413. $exceptionThrown = true;
  414. }
  415. $this->assertFalse($exceptionThrown);
  416. }
  417. }
  418. /**
  419. * Test set blob properties
  420. */
  421. public function testSetBlobProperties()
  422. {
  423. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  424. $containerName = $this->generateName();
  425. $storageClient = $this->createStorageInstance();
  426. $storageClient->createContainer($containerName);
  427. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  428. $storageClient->setBlobProperties($containerName, 'images/WindowsAzure.gif', null, array(
  429. 'x-ms-blob-content-language' => 'nl-BE',
  430. 'x-ms-blob-content-type' => 'image/gif'
  431. ));
  432. $blobInstance = $storageClient->getBlobInstance($containerName, 'images/WindowsAzure.gif');
  433. $this->assertEquals('nl-BE', $blobInstance->ContentLanguage);
  434. $this->assertEquals('image/gif', $blobInstance->ContentType);
  435. }
  436. }
  437. /**
  438. * Test set blob metadata
  439. */
  440. public function testSetBlobMetadata()
  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. $storageClient->setBlobMetadata($containerName, 'images/WindowsAzure.gif', array(
  448. 'createdby' => 'PHPAzure',
  449. ));
  450. $metadata = $storageClient->getBlobMetadata($containerName, 'images/WindowsAzure.gif');
  451. $this->assertEquals('PHPAzure', $metadata['createdby']);
  452. }
  453. }
  454. /**
  455. * Test set blob metadata, ensuring no additional headers can be added.
  456. */
  457. public function testSetBlobMetadata_Security_AdditionalHeaders()
  458. {
  459. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  460. $containerName = $this->generateName();
  461. $storageClient = $this->createStorageInstance();
  462. $storageClient->createContainer($containerName);
  463. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  464. $exceptionThrown = false;
  465. try {
  466. // adding a newline should not be possible...
  467. $storageClient->setBlobMetadata($containerName, 'images/WindowsAzure.gif', array(
  468. 'createdby' => "PHPAzure\nx-ms-meta-something:false",
  469. ));
  470. } catch (Exception $ex) {
  471. $exceptionThrown = true;
  472. }
  473. $this->assertTrue($exceptionThrown);
  474. }
  475. }
  476. /**
  477. * Test delete blob
  478. */
  479. public function testDeleteBlob()
  480. {
  481. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  482. $containerName = $this->generateName();
  483. $storageClient = $this->createStorageInstance();
  484. $storageClient->createContainer($containerName);
  485. $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  486. $storageClient->deleteBlob($containerName, 'images/WindowsAzure.gif');
  487. $result = $storageClient->listBlobs($containerName);
  488. $this->assertEquals(0, count($result));
  489. }
  490. }
  491. /**
  492. * Test list blobs
  493. */
  494. public function testListBlobs()
  495. {
  496. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  497. $containerName = $this->generateName();
  498. $storageClient = $this->createStorageInstance();
  499. $storageClient->createContainer($containerName);
  500. $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif');
  501. $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif');
  502. $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif');
  503. $storageClient->putBlob($containerName, 'images/WindowsAzure4.gif', self::$path . 'WindowsAzure.gif');
  504. $storageClient->putBlob($containerName, 'images/WindowsAzure5.gif', self::$path . 'WindowsAzure.gif');
  505. $result1 = $storageClient->listBlobs($containerName);
  506. $this->assertEquals(5, count($result1));
  507. $this->assertEquals('images/WindowsAzure5.gif', $result1[4]->Name);
  508. $result2 = $storageClient->listBlobs($containerName, '', '', 2);
  509. $this->assertEquals(2, count($result2));
  510. }
  511. }
  512. /**
  513. * Test list blobs with all includes
  514. */
  515. public function testListBlobsWithAllIncludes()
  516. {
  517. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  518. $containerName = $this->generateName();
  519. $storageClient = $this->createStorageInstance();
  520. $storageClient->createContainer($containerName);
  521. $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif', array(
  522. 'createdby' => 'PHPAzure',
  523. 'ownedby' => 'PHPAzure',
  524. ));
  525. $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif', array(
  526. 'createdby' => 'PHPAzure',
  527. 'ownedby' => 'PHPAzure',
  528. ));
  529. $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif', array(
  530. 'createdby' => 'PHPAzure',
  531. 'ownedby' => 'PHPAzure',
  532. ));
  533. $result = $storageClient->listBlobs($containerName, '', '', null, null, 'metadata,snapshots,uncommittedblobs');
  534. $this->assertEquals(3, count($result));
  535. $this->assertEquals('images/WindowsAzure2.gif', $result[1]->Name);
  536. $this->assertEquals('PHPAzure', $result[1]->Metadata['createdby']);
  537. $this->assertEquals('PHPAzure', $result[1]->Metadata['ownedby']);
  538. }
  539. }
  540. /**
  541. * Test copy blob
  542. */
  543. public function testCopyBlob()
  544. {
  545. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  546. $containerName = $this->generateName();
  547. $storageClient = $this->createStorageInstance();
  548. $storageClient->createContainer($containerName);
  549. $source = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  550. $this->assertEquals($containerName, $source->Container);
  551. $this->assertEquals('images/WindowsAzure.gif', $source->Name);
  552. $destination = $storageClient->copyBlob($containerName, 'images/WindowsAzure.gif', $containerName, 'images/WindowsAzureCopy.gif');
  553. $this->assertEquals($containerName, $destination->Container);
  554. $this->assertEquals('images/WindowsAzureCopy.gif', $destination->Name);
  555. $snapshotId = $storageClient->snapshotBlob($containerName, 'images/WindowsAzure.gif');
  556. $destination = $storageClient->copyBlob($containerName, 'images/WindowsAzure.gif', $containerName, 'images/WindowsAzureCopy2.gif', array(), $snapshotId);
  557. $this->assertEquals($containerName, $destination->Container);
  558. $this->assertEquals('images/WindowsAzureCopy2.gif', $destination->Name);
  559. }
  560. }
  561. /**
  562. * Test root container
  563. */
  564. public function testRootContainer()
  565. {
  566. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  567. $containerName = '$root';
  568. $storageClient = $this->createStorageInstance();
  569. $result = $storageClient->createContainer($containerName);
  570. $this->assertEquals($containerName, $result->Name);
  571. // ACL
  572. $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER);
  573. $acl = $storageClient->getContainerAcl($containerName);
  574. $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER, $acl);
  575. // Metadata
  576. $storageClient->setContainerMetadata($containerName, array(
  577. 'createdby' => 'PHPAzure',
  578. ));
  579. $metadata = $storageClient->getContainerMetadata($containerName);
  580. $this->assertEquals('PHPAzure', $metadata['createdby']);
  581. // List
  582. $result = $storageClient->listContainers();
  583. $this->assertEquals(1, count($result));
  584. // Put blob
  585. $result = $storageClient->putBlob($containerName, 'WindowsAzure.gif', self::$path . 'WindowsAzure.gif');
  586. $this->assertEquals($containerName, $result->Container);
  587. $this->assertEquals('WindowsAzure.gif', $result->Name);
  588. // Get blob
  589. $fileName = tempnam('', 'tst');
  590. $storageClient->getBlob($containerName, 'WindowsAzure.gif', $fileName);
  591. $this->assertTrue(file_exists($fileName));
  592. $this->assertEquals(
  593. file_get_contents(self::$path . 'WindowsAzure.gif'),
  594. file_get_contents($fileName)
  595. );
  596. // Remove file
  597. unlink($fileName);
  598. // Blob metadata
  599. $storageClient->setBlobMetadata($containerName, 'WindowsAzure.gif', array(
  600. 'createdby' => 'PHPAzure',
  601. ));
  602. $metadata = $storageClient->getBlobMetadata($containerName, 'WindowsAzure.gif');
  603. $this->assertEquals('PHPAzure', $metadata['createdby']);
  604. // List blobs
  605. $result = $storageClient->listBlobs($containerName);
  606. $this->assertEquals(1, count($result));
  607. // Delete blob
  608. $storageClient->deleteBlob($containerName, 'WindowsAzure.gif');
  609. $result = $storageClient->listBlobs($containerName);
  610. $this->assertEquals(0, count($result));
  611. }
  612. }
  613. /**
  614. * Test page blob
  615. */
  616. public function testPageBlob()
  617. {
  618. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  619. $containerName = $this->generateName();
  620. $storageClient = $this->createStorageInstance();
  621. $storageClient->createContainer($containerName);
  622. // Data to store
  623. $data1 = "Hello, World!" . str_repeat(' ', 1024 - 13);
  624. $data2 = "Hello, World!" . str_repeat(' ', 512 - 13);
  625. // 1. Create the empty page blob
  626. $storageClient->createPageBlob($containerName, 'test.txt', 1024);
  627. // 2. Upload all data
  628. $storageClient->putPage($containerName, 'test.txt', 0, 1023, $data1);
  629. // Verify contents
  630. $this->assertEquals($data1, $storageClient->getBlobData($containerName, 'test.txt'));
  631. // 3. Clear the page blob
  632. $storageClient->putPage($containerName, 'test.txt', 0, 1023, '', Zend_Service_WindowsAzure_Storage_Blob::PAGE_WRITE_CLEAR);
  633. // 4. Upload some other data in 2 pages
  634. $storageClient->putPage($containerName, 'test.txt', 0, 511, $data2);
  635. $storageClient->putPage($containerName, 'test.txt', 512, 1023, $data2);
  636. // Verify other data
  637. $this->assertEquals($data2 . $data2, $storageClient->getBlobData($containerName, 'test.txt'));
  638. }
  639. }
  640. /**
  641. * Test get page regions
  642. */
  643. public function testGetPageRegions()
  644. {
  645. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  646. $containerName = $this->generateName();
  647. $storageClient = $this->createStorageInstance();
  648. $storageClient->createContainer($containerName);
  649. // Data to store
  650. $data = "Hello, World!" . str_repeat(' ', 512 - 13);
  651. // Upload contents in 2 parts
  652. $storageClient->createPageBlob($containerName, 'test2.txt', 1024 * 1024 * 1024);
  653. $storageClient->putPage($containerName, 'test2.txt', 0, 511, $data);
  654. $storageClient->putPage($containerName, 'test2.txt', 1048576, 1049087, $data);
  655. // Get page regions
  656. $pageRegions = $storageClient->getPageRegions($containerName, 'test2.txt');
  657. // Verify
  658. $this->assertEquals(2, count($pageRegions));
  659. }
  660. }
  661. /**
  662. * Test put blob with x-ms-blob-cache-control header
  663. */
  664. public function testPutBlobWithCacheControlHeader()
  665. {
  666. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) {
  667. $containerName = $this->generateName();
  668. $storageClient = $this->createStorageInstance();
  669. $storageClient->createContainer($containerName);
  670. $headers = array("x-ms-blob-cache-control" => "public, max-age=7200");
  671. $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif', array(), null, $headers);
  672. $blobInstance = $storageClient->getBlobInstance($containerName, 'images/WindowsAzure.gif');
  673. $this->assertEquals($headers["x-ms-blob-cache-control"], $blobInstance->CacheControl);
  674. }
  675. }
  676. /**
  677. * Test put large blob with x-ms-blob-cache-control header
  678. */
  679. public function testPutLargeBlobWithCacheControlHeader()
  680. {
  681. if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS && TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNLARGEBLOB) {
  682. // Create a file > Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE
  683. $fileName = $this->_createLargeFile();
  684. // Execute test
  685. $containerName = $this->generateName();
  686. $storageClient = $this->createStorageInstance();
  687. $storageClient->createContainer($containerName);
  688. $headers = array("x-ms-blob-cache-control" => "public, max-age=7200");
  689. $storageClient->putLargeBlob($containerName, 'LargeFile.txt', $fileName, array(), null, array("x-ms-blob-cache-control" => "public, max-age=7200"));
  690. $blobInstance = $storageClient->getBlobInstance($containerName, 'LargeFile.txt');
  691. $this->assertEquals($headers["x-ms-blob-cache-control"], $blobInstance->CacheControl);
  692. // Remove file
  693. unlink($fileName);
  694. }
  695. }
  696. /**
  697. * Create large file
  698. *
  699. * @return string Filename
  700. */
  701. protected function _createLargeFile()
  702. {
  703. $fileName = tempnam('', 'tst');
  704. $fp = fopen($fileName, 'w');
  705. for ($i = 0; $i < Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE / 1024; $i++)
  706. {
  707. fwrite($fp,
  708. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  709. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  710. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  711. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  712. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  713. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  714. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  715. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  716. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  717. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' .
  718. 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  719. );
  720. }
  721. fclose($fp);
  722. return $fileName;
  723. }
  724. }
  725. // Call Zend_Service_WindowsAzure_BlobStorageTest::main() if this source file is executed directly.
  726. if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_BlobStorageTest::main") {
  727. Zend_Service_WindowsAzure_BlobStorageTest::main();
  728. }