BlobStorageTest.php 28 KB

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