/**
  * @covers WindowsAzure\Blob\BlobRestProxy::createBlobSnapshot
  * @covers WindowsAzure\Blob\BlobRestProxy::createPageBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::deleteBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::getBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::setBlobMetadata
  */
 private function getBlobWorker($options, $container)
 {
     $blob = BlobServiceFunctionalTestData::getInterestingBlobName();
     // Make sure there is something to test
     $dataSize = 512;
     $this->restProxy->createPageBlob($container, $blob, $dataSize);
     $metadata = BlobServiceFunctionalTestData::getNiceMetadata();
     $sbmd = $this->restProxy->setBlobMetadata($container, $blob, $metadata);
     $snapshot = $this->restProxy->createBlobSnapshot($container, $blob);
     $this->restProxy->createBlobSnapshot($container, $blob);
     if (!is_null($options)) {
         BlobServiceFunctionalTestData::fixEtagAccessCondition($options->getAccessCondition(), $sbmd->getEtag());
         $options->setSnapshot(is_null($options->getSnapshot()) ? null : $snapshot->getSnapshot());
     }
     try {
         $res = is_null($options) ? $this->restProxy->getBlob($container, $blob) : $this->restProxy->getBlob($container, $blob, $options);
         if (is_null($options)) {
             $options = new GetBlobOptions();
         }
         if (!is_null($options->getTimeout()) && $options->getTimeout() < 1) {
             $this->assertTrue(false, 'Expect negative timeouts in $options to throw');
         }
         if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) {
             $this->assertTrue(false, 'Expect failing temporal access condition should throw');
         }
         if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) {
             $this->assertTrue(false, 'Expect failing etag access condition to throw');
         }
         if ($options->getComputeRangeMD5() && is_null($options->getRangeStart())) {
             $this->assertTrue(false, 'Expect compute range MD5 to fail if range not set');
         }
         $this->verifyGetBlobWorker($res, $options, $dataSize, $metadata);
     } catch (ServiceException $e) {
         if (!is_null($options->getTimeout()) && $options->getTimeout() < 1) {
             $this->assertEquals(500, $e->getCode(), 'bad timeout: getCode');
         } else {
             if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) {
                 if ($options->getAccessCondition()->getHeader() == Resources::IF_MODIFIED_SINCE) {
                     $this->assertEquals(304, $e->getCode(), 'bad temporal access condition IF_MODIFIED_SINCE: getCode');
                 } else {
                     $this->assertEquals(412, $e->getCode(), 'bad temporal access condition IF_UNMODIFIED_SINCE: getCode');
                 }
             } else {
                 if (!BlobServiceFunctionalTestData::passEtagAccessCondition($options->getAccessCondition())) {
                     $this->assertEquals(412, $e->getCode(), 'bad etag access condition: getCode');
                 } else {
                     if ($options->getComputeRangeMD5() && is_null($options->getRangeStart())) {
                         $this->assertEquals(400, $e->getCode(), 'Expect compute range MD5 to fail when range not set: getCode');
                     } else {
                     }
                 }
             }
         }
     }
     // Clean up.
     $this->restProxy->deleteBlob($container, $blob);
 }
 /**
  * @covers WindowsAzure\Blob\BlobRestProxy::copyBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::createBlobSnapshot
  * @covers WindowsAzure\Blob\BlobRestProxy::createPageBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::deleteBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::getBlob
  * @covers WindowsAzure\Blob\BlobRestProxy::listBlobs
  * @covers WindowsAzure\Blob\BlobRestProxy::setBlobMetadata
  */
 private function copyBlobWorker($options, $sourceContainer, $destContainer)
 {
     $sourceBlob = BlobServiceFunctionalTestData::getInterestingBlobName($sourceContainer);
     $destBlob = BlobServiceFunctionalTestData::getInterestingBlobName($destContainer);
     // Make sure there is something to test
     $sourceDataSize = 512;
     $this->restProxy->createPageBlob($sourceContainer, $sourceBlob, $sourceDataSize);
     $destDataSize = 2048;
     $destBlobInfo = $this->restProxy->createPageBlob($destContainer, $destBlob, $destDataSize);
     $this->restProxy->createBlobSnapshot($destContainer, $destBlob);
     $metadata = BlobServiceFunctionalTestData::getNiceMetadata();
     $this->restProxy->setBlobMetadata($sourceContainer, $sourceBlob, $metadata);
     $snapshot = $this->restProxy->createBlobSnapshot($sourceContainer, $sourceBlob);
     if (!is_null($options)) {
         BlobServiceFunctionalTestData::fixETagAccessCondition($options->getSourceAccessCondition(), $snapshot->getETag());
         BlobServiceFunctionalTestData::fixETagAccessCondition($options->getAccessCondition(), $destBlobInfo->getETag());
         $options->setSourceSnapshot(is_null($options->getSourceSnapshot()) ? null : $snapshot->getSnapshot());
     }
     try {
         if (is_null($options)) {
             $this->restProxy->copyBlob($destContainer, $destBlob, $sourceContainer, $sourceBlob);
         } else {
             $this->restProxy->copyBlob($destContainer, $destBlob, $sourceContainer, $sourceBlob, $options);
         }
         if (is_null($options)) {
             $options = new CopyBlobOptions();
         }
         if (!is_null($options->getTimeout()) && $options->getTimeout() < 1) {
             $this->assertTrue(false, 'Expect negative timeouts in $options to throw');
         }
         if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getSourceAccessCondition())) {
             $this->assertTrue(false, 'Expect failing source temporal access condition should throw');
         }
         if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getSourceAccessCondition())) {
             $this->assertTrue(false, 'Expect failing source etag access condition to throw');
         }
         if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) {
             $this->assertTrue(false, 'Expect failing dest temporal access condition should throw');
         }
         if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) {
             $this->assertTrue(false, 'Expect failing dest etag access condition to throw');
         }
         $listOptions = new ListBlobsOptions();
         $listOptions->setIncludeSnapshots(true);
         $listOptions->setPrefix($destBlob);
         $listBlobsResult = $this->restProxy->listBlobs($destContainer == '' ? '$root' : $destContainer, $listOptions);
         $blobs = $listBlobsResult->getBlobs();
         $getBlobResult = $this->restProxy->getBlob($destContainer, $destBlob);
         $this->verifyCopyBlobWorker($options, $blobs, $getBlobResult, $sourceDataSize, $metadata);
     } catch (ServiceException $e) {
         if (is_null($options)) {
             $options = new CopyBlobOptions();
         }
         if (!is_null($options->getTimeout()) && $options->getTimeout() < 1) {
             $this->assertEquals(500, $e->getCode(), 'bad timeout: deleteHttpStatusCode');
         } else {
             if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getSourceAccessCondition())) {
                 $this->assertEquals(412, $e->getCode(), 'bad source temporal access condition IF_UNMODIFIED_SINCE: deleteHttpStatusCode');
             } else {
                 if (!BlobServiceFunctionalTestData::passETagAccessCondition($options->getSourceAccessCondition())) {
                     $this->assertEquals(412, $e->getCode(), 'bad source etag access condition: deleteHttpStatusCode');
                 } else {
                     if (!BlobServiceFunctionalTestData::passTemporalAccessCondition($options->getAccessCondition())) {
                         $this->assertEquals(412, $e->getCode(), 'bad dest temporal access condition IF_UNMODIFIED_SINCE: deleteHttpStatusCode');
                     } else {
                         if (!BlobServiceFunctionalTestData::passETagAccessCondition($options->getAccessCondition())) {
                             $this->assertEquals(412, $e->getCode(), 'bad dest etag access condition: deleteHttpStatusCode');
                         } else {
                             throw $e;
                         }
                     }
                 }
             }
         }
     }
     // Clean up.
     $this->restProxy->deleteBlob($sourceContainer, $sourceBlob);
     $this->restProxy->deleteBlob($destContainer, $destBlob);
 }