public void OpContextTestCustomUserAgent()
        {
            CloudBlobClient    blobClient = GenerateCloudBlobClient();
            CloudBlobContainer container  = blobClient.GetContainerReference("test");

            string uniqueID = Guid.NewGuid().ToString();

            OperationContext ctx = new OperationContext();

            ctx.CustomUserAgent = "product-info-correct-format";
            string userAgentValue = ctx.CustomUserAgent + " " + Microsoft.Azure.Storage.Shared.Protocol.Constants.HeaderConstants.UserAgent;

            Action act = () => container.Exists(null, ctx);

            TestHelper.VerifyHeaderWasSent("User-Agent", userAgentValue, AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);

            act = () => container.EndExists(container.BeginExists(null, ctx, null, null));

            TestHelper.VerifyHeaderWasSent("User-Agent", userAgentValue, AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);

#if TASK
            act = () => container.ExistsAsync(null, ctx).Wait();

            TestHelper.VerifyHeaderWasSent("User-Agent", userAgentValue, AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);
#endif
        }
        public void OpContextTestClientRequestIDOnBlob()
        {
            CloudBlobClient    blobClient = GenerateCloudBlobClient();
            CloudBlobContainer container  = blobClient.GetContainerReference("test");

            string uniqueID = Guid.NewGuid().ToString();

            Action act = () => container.Exists(null, new OperationContext()
            {
                ClientRequestID = uniqueID
            });

            TestHelper.VerifyHeaderWasSent("x-ms-client-request-id", uniqueID, AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);

            act = () => container.EndExists(container.BeginExists(null, new OperationContext()
            {
                ClientRequestID = uniqueID
            }, null, null));

            TestHelper.VerifyHeaderWasSent("x-ms-client-request-id", uniqueID, AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);

#if TASK
            act = () => container.ExistsAsync(null, new OperationContext()
            {
                ClientRequestID = uniqueID
            }).Wait();

            TestHelper.VerifyHeaderWasSent("x-ms-client-request-id", uniqueID, AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);
#endif
        }
        public void CloudBlockBlobDownloadRangeToStreamAPMRetry()
        {
            byte[]             buffer    = GetRandomBuffer(1 * 1024 * 1024);
            int                offset    = 1024;
            CloudBlobContainer container = GetRandomContainerReference();

            try
            {
                container.Create();

                CloudBlockBlob blob = container.GetBlockBlobReference("blob1");
                using (MemoryStream originalBlob = new MemoryStream(buffer))
                {
                    using (AutoResetEvent waitHandle = new AutoResetEvent(false))
                    {
                        ICancellableAsyncResult result = blob.BeginUploadFromStream(originalBlob,
                                                                                    ar => waitHandle.Set(),
                                                                                    null);
                        waitHandle.WaitOne();
                        blob.EndUploadFromStream(result);
                    }
                }

                using (MemoryStream originalBlob = new MemoryStream())
                {
                    originalBlob.Write(buffer, offset, buffer.Length - offset);

                    using (AutoResetEvent waitHandle = new AutoResetEvent(false))
                    {
                        Exception manglerEx = null;
                        using (HttpMangler proxy = new HttpMangler(false,
                                                                   new[]
                        {
                            TamperBehaviors.TamperNRequestsIf(
                                session => ThreadPool.QueueUserWorkItem(state =>
                            {
                                Thread.Sleep(1000);
                                try
                                {
                                    session.Abort();
                                }
                                catch (Exception e)
                                {
                                    manglerEx = e;
                                }
                            }),
                                2,
                                AzureStorageSelectors.BlobTraffic().IfHostNameContains(container.ServiceClient.Credentials.AccountName))
                        }))
                        {
                            foreach (var options in new[]
                            {
                                new BlobRequestOptions()
                                {
                                    ChecksumOptions =
                                        new ChecksumOptions
                                    {
                                        UseTransactionalMD5 = true,
                                        UseTransactionalCRC64 = false
                                    }
                                },
                                new BlobRequestOptions()
                                {
                                    ChecksumOptions =
                                        new ChecksumOptions
                                    {
                                        UseTransactionalMD5 = false,
                                        UseTransactionalCRC64 = true
                                    }
                                }
                            })
                            {
                                using (MemoryStream downloadedBlob = new MemoryStream())
                                {
                                    OperationContext operationContext = new OperationContext();

                                    ICancellableAsyncResult result = blob.BeginDownloadRangeToStream(downloadedBlob, offset, buffer.Length - offset, null, options, operationContext,
                                                                                                     ar => waitHandle.Set(),
                                                                                                     null);
                                    waitHandle.WaitOne();
                                    blob.EndDownloadToStream(result);
                                    TestHelper.AssertStreamsAreEqual(originalBlob, downloadedBlob);

                                    if (manglerEx != null)
                                    {
                                        throw manglerEx;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            finally
            {
                container.DeleteIfExists();
            }
        }
        public void CloudBlobContainerSetMetadataAPMCancel()
        {
            CloudBlobContainer container = GetRandomContainerReference();

            try
            {
                container.Create();
                container.Metadata.Add("key1", "value1");

                TestHelper.ExecuteAPMMethodWithCancellation(4000,
                                                            new[] { DelayBehaviors.DelayAllRequestsIf(4000 * 3, AzureStorageSelectors.BlobTraffic().IfHostNameContains(container.ServiceClient.Credentials.AccountName)) },
                                                            (options, opContext, callback, state) => container.BeginSetMetadata(null, (BlobRequestOptions)options, opContext, callback, state),
                                                            container.EndSetMetadata);
            }
            finally
            {
                container.DeleteIfExists();
            }
        }
        public void OpContextTestUserHeadersOnBlob()
        {
            CloudBlobClient    blobClient = GenerateCloudBlobClient();
            CloudBlobContainer container  = blobClient.GetContainerReference("test");

            string uniqueID = Guid.NewGuid().ToString();

            OperationContext ctx = new OperationContext();

            ctx.UserHeaders = new Dictionary <string, string>();
            ctx.UserHeaders.Add("foo", "bar");

            Action act = () => container.Exists(null, ctx);

            TestHelper.VerifyHeaderWasSent(ctx.UserHeaders.Keys.First(), ctx.UserHeaders[ctx.UserHeaders.Keys.First()], AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);

            act = () => container.EndExists(container.BeginExists(null, ctx, null, null));

            TestHelper.VerifyHeaderWasSent(ctx.UserHeaders.Keys.First(), ctx.UserHeaders[ctx.UserHeaders.Keys.First()], AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);

#if TASK
            act = () => container.ExistsAsync(null, ctx).Wait();

            TestHelper.VerifyHeaderWasSent(ctx.UserHeaders.Keys.First(), ctx.UserHeaders[ctx.UserHeaders.Keys.First()], AzureStorageSelectors.BlobTraffic().IfHostNameContains(blobClient.Credentials.AccountName), act);
#endif
        }