public void BlobServiceClientEx_PutSingleBlobSize42Specified_HasPutSingleBlobSizeEqualTo42()
        {
            const int putSingleBlobSizeOverride = 42;
            var client = new BlobServiceClientEx(_accountSettings, putSingleBlobSizeOverride);

            Assert.AreEqual(putSingleBlobSizeOverride, client.MaxSingleBlobUploadSize);
        }
        public void PutBlockBlobIntelligently_DefaultArgsOnly_CreatesBlockBlob()
        {
            var expectedData = Encoding.UTF8.GetBytes("test data");
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            // Tempt it to do it in two uploads by specifying half megabyte
            client.PutBlockBlobIntelligently(expectedData.Length - 5, containerName, blobName, expectedData);

            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            AssertBlockBlobContainsData(containerName, blobName, expectedData);
        }
        public void PutBlockBlobIntelligently_DataSmallerThanMaxSingleUploadSize_CreatesBlockBlobWithOneUpload()
        {
            var expectedData = Encoding.UTF8.GetBytes("test data");
            var expectedDataLength = expectedData.Length;
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            // Tempt it to do it in two uploads by specifying a blocksize smaller than the data length
            var response = client.PutBlockBlobIntelligently(expectedDataLength - 5, containerName, blobName, expectedData);

            AssertBlobOfSingleUpload(expectedData, containerName, blobName);
            AssertIsPutBlockBlobResponse(response);
        }
        public void PutBlockBlobAsList_LargerThanMaxSingleBlobSize_CreatesBlockBlobFromLatestBlocks()
        {
            var expectedData = new byte[MaxIntelligentSingleBlobUploadSizeOverride + 5];
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            client.PutBlockBlobAsList(MaxIntelligentSingleBlobUploadSizeOverride / 2, containerName, blobName, expectedData);

            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            AssertBlockBlobContainsData(containerName, blobName, expectedData);
        }
        public void PutBlockBlobAsList_RequiredArgsOnly_CreatesBlockBlobFromLatestBlocks()
        {
            const string dataPerBlock = "foo";
            var expectedData = Encoding.UTF8.GetBytes(string.Format("{0}{0}{0}", dataPerBlock));
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            client.PutBlockBlobAsList(4, containerName, blobName, expectedData);

            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            AssertBlockBlobContainsData(containerName, blobName, expectedData);
        }
        public void PutBlockBlobAsList_OneByteAtATime_CreatesBlobOfCorrectLength()
        {
            const string dataPerBlock = "foo";
            var expectedData = Encoding.UTF8.GetBytes(string.Format("{0}{0}{0}", dataPerBlock));
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            client.PutBlockBlobAsList(1, containerName, blobName, expectedData);

            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            AssertBlockBlobContainsData(containerName, blobName, expectedData);
        }
        public void PutBlockBlobIntelligently_SingleUploadWithCacheControl_CorrectContentCacheControl()
        {
            var expectedData = new byte[1024];
            const string expectedCacheControl = "ponyfoo";
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            client.PutBlockBlobIntelligently(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                cacheControl: expectedCacheControl);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfSingleUpload(expectedData, containerName, blobName);
            Assert.AreEqual(expectedCacheControl, properties.CacheControl);
        }
        public void PutBlockBlobIntelligently_SingleUploadWithMetadata_CorrectMetadata()
        {
            var expectedData = new byte[1024];
            var expectedMetadata = new Dictionary<string, string>
            {
                {"haikuLine1", "I dreamed I was in"},
                {"haikuLine2", "A long-running endless loop"},
                {"haikuLine3", "And then the next day"}
            };
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            client.PutBlockBlobIntelligently(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                metadata: expectedMetadata);

            var metadata = GetBlobMetadata(containerName, blobName);
            AssertBlobOfSingleUpload(expectedData, containerName, blobName);
            Assert.AreEqual(expectedMetadata, metadata);
        }
        public async void PutBlockBlobAsListAsync_SpecifiedContentMD5_CreatesBlockBlobWithSpecifiedContentMD5()
        {
            var data = Encoding.UTF8.GetBytes("test content");
            var specifiedContentMD5 = Convert.ToBase64String(MD5.Create().ComputeHash(data));
            var containerName = _util.GenerateSampleContainerName(_runId);
            var blobName = _util.GenerateSampleBlobName(_runId);
            _util.CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            await client.PutBlockBlobAsListAsync(4, containerName, blobName, data, contentMD5: specifiedContentMD5);

            var properties = _util.GetBlobProperties(containerName, blobName);
            _util.AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            Assert.AreEqual(specifiedContentMD5, properties.ContentMD5);
        }
        public async void PutBlockBlobIntelligentlyAsync_SingleUploadWithContentEncoding_CorrectContentEncoding()
        {
            const string expectedContentEncoding = "UTF8";
            var expectedData = new byte[1024];
            var containerName = _util.GenerateSampleContainerName(_runId);
            var blobName = _util.GenerateSampleBlobName(_runId);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            _util.CreateContainer(containerName);

            await client.PutBlockBlobIntelligentlyAsync(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentEncoding: expectedContentEncoding);

            var properties = _util.GetBlobProperties(containerName, blobName);
            _util.AssertBlobOfSingleUpload(expectedData, containerName, blobName, MaxIntelligentSingleBlobUploadSizeOverride);
            Assert.AreEqual(expectedContentEncoding, properties.ContentEncoding);
        }
        public async void PutBlockBlobAsListAsync_SpecifiedContentLanguage_CreatesBlockBlobWithSpecifiedContentLanguage()
        {
            var data = Encoding.UTF8.GetBytes("test content");
            const string specifiedContentLanguage = "typeB";
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            await client.PutBlockBlobAsListAsync(4, containerName, blobName, data, contentLanguage: specifiedContentLanguage);
            
            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            Assert.AreEqual(specifiedContentLanguage, properties.ContentLanguage);
        }
        public void PutBlockBlobAsList_SpecifiedMetadata_CreatesBlockBlobWithSpecifiedMetadata()
        {
            var data = Encoding.UTF8.GetBytes("test content");
            var expectedMetadata = new Dictionary<string, string>
            {
                {"haikuLine1", "I dreamed I was in"},
                {"haikuLine2", "A long-running endless loop"},
                {"haikuLine3", "And then the next day"}
            };
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            client.PutBlockBlobAsList(4, containerName, blobName, data, metadata: expectedMetadata);
            
            var gottenMetadata = GetBlobMetadata(containerName, blobName);
            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            Assert.AreEqual(expectedMetadata, gottenMetadata);
        }
        public async void PutBlockBlobIntelligentlyAsync_SingleUploadWithContentLanguage_CorrectContentLanguage()
        {
            const string expectedContentLanguage = "ancient/yiddish";
            var expectedData = new byte[1024];
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            await client.PutBlockBlobIntelligentlyAsync(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentLanguage: expectedContentLanguage);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfSingleUpload(expectedData, containerName, blobName);
            Assert.AreEqual(expectedContentLanguage, properties.ContentLanguage);
        }
        public void PutBlockBlobIntelligently_SingleUploadWithContentEncoding_CorrectContentEncoding()
        {
            const string expectedContentEncoding = "UTF8";
            var expectedData = new byte[1024];
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            client.PutBlockBlobIntelligently(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentEncoding: expectedContentEncoding);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfSingleUpload(expectedData, containerName, blobName);
            Assert.AreEqual(expectedContentEncoding, properties.ContentEncoding);
        }
        public void PutBlockBlobIntelligently_MultipleUploadsWithContentLanguage_CorrectContentLanguage()
        {
            const string expectedContentLanguage = "ancient/yiddish";
            var expectedData = new byte[MaxIntelligentSingleBlobUploadSizeOverride + 5];
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings, MaxIntelligentSingleBlobUploadSizeOverride);
            CreateContainer(containerName);

            client.PutBlockBlobIntelligently(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentLanguage: expectedContentLanguage);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfMultipleUploads(expectedData, containerName, blobName);
            Assert.AreEqual(expectedContentLanguage, properties.ContentLanguage);
        }
        public async void PutBlockBlobIntelligentlyAsync_MultipleUploadsWithMetadata_CorrectMetadata()
        {
            var expectedData = new byte[MaxIntelligentSingleBlobUploadSizeOverride + 5];
            var expectedMetadata = new Dictionary<string, string>
            {
                {"haikuLine1", "I dreamed I was in"},
                {"haikuLine2", "A long-running endless loop"},
                {"haikuLine3", "And then the next day"}
            };
            var containerName = _util.GenerateSampleContainerName(_runId);
            var blobName = _util.GenerateSampleBlobName(_runId);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings, MaxIntelligentSingleBlobUploadSizeOverride);
            _util.CreateContainer(containerName);

            await client.PutBlockBlobIntelligentlyAsync(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                metadata: expectedMetadata);

            var metadata = _util.GetBlobMetadata(containerName, blobName);
            _util.AssertBlobOfMultipleUploads(expectedData, containerName, blobName, MaxIntelligentSingleBlobUploadSizeOverride);
            Assert.AreEqual(expectedMetadata, metadata);
        }
        public void BlobServiceClientEx_DefaultParams_HasDefaultPutSingleBlobSizeEqualToConstant()
        {
            var client = new BlobServiceClientEx(_accountSettings);

            Assert.AreEqual(BlobServiceConstants.MaxSingleBlobUploadSize, client.MaxSingleBlobUploadSize);
        }
        public void PutBlockBlobAsList_BlockSizeLargerThanBlob_CreatesBlobWithoutError()
        {
            var expectedData = new byte[10];
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            client.PutBlockBlobAsList(expectedData.Length * 2, containerName, blobName, expectedData);

            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            AssertBlockBlobContainsData(containerName, blobName, expectedData);
        }
        public void PutBlockBlobAsList_MismatchedContentMD5_CreatesBlockBlobWithSpecifiedContentMD5()
        {
            var data = Encoding.UTF8.GetBytes("test content");
            var badData = Encoding.UTF8.GetBytes("bad content");
            var specifiedMismatchedContentMD5 = Convert.ToBase64String(MD5.Create().ComputeHash(badData));
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            client.PutBlockBlobAsList(4, containerName, blobName, data, contentMD5: specifiedMismatchedContentMD5);
            
            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            Assert.AreEqual(specifiedMismatchedContentMD5, properties.ContentMD5);
        }
        public async void PutBlockBlobIntelligentlyAsync_MultipleUploadsWithContentMD5_CorrectContentMD5()
        {
            var expectedData = new byte[MaxIntelligentSingleBlobUploadSizeOverride + 5];
            var expectedContentMD5 = Convert.ToBase64String(MD5.Create().ComputeHash(expectedData));
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings, MaxIntelligentSingleBlobUploadSizeOverride);
            CreateContainer(containerName);

            await client.PutBlockBlobIntelligentlyAsync(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentMD5: expectedContentMD5);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfMultipleUploads(expectedData, containerName, blobName);
            Assert.AreEqual(expectedContentMD5, properties.ContentMD5);
        }
        public void PutBlockBlobAsList_SpecifiedContentEncoding_CreatesBlockBlobWithSpecifiedContentEncoding()
        {
            var data = Encoding.UTF8.GetBytes("test content");
            const string specifiedContentEncoding = "UTF8";
            var containerName = _util.GenerateSampleContainerName(_runId);
            var blobName = _util.GenerateSampleBlobName(_runId);
            _util.CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            client.PutBlockBlobAsList(4, containerName, blobName, data, contentEncoding: specifiedContentEncoding);

            var properties = _util.GetBlobProperties(containerName, blobName);
            _util.AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            Assert.AreEqual(specifiedContentEncoding, properties.ContentEncoding);
        }
        public void PutBlockBlobAsList_SpecifiedCacheControl_CreatesBlockBlobWithSpecifiedCacheControl()
        {
            var data = Encoding.UTF8.GetBytes("test content");
            const string specifiedCacheControl = "foo";
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            CreateContainer(containerName);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);

            client.PutBlockBlobAsList(4, containerName, blobName, data, cacheControl: specifiedCacheControl);
            
            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobExists(containerName, blobName, BlobType.BlockBlob);
            Assert.AreEqual(specifiedCacheControl, properties.CacheControl);
        }
        public void PutBlockBlobIntelligently_SingleUploadWithContentMD5_CorrectContentMD5()
        {
            var expectedData = new byte[1024];
            var expectedContentMD5 = Convert.ToBase64String(MD5.Create().ComputeHash(expectedData));
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            CreateContainer(containerName);

            client.PutBlockBlobIntelligently(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentMD5: expectedContentMD5);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfSingleUpload(expectedData, containerName, blobName);
            Assert.AreEqual(expectedContentMD5, properties.ContentMD5);
        }
        public async void PutBlockBlobIntelligentlyAsync_DataLargerThanMaxSingleUploadSize_CreatesBlockBlobWithMultipleUploads()
        {
            var expectedData = new byte[MaxIntelligentSingleBlobUploadSizeOverride + 5];
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings, MaxIntelligentSingleBlobUploadSizeOverride);
            CreateContainer(containerName);

            var response = await client.PutBlockBlobIntelligentlyAsync(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData);

            AssertBlobOfMultipleUploads(expectedData, containerName, blobName);
            AssertIsBlockListResponse(response);
        }
        public async void PutBlockBlobIntelligentlyAsync_MultipleUploadsWithCacheControl_CorrectContentCacheControl()
        {
            var expectedData = new byte[MaxIntelligentSingleBlobUploadSizeOverride + 5];
            const string expectedCacheControl = "ponyfoo";
            var containerName = GenerateSampleContainerName();
            var blobName = GenerateSampleBlobName();
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings, MaxIntelligentSingleBlobUploadSizeOverride);
            CreateContainer(containerName);

            await client.PutBlockBlobIntelligentlyAsync(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                cacheControl: expectedCacheControl);

            var properties = GetBlobProperties(containerName, blobName);
            AssertBlobOfMultipleUploads(expectedData, containerName, blobName);
            Assert.AreEqual(expectedCacheControl, properties.CacheControl);
        }
        private void AssertBlockBlobContainsData(string containerName, string blobName, byte[] expectedData)
        {
            var client = new BlobServiceClientEx(AccountSettings);
            var blob = client.GetBlob(containerName, blobName);

            var gottenData = blob.GetDataBytes();

            Assert.AreEqual(expectedData.Length, gottenData.Length);

            // Comparing strings -> MUCH faster than comparing the raw arrays
            // However, bugs out sometimes if the data is too large
            try
            {
                var gottenDataString = Encoding.Unicode.GetString(gottenData);
                var expectedDataString = Encoding.Unicode.GetString(expectedData);

                Assert.AreEqual(gottenDataString, expectedDataString);
            }
            catch
            {
                // Compare raw arrays as last resort...
                // This only happens if the test running process doesn't have enough memory to convert
                Assert.AreEqual(expectedData, gottenData);
            }
        }
        public void PutBlockBlobIntelligently_SingleUploadWithContentType_CorrectContentTypeSet()
        {
            const string expectedContentType = "foo/bar";
            var expectedData = new byte[1024];
            var containerName = _util.GenerateSampleContainerName(_runId);
            var blobName = _util.GenerateSampleBlobName(_runId);
            IBlobServiceClientEx client = new BlobServiceClientEx(AccountSettings);
            _util.CreateContainer(containerName);

            client.PutBlockBlobIntelligently(BlobServiceConstants.MaxSingleBlockUploadSize, containerName, blobName, expectedData,
                contentType: expectedContentType);

            var properties = _util.GetBlobProperties(containerName, blobName);
            _util.AssertBlobOfSingleUpload(expectedData, containerName, blobName, MaxIntelligentSingleBlobUploadSizeOverride);
            Assert.AreEqual(expectedContentType, properties.ContentType);
        }