|
2 | 2 | // Licensed under the MIT License. |
3 | 3 |
|
4 | 4 | using System; |
| 5 | +using System.IO; |
5 | 6 | using System.Linq; |
6 | 7 | using System.Threading.Tasks; |
7 | 8 | using Azure.Storage.Blobs.Models; |
@@ -52,5 +53,69 @@ public async Task GetBlockListAsync_LongBlock() |
52 | 53 | Assert.AreEqual(bigBlockSize, response.Value.CommittedBlocks.First().SizeLong); |
53 | 54 | Assert.Throws<OverflowException>(() => _ = response.Value.CommittedBlocks.First().Size); // if no overflow then we didn't actually test handling of long lengths |
54 | 55 | } |
| 56 | + |
| 57 | + [Test] |
| 58 | + public async Task CanHandleLongBlockBufferedUpload() |
| 59 | + { |
| 60 | + // Arrange |
| 61 | + const long blockSize = int.MaxValue + 1024L; |
| 62 | + const int numBlocks = 2; |
| 63 | + Stream content = new Storage.Tests.Shared.PredictableStream(numBlocks * blockSize, revealsLength: false); // lack of Stream.Length forces buffered upload |
| 64 | + var blobContainerClient = blobServiceClient.GetBlobContainerClient(Guid.NewGuid().ToString()); |
| 65 | + await blobContainerClient.CreateIfNotExistsAsync(); |
| 66 | + var blobName = Guid.NewGuid().ToString(); |
| 67 | + var blobClient = blobContainerClient.GetBlobClient(blobName); |
| 68 | + |
| 69 | + // Act |
| 70 | + await blobClient.UploadAsync(content, new BlobUploadOptions() |
| 71 | + { |
| 72 | + TransferOptions = new StorageTransferOptions |
| 73 | + { |
| 74 | + InitialTransferSize = 1, |
| 75 | + MaximumTransferSize = blockSize, |
| 76 | + MaximumConcurrency = 1, |
| 77 | + } |
| 78 | + }); |
| 79 | + BlockList blockList = await blobContainerClient.GetBlockBlobClient(blobName).GetBlockListAsync(); |
| 80 | + |
| 81 | + // Assert |
| 82 | + Assert.AreEqual(numBlocks * blockSize, blockList.BlobContentLength); |
| 83 | + Assert.AreEqual(numBlocks, blockList.CommittedBlocks.Count()); |
| 84 | + foreach (var block in blockList.CommittedBlocks) |
| 85 | + { |
| 86 | + Assert.AreEqual(blockSize, block.SizeLong); |
| 87 | + } |
| 88 | + } |
| 89 | + |
| 90 | + [Test] |
| 91 | + public async Task CanHandleLongBlockBufferedUploadInParallel() |
| 92 | + { |
| 93 | + // Arrange |
| 94 | + const long firstBlockSize = int.MaxValue + 1024L; |
| 95 | + const long secondBlockSize = 1024L; |
| 96 | + Stream content = new Storage.Tests.Shared.PredictableStream(firstBlockSize + secondBlockSize, revealsLength: false); // lack of Stream.Length forces buffered upload |
| 97 | + var blobContainerClient = blobServiceClient.GetBlobContainerClient(Guid.NewGuid().ToString()); |
| 98 | + await blobContainerClient.CreateIfNotExistsAsync(); |
| 99 | + var blobName = Guid.NewGuid().ToString(); |
| 100 | + var blobClient = blobContainerClient.GetBlobClient(blobName); |
| 101 | + |
| 102 | + // Act |
| 103 | + await blobClient.UploadAsync(content, new BlobUploadOptions() |
| 104 | + { |
| 105 | + TransferOptions = new StorageTransferOptions |
| 106 | + { |
| 107 | + InitialTransferSize = 1, |
| 108 | + MaximumTransferSize = firstBlockSize, |
| 109 | + MaximumConcurrency = 2, |
| 110 | + } |
| 111 | + }); |
| 112 | + BlockList blockList = await blobContainerClient.GetBlockBlobClient(blobName).GetBlockListAsync(); |
| 113 | + |
| 114 | + // Assert |
| 115 | + Assert.AreEqual(firstBlockSize + secondBlockSize, blockList.BlobContentLength); |
| 116 | + Assert.AreEqual(2, blockList.CommittedBlocks.Count()); |
| 117 | + Assert.AreEqual(firstBlockSize, blockList.CommittedBlocks.ElementAt(0).SizeLong); |
| 118 | + Assert.AreEqual(secondBlockSize, blockList.CommittedBlocks.ElementAt(1).SizeLong); |
| 119 | + } |
55 | 120 | } |
56 | 121 | } |
0 commit comments