/// <summary> /// Single put blob and get blob /// </summary> /// <param name="blobSize">The blob size.</param> /// <param name="bufferSize">The output buffer size.</param> /// <param name="bufferOffset">The output buffer offset.</param> /// <param name="blobOffset">The blob offset.</param> /// <param name="length">Length of the data range to download.</param> /// <param name="option">0 - Sync, 1 - APM and 2 - APM overload.</param> private void DoDownloadRangeToByteArray(ICloudBlob blob, int blobSize, int bufferSize, int bufferOffset, long? blobOffset, long? length, int option) { int downloadLength; byte[] buffer = GetRandomBuffer(blobSize); byte[] resultBuffer = new byte[bufferSize]; byte[] resultBuffer2 = new byte[bufferSize]; using (MemoryStream originalBlob = new MemoryStream(buffer)) { blob.UploadFromStream(originalBlob); } if (option == 0) { downloadLength = blob.DownloadRangeToByteArray(resultBuffer, bufferOffset, blobOffset, length); } else if (option == 1) { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { ICancellableAsyncResult result = blob.BeginDownloadRangeToByteArray(resultBuffer, bufferOffset, blobOffset, length, ar => waitHandle.Set(), null); waitHandle.WaitOne(); downloadLength = blob.EndDownloadRangeToByteArray(result); } } else { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { OperationContext context = new OperationContext(); ICancellableAsyncResult result = blob.BeginDownloadRangeToByteArray(resultBuffer, bufferOffset, blobOffset, length, null, null, context, ar => waitHandle.Set(), null); waitHandle.WaitOne(); downloadLength = blob.EndDownloadRangeToByteArray(result); } } int downloadSize = Math.Min(blobSize - (int)(blobOffset.HasValue ? blobOffset.Value : 0), bufferSize - bufferOffset); if (length.HasValue && (length.Value < downloadSize)) { downloadSize = (int)length.Value; } Assert.AreEqual(downloadSize, downloadLength); for (int i = 0; i < bufferOffset; i++) { Assert.AreEqual(0, resultBuffer[i]); } for (int j = 0; j < downloadLength; j++) { Assert.AreEqual(buffer[(blobOffset.HasValue ? blobOffset.Value : 0) + j], resultBuffer[bufferOffset + j]); } for (int k = bufferOffset + downloadLength; k < bufferSize; k++) { Assert.AreEqual(0, resultBuffer[k]); } }