@@ -5033,6 +5033,134 @@ func (s *BlockBlobUnrecordedTestsSuite) TestUploadStreamToBlobProperties() {
5033
5033
_require .EqualValues (actualBlobData , blobData )
5034
5034
}
5035
5035
5036
+ func (s * BlockBlobUnrecordedTestsSuite ) TestBlobUploadDownloadStream () {
5037
+ _require := require .New (s .T ())
5038
+ testName := s .T ().Name ()
5039
+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
5040
+ _require .NoError (err )
5041
+
5042
+ blobSize := 11 * 1024 * 1024
5043
+ bufferSize := 2 * 1024 * 1024
5044
+ maxBuffers := 2
5045
+
5046
+ containerName := testcommon .GenerateContainerName (testName )
5047
+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , containerName , svcClient )
5048
+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
5049
+
5050
+ // Set up test blob
5051
+ blobName := testcommon .GenerateBlobName (testName )
5052
+ bbClient := testcommon .GetBlockBlobClient (blobName , containerClient )
5053
+ blobContentReader , blobData := testcommon .GenerateData (blobSize )
5054
+
5055
+ _ , err = bbClient .UploadStream (context .Background (), blobContentReader , & blockblob.UploadStreamOptions {
5056
+ BlockSize : int64 (bufferSize ),
5057
+ Concurrency : maxBuffers ,
5058
+ Metadata : testcommon .BasicMetadata ,
5059
+ Tags : testcommon .BasicBlobTagsMap ,
5060
+ HTTPHeaders : & testcommon .BasicHeaders ,
5061
+ })
5062
+ _require .NoError (err )
5063
+
5064
+ downloadResponse , err := bbClient .DownloadStream (context .Background (), nil )
5065
+ _require .NoError (err )
5066
+
5067
+ bbClient2 := testcommon .GetBlockBlobClient ("blobName2" , containerClient )
5068
+
5069
+ // UploadStream using http.Response.Body as the reader
5070
+ _ , err = bbClient2 .UploadStream (context .Background (), downloadResponse .Body , & blockblob.UploadStreamOptions {
5071
+ BlockSize : int64 (bufferSize ),
5072
+ Concurrency : maxBuffers ,
5073
+ })
5074
+ _require .NoError (err )
5075
+
5076
+ downloadResp2 , err := bbClient2 .DownloadStream (context .Background (), nil )
5077
+ _require .NoError (err )
5078
+
5079
+ // Assert that the content is correct
5080
+ actualBlobData , err := io .ReadAll (downloadResp2 .Body )
5081
+ _require .NoError (err )
5082
+ _require .Equal (len (actualBlobData ), len (blobData ))
5083
+ _require .EqualValues (actualBlobData , blobData )
5084
+ }
5085
+
5086
+ // This test simulates UploadStream and DownloadBuffer methods,
5087
+ // and verifies length and content of file
5088
+ func (s * BlockBlobUnrecordedTestsSuite ) TestBlobUploadStreamDownloadBuffer () {
5089
+ _require := require .New (s .T ())
5090
+ testName := s .T ().Name ()
5091
+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
5092
+ _require .NoError (err )
5093
+
5094
+ containerName := testcommon .GenerateContainerName (testName )
5095
+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , containerName , svcClient )
5096
+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
5097
+
5098
+ const MiB = 1024 * 1024
5099
+ testUploadDownload := func (contentSize int ) {
5100
+ content := make ([]byte , contentSize )
5101
+ _ , _ = rand .Read (content )
5102
+ contentMD5 := md5 .Sum (content )
5103
+ body := streaming .NopCloser (bytes .NewReader (content ))
5104
+
5105
+ srcBlob := containerClient .NewBlockBlobClient ("srcblob" )
5106
+
5107
+ // Prepare source bbClient for copy.
5108
+ _ , err = srcBlob .UploadStream (context .Background (), body , & blockblob.UploadStreamOptions {
5109
+ BlockSize : 4 * MiB ,
5110
+ Concurrency : 5 ,
5111
+ })
5112
+ _require .NoError (err )
5113
+
5114
+ // Download to a buffer and verify contents
5115
+ buff := make ([]byte , contentSize )
5116
+ b := blob.DownloadBufferOptions {
5117
+ BlockSize : 5 * MiB ,
5118
+ Concurrency : 4 ,
5119
+ }
5120
+ n , err := srcBlob .DownloadBuffer (context .Background (), buff , & b )
5121
+ _require .NoError (err )
5122
+ _require .Equal (int64 (contentSize ), n )
5123
+ _require .Equal (contentMD5 , md5 .Sum (buff [:]))
5124
+ }
5125
+
5126
+ testUploadDownload (0 ) // zero byte blob
5127
+ testUploadDownload (5 * MiB )
5128
+ testUploadDownload (20 * MiB )
5129
+ testUploadDownload (199 * MiB )
5130
+ }
5131
+
5132
+ type fakeReader struct {
5133
+ cnt int
5134
+ }
5135
+
5136
+ func (a * fakeReader ) Read (bytes []byte ) (count int , err error ) {
5137
+ if a .cnt < 5 {
5138
+ _ , buf := testcommon .GenerateData (1024 )
5139
+ n := copy (bytes , buf )
5140
+ a .cnt ++
5141
+ return n , nil
5142
+ }
5143
+ return 0 , io .ErrUnexpectedEOF
5144
+ }
5145
+
5146
+ func (s * BlockBlobUnrecordedTestsSuite ) TestBlobUploadStreamUsingCustomReader () {
5147
+ _require := require .New (s .T ())
5148
+ testName := s .T ().Name ()
5149
+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
5150
+ _require .NoError (err )
5151
+
5152
+ containerName := testcommon .GenerateContainerName (testName )
5153
+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , containerName , svcClient )
5154
+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
5155
+
5156
+ bbClient := testcommon .GetBlockBlobClient (testcommon .GenerateBlobName (testName ), containerClient )
5157
+
5158
+ r := & fakeReader {}
5159
+ _ , err = bbClient .UploadStream (context .Background (), r , nil )
5160
+ _require .Error (err )
5161
+ _require .Equal (err , io .ErrUnexpectedEOF )
5162
+ }
5163
+
5036
5164
func (s * BlockBlobRecordedTestsSuite ) TestBlockBlobSetTierOnVersions () {
5037
5165
_require := require .New (s .T ())
5038
5166
testName := s .T ().Name ()
0 commit comments