@@ -11,6 +11,7 @@ import (
1111 "context"
1212 "crypto/md5"
1313 "encoding/binary"
14+ "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
1415 "hash/crc64"
1516 "io"
1617 "math/rand"
@@ -407,6 +408,94 @@ func (s *AppendBlobUnrecordedTestsSuite) TestAppendBlockFromURLWithMD5() {
407408 testcommon .ValidateBlobErrorCode (_require , err , bloberror .MD5Mismatch )
408409}
409410
411+ func (s * AppendBlobRecordedTestsSuite ) TestAppendBlockFromURLCopySourceAuth () {
412+ _require := require .New (s .T ())
413+ testName := s .T ().Name ()
414+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
415+ _require .NoError (err )
416+
417+ // Random seed for data generation
418+ seed := int64 (crc64 .Checksum ([]byte (testName ), shared .CRC64Table ))
419+ random := rand .New (rand .NewSource (seed ))
420+
421+ // Getting AAD Authentication
422+ cred , err := testcommon .GetGenericTokenCredential ()
423+ _require .NoError (err )
424+
425+ containerName := testcommon .GenerateContainerName (testName )
426+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , containerName , svcClient )
427+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
428+
429+ // Create source and destination blobs
430+ srcABClient := containerClient .NewAppendBlobClient (testcommon .GenerateBlobName ("appendsrc" ))
431+ destABClient := containerClient .NewAppendBlobClient (testcommon .GenerateBlobName ("appenddest" ))
432+
433+ // Upload some data to source
434+ _ , err = srcABClient .Create (context .Background (), nil )
435+ _require .Nil (err )
436+ contentSize := 4 * 1024 // 4KB
437+ r , sourceData := testcommon .GetDataAndReader (random , contentSize )
438+ _ , err = srcABClient .AppendBlock (context .Background (), streaming .NopCloser (r ), nil )
439+ _require .Nil (err )
440+ _ , err = destABClient .Create (context .Background (), nil )
441+ _require .Nil (err )
442+
443+ // Getting token
444+ token , err := cred .GetToken (context .Background (), policy.TokenRequestOptions {Scopes : []string {"https://storage.azure.com/.default" }})
445+ _require .NoError (err )
446+
447+ options := appendblob.AppendBlockFromURLOptions {
448+ CopySourceAuthorization : to .Ptr ("Bearer " + token .Token ),
449+ }
450+
451+ pbResp , err := destABClient .AppendBlockFromURL (context .Background (), srcABClient .URL (), & options )
452+ _require .NoError (err )
453+ _require .NotNil (pbResp )
454+
455+ // Download data from destination
456+ destBuffer := make ([]byte , 4 * 1024 )
457+ _ , err = destABClient .DownloadBuffer (context .Background (), destBuffer , nil )
458+ _require .Nil (err )
459+ _require .Equal (destBuffer , sourceData )
460+ }
461+
462+ func (s * AppendBlobRecordedTestsSuite ) TestAppendBlockFromURLCopySourceAuthNegative () {
463+ _require := require .New (s .T ())
464+ testName := s .T ().Name ()
465+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
466+ _require .NoError (err )
467+
468+ // Random seed for data generation
469+ seed := int64 (crc64 .Checksum ([]byte (testName ), shared .CRC64Table ))
470+ random := rand .New (rand .NewSource (seed ))
471+
472+ containerName := testcommon .GenerateContainerName (testName )
473+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , containerName , svcClient )
474+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
475+
476+ // Create source and destination blobs
477+ srcABClient := containerClient .NewAppendBlobClient (testcommon .GenerateBlobName ("appendsrc" ))
478+ destABClient := containerClient .NewAppendBlobClient (testcommon .GenerateBlobName ("appenddest" ))
479+
480+ // Upload some data to source
481+ _ , err = srcABClient .Create (context .Background (), nil )
482+ _require .Nil (err )
483+ contentSize := 4 * 1024 // 4KB
484+ r , _ := testcommon .GetDataAndReader (random , contentSize )
485+ _ , err = srcABClient .AppendBlock (context .Background (), streaming .NopCloser (r ), nil )
486+ _require .Nil (err )
487+ _ , err = destABClient .Create (context .Background (), nil )
488+ _require .Nil (err )
489+
490+ options := appendblob.AppendBlockFromURLOptions {
491+ CopySourceAuthorization : to .Ptr ("Bearer faketoken" ),
492+ }
493+
494+ _ , err = destABClient .AppendBlockFromURL (context .Background (), srcABClient .URL (), & options )
495+ _require .Error (err )
496+ _require .True (bloberror .HasCode (err , bloberror .CannotVerifyCopySource ))
497+ }
498+
410499func (s * AppendBlobRecordedTestsSuite ) TestBlobCreateAppendMetadataNonEmpty () {
411500 _require := require .New (s .T ())
412501 testName := s .T ().Name ()
0 commit comments