private void BlobReadStreamReadSizeTestAPM(ICloudBlob blob) { IAsyncResult result; using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { byte[] buffer = GetRandomBuffer(5 * 1024 * 1024); using (MemoryStream wholeBlob = new MemoryStream(buffer)) { result = blob.BeginUploadFromStream(wholeBlob, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } TestHelper.ExpectedException<ArgumentOutOfRangeException>( () => blob.StreamMinimumReadSizeInBytes = 16 * 1024 - 1, "StreamMinimumReadSizeInBytes should not accept values smaller than 16KB"); blob.StreamMinimumReadSizeInBytes = 4 * 1024 * 1024 + 1; BlobRequestOptions options = new BlobRequestOptions() { UseTransactionalMD5 = true }; result = blob.BeginOpenRead(null, options, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); TestHelper.ExpectedException<ArgumentOutOfRangeException>( () => blob.EndOpenRead(result), "StreamMinimumReadSizeInBytes should be smaller than 4MB if UseTransactionalMD5 is true"); string range = null; OperationContext context = new OperationContext(); context.SendingRequest += (sender, e) => range = range ?? e.Request.Headers["x-ms-range"]; blob.StreamMinimumReadSizeInBytes = 4 * 1024 * 1024; result = blob.BeginOpenRead(null, options, context, ar => waitHandle.Set(), null); waitHandle.WaitOne(); using (Stream blobStream = blob.EndOpenRead(result)) { blobStream.ReadByte(); Assert.AreEqual("bytes=0-" + (blob.StreamMinimumReadSizeInBytes - 1).ToString(), range); range = null; } blob.StreamMinimumReadSizeInBytes = 6 * 1024 * 1024; options.UseTransactionalMD5 = false; result = blob.BeginOpenRead(null, options, context, ar => waitHandle.Set(), null); waitHandle.WaitOne(); using (Stream blobStream = blob.EndOpenRead(result)) { blobStream.ReadByte(); Assert.AreEqual("bytes=0-" + (buffer.Length - 1).ToString(), range); range = null; } blob.StreamMinimumReadSizeInBytes = 16 * 1024; result = blob.BeginOpenRead(null, options, context, ar => waitHandle.Set(), null); waitHandle.WaitOne(); using (Stream blobStream = blob.EndOpenRead(result)) { blobStream.ReadByte(); Assert.AreEqual("bytes=0-" + (blob.StreamMinimumReadSizeInBytes - 1).ToString(), range); range = null; } } }