@@ -191,6 +191,67 @@ func waitForCopy(_require *require.Assertions, copyBlobClient *blockblob.Client,
191191 }
192192}
193193
194+ func (s * BlobUnrecordedTestsSuite ) TestCopyBlockBlobFromUrlSourceContentMD5 () {
195+ _require := require .New (s .T ())
196+ testName := s .T ().Name ()
197+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
198+ if err != nil {
199+ s .Fail ("Unable to fetch service client because " + err .Error ())
200+ }
201+
202+ containerName := testcommon .GenerateContainerName (testName )
203+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , containerName , svcClient )
204+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
205+
206+ const contentSize = 8 * 1024 // 8 KB
207+ content := make ([]byte , contentSize )
208+ contentMD5 := md5 .Sum (content )
209+ body := bytes .NewReader (content )
210+
211+ srcBlob := containerClient .NewBlockBlobClient ("srcblob" )
212+ destBlob := containerClient .NewBlockBlobClient ("destblob" )
213+
214+ // Prepare source bbClient for copy.
215+ _ , err = srcBlob .Upload (context .Background (), streaming .NopCloser (body ), nil )
216+ _require .Nil (err )
217+
218+ expiryTime , err := time .Parse (time .UnixDate , "Fri Jun 11 20:00:00 UTC 2049" )
219+ _require .Nil (err )
220+
221+ credential , err := testcommon .GetGenericSharedKeyCredential (testcommon .TestAccountDefault )
222+ if err != nil {
223+ s .T ().Fatal ("Couldn't fetch credential because " + err .Error ())
224+ }
225+
226+ // Get source blob url with SAS for StageFromURL.
227+ sasQueryParams , err := sas.AccountSignatureValues {
228+ Protocol : sas .ProtocolHTTPS ,
229+ ExpiryTime : expiryTime ,
230+ Permissions : to .Ptr (sas.AccountPermissions {Read : true , List : true }).String (),
231+ ResourceTypes : to .Ptr (sas.AccountResourceTypes {Container : true , Object : true }).String (),
232+ }.SignWithSharedKey (credential )
233+ _require .Nil (err )
234+
235+ srcBlobParts , _ := blob .ParseURL (srcBlob .URL ())
236+ srcBlobParts .SAS = sasQueryParams
237+ srcBlobURLWithSAS := srcBlobParts .String ()
238+
239+ // Invoke CopyFromURL.
240+ sourceContentMD5 := contentMD5 [:]
241+ resp , err := destBlob .CopyFromURL (context .Background (), srcBlobURLWithSAS , & blob.CopyFromURLOptions {
242+ SourceContentMD5 : sourceContentMD5 ,
243+ })
244+ _require .Nil (err )
245+ _require .EqualValues (resp .ContentMD5 , sourceContentMD5 )
246+
247+ // Provide bad MD5 and make sure the copy fails
248+ _ , badMD5 := testcommon .GetRandomDataAndReader (16 )
249+ resp , err = destBlob .CopyFromURL (context .Background (), srcBlobURLWithSAS , & blob.CopyFromURLOptions {
250+ SourceContentMD5 : badMD5 ,
251+ })
252+ _require .NotNil (err )
253+ }
254+
194255func (s * BlobRecordedTestsSuite ) TestBlobStartCopyDestEmpty () {
195256 _require := require .New (s .T ())
196257 testName := s .T ().Name ()
0 commit comments