@Test
  public void testPageBlobDownloadRangeTest()
      throws URISyntaxException, StorageException, IOException {
    byte[] buffer = BlobTestHelper.getRandomBuffer(2 * 1024);

    CloudPageBlob blob = this.container.getPageBlobReference("blob1");
    ByteArrayInputStream wholeBlob = new ByteArrayInputStream(buffer);
    blob.upload(wholeBlob, 2 * 1024);

    ByteArrayOutputStream blobStream = new ByteArrayOutputStream();
    try {
      blob.downloadRange(0, new Long(0), blobStream);
    } catch (IndexOutOfBoundsException ex) {

    }

    blob.downloadRange(0, new Long(1024), blobStream);
    assertEquals(blobStream.size(), 1024);
    BlobTestHelper.assertStreamsAreEqualAtIndex(
        new ByteArrayInputStream(blobStream.toByteArray()), wholeBlob, 0, 0, 1024, 2 * 1024);

    CloudPageBlob blob2 = this.container.getPageBlobReference("blob1");
    try {
      blob.downloadRange(1024, new Long(0), blobStream);
    } catch (IndexOutOfBoundsException ex) {

    }

    ByteArrayOutputStream blobStream2 = new ByteArrayOutputStream();
    blob2.downloadRange(1024, new Long(1024), blobStream2);
    BlobTestHelper.assertStreamsAreEqualAtIndex(
        new ByteArrayInputStream(blobStream2.toByteArray()), wholeBlob, 1024, 1024, 1024, 2 * 1024);

    BlobTestHelper.assertAreEqual(blob, blob2);
  }
  @Test
  public void testUploadDownloadBlobProperties()
      throws URISyntaxException, StorageException, IOException {
    final int length = 512;

    // do this to make sure the set MD5 can be compared without an exception being thrown
    BlobRequestOptions options = new BlobRequestOptions();
    options.setDisableContentMD5Validation(true);

    // with explicit upload/download of properties
    String pageBlobName1 = BlobTestHelper.generateRandomBlobNameWithPrefix("testBlockBlob");
    CloudPageBlob pageBlobRef1 = this.container.getPageBlobReference(pageBlobName1);

    pageBlobRef1.upload(BlobTestHelper.getRandomDataStream(length), length);

    BlobTestHelper.setBlobProperties(pageBlobRef1);
    BlobProperties props1 = pageBlobRef1.getProperties();
    pageBlobRef1.uploadProperties();

    pageBlobRef1.downloadAttributes(null, options, null);
    BlobProperties props2 = pageBlobRef1.getProperties();

    BlobTestHelper.assertAreEqual(props1, props2);

    // by uploading/downloading the blob
    pageBlobName1 = BlobTestHelper.generateRandomBlobNameWithPrefix("testBlockBlob");
    pageBlobRef1 = this.container.getPageBlobReference(pageBlobName1);

    BlobTestHelper.setBlobProperties(pageBlobRef1);
    props1 = pageBlobRef1.getProperties();

    pageBlobRef1.upload(BlobTestHelper.getRandomDataStream(length), length);

    pageBlobRef1.download(new ByteArrayOutputStream(), null, options, null);
    props2 = pageBlobRef1.getProperties();

    BlobTestHelper.assertAreEqual(props1, props2);
  }