@@ -10,6 +10,8 @@ import (
1010 "bytes"
1111 "context"
1212 "crypto/md5"
13+ "io"
14+ "strconv"
1315 "strings"
1416 "testing"
1517
@@ -1441,3 +1443,318 @@ func (s *AppendBlobUnrecordedTestsSuite) TestSetBlobMetadataReturnsVID() {
14411443 _require .Len (blobResp1 .Metadata , 2 )
14421444 }
14431445}
1446+
1447+ func (s * AppendBlobRecordedTestsSuite ) TestAppendBlockWithCPK () {
1448+ _require := require .New (s .T ())
1449+ testName := s .T ().Name ()
1450+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
1451+ _require .NoError (err )
1452+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , testcommon .GenerateContainerName (testName ), svcClient )
1453+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
1454+
1455+ abClient := containerClient .NewAppendBlobClient (testcommon .GenerateBlobName (testName ))
1456+
1457+ createAppendBlobOptions := appendblob.CreateOptions {
1458+ CpkInfo : & testcommon .TestCPKByValue ,
1459+ }
1460+ _ , err = abClient .Create (context .Background (), & createAppendBlobOptions )
1461+ _require .Nil (err )
1462+ // _require.Equal(resp.RawResponse.StatusCode, 201)
1463+
1464+ words := []string {"AAA " , "BBB " , "CCC " }
1465+ for index , word := range words {
1466+ appendBlockOptions := appendblob.AppendBlockOptions {
1467+ CpkInfo : & testcommon .TestCPKByValue ,
1468+ }
1469+ resp , err := abClient .AppendBlock (context .Background (), streaming .NopCloser (strings .NewReader (word )), & appendBlockOptions )
1470+ _require .Nil (err )
1471+ // _require.Equal(resp.RawResponse.StatusCode, 201)
1472+ _require .Equal (* resp .BlobAppendOffset , strconv .Itoa (index * 4 ))
1473+ _require .Equal (* resp .BlobCommittedBlockCount , int32 (index + 1 ))
1474+ _require .NotNil (resp .ETag )
1475+ _require .NotNil (resp .LastModified )
1476+ _require .Equal (resp .LastModified .IsZero (), false )
1477+ _require .NotEqual (resp .ContentMD5 , "" )
1478+
1479+ _require .NotEqual (resp .Version , "" )
1480+ _require .NotNil (resp .Date )
1481+ _require .Equal ((* resp .Date ).IsZero (), false )
1482+ _require .Equal (* resp .IsServerEncrypted , true )
1483+ _require .EqualValues (resp .EncryptionKeySHA256 , testcommon .TestCPKByValue .EncryptionKeySHA256 )
1484+ }
1485+
1486+ // Get blob content without encryption key should fail the request.
1487+ _ , err = abClient .DownloadStream (context .Background (), nil )
1488+ _require .NotNil (err )
1489+
1490+ // Download blob to do data integrity check.
1491+ downloadBlobOptions := blob.DownloadStreamOptions {
1492+ CpkInfo : & testcommon .TestCPKByValue ,
1493+ }
1494+ downloadResp , err := abClient .DownloadStream (context .Background (), & downloadBlobOptions )
1495+ _require .Nil (err )
1496+
1497+ data , err := io .ReadAll (downloadResp .Body )
1498+ _require .Nil (err )
1499+ _require .EqualValues (string (data ), "AAA BBB CCC " )
1500+ _require .EqualValues (* downloadResp .EncryptionKeySHA256 , * testcommon .TestCPKByValue .EncryptionKeySHA256 )
1501+ }
1502+
1503+ func (s * AppendBlobRecordedTestsSuite ) TestAppendBlockWithCPKScope () {
1504+ _require := require .New (s .T ())
1505+ testName := s .T ().Name ()
1506+ svcClient , err := testcommon .GetServiceClient (s .T (), testcommon .TestAccountDefault , nil )
1507+ _require .NoError (err )
1508+ containerClient := testcommon .CreateNewContainer (context .Background (), _require , testcommon .GenerateContainerName (testName ), svcClient )
1509+ defer testcommon .DeleteContainer (context .Background (), _require , containerClient )
1510+
1511+ abClient := containerClient .NewAppendBlobClient (testcommon .GenerateBlobName (testName ))
1512+
1513+ createAppendBlobOptions := appendblob.CreateOptions {
1514+ CpkScopeInfo : & testcommon .TestCPKByScope ,
1515+ }
1516+ _ , err = abClient .Create (context .Background (), & createAppendBlobOptions )
1517+ _require .Nil (err )
1518+ // _require.Equal(resp.RawResponse.StatusCode, 201)
1519+
1520+ words := []string {"AAA " , "BBB " , "CCC " }
1521+ for index , word := range words {
1522+ appendBlockOptions := appendblob.AppendBlockOptions {
1523+ CpkScopeInfo : & testcommon .TestCPKByScope ,
1524+ }
1525+ resp , err := abClient .AppendBlock (context .Background (), streaming .NopCloser (strings .NewReader (word )), & appendBlockOptions )
1526+ _require .Nil (err )
1527+ // _require.Equal(resp.RawResponse.StatusCode, 201)
1528+ _require .Equal (* resp .BlobAppendOffset , strconv .Itoa (index * 4 ))
1529+ _require .Equal (* resp .BlobCommittedBlockCount , int32 (index + 1 ))
1530+ _require .NotNil (resp .ETag )
1531+ _require .NotNil (resp .LastModified )
1532+ _require .Equal (resp .LastModified .IsZero (), false )
1533+ _require .NotEqual (resp .ContentMD5 , "" )
1534+
1535+ _require .NotEqual (resp .Version , "" )
1536+ _require .NotNil (resp .Date )
1537+ _require .Equal ((* resp .Date ).IsZero (), false )
1538+ _require .Equal (* resp .IsServerEncrypted , true )
1539+ _require .EqualValues (resp .EncryptionScope , testcommon .TestCPKByScope .EncryptionScope )
1540+ }
1541+
1542+ // Download blob to do data integrity check.
1543+ downloadBlobOptions := blob.DownloadStreamOptions {
1544+ CpkScopeInfo : & testcommon .TestCPKByScope ,
1545+ }
1546+ downloadResp , err := abClient .DownloadStream (context .Background (), & downloadBlobOptions )
1547+ _require .Nil (err )
1548+
1549+ data , err := io .ReadAll (downloadResp .Body )
1550+ _require .Nil (err )
1551+ _require .EqualValues (string (data ), "AAA BBB CCC " )
1552+ _require .EqualValues (* downloadResp .EncryptionScope , * testcommon .TestCPKByScope .EncryptionScope )
1553+ }
1554+
1555+ //nolint
1556+ //func (s *AppendBlobUnrecordedTestsSuite) TestAppendBlockFromURLWithCPK() {
1557+ // _require := require.New(s.T())
1558+ // testName := s.T().Name()
1559+ // svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil)
1560+ // if err != nil {
1561+ // s.Fail("Unable to fetch service client because " + err.Error())
1562+ // }
1563+ // containerClient := testcommon.CreateNewContainer(context.Background(), _require, testcommon.GenerateContainerName(testName)+"01", svcClient)
1564+ // defer testcommon.DeleteContainer(context.Background(), _require, containerClient)
1565+ //
1566+ // contentSize := 4 * 1024 * 1024 // 4MB
1567+ // r, srcData := getRandomDataAndReader(contentSize)
1568+ // md5Sum := md5.Sum(srcData)
1569+ // contentMD5 := md5Sum[:]
1570+ // ctx := ctx
1571+ // srcABClient := containerClient.NewAppendBlobClient(generateName("src"))
1572+ // destBlob := containerClient.NewAppendBlobClient(generateName("dest"))
1573+ //
1574+ // _, err = srcABClient.Create(ctx, nil)
1575+ // _require.Nil(err)
1576+ // //_require.Equal(cResp1.RawResponse.StatusCode, 201)
1577+ //
1578+ // resp, err := srcABClient.AppendBlock(ctx, streaming.NopCloser(r), nil)
1579+ // _require.Nil(err)
1580+ // // _require.Equal(resp.RawResponse.StatusCode, 201)
1581+ // _require.Equal(*resp.BlobAppendOffset, "0")
1582+ // _require.Equal(*resp.BlobCommittedBlockCount, int32(1))
1583+ // _require.NotNil(resp.ETag)
1584+ // _require.NotNil(resp.LastModified)
1585+ // _require.Equal((*resp.LastModified).IsZero(), false)
1586+ // _require.Nil(resp.ContentMD5)
1587+ // _require.NotNil(resp.RequestID)
1588+ // _require.NotNil(resp.Version)
1589+ // _require.NotNil(resp.Date)
1590+ // _require.Equal((*resp.Date).IsZero(), false)
1591+ //
1592+ // srcBlobParts, _ := NewBlobURLParts(srcABClient.URL())
1593+ //
1594+ // credential, err := getGenericCredential(nil, testcommon.TestAccountDefault)
1595+ // _require.Nil(err)
1596+ // srcBlobParts.SAS, err = BlobSASSignatureValues{
1597+ // Protocol: SASProtocolHTTPS,
1598+ // ExpiryTime: time.Now().UTC().Add(1 * time.Hour),
1599+ // ContainerName: srcBlobParts.ContainerName,
1600+ // BlobName: srcBlobParts.BlobName,
1601+ // Permissions: BlobSASPermissions{Read: true}.String(),
1602+ // }.Sign(credential)
1603+ // if err != nil {
1604+ // s.T().Fatal(err)
1605+ // }
1606+ //
1607+ // srcBlobURLWithSAS := srcBlobParts.URL()
1608+ //
1609+ // createAppendBlobOptions := appendblob.CreateOptions{
1610+ // CpkInfo: &testcommon.TestCPKByValue,
1611+ // }
1612+ // _, err = destBlob.Create(ctx, &createAppendBlobOptions)
1613+ // _require.Nil(err)
1614+ // //_require.Equal(cResp2.RawResponse.StatusCode, 201)
1615+ //
1616+ // offset := int64(0)
1617+ // count := int64(contentSize)
1618+ // appendBlockURLOptions := AppendBlobAppendBlockFromURLOptions{
1619+ // Offset: &offset,
1620+ // Count: &count,
1621+ // CpkInfo: &testcommon.TestCPKByValue,
1622+ // }
1623+ // appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions)
1624+ // _require.Nil(err)
1625+ // //_require.Equal(appendFromURLResp.RawResponse.StatusCode, 201)
1626+ // _require.Equal(*appendFromURLResp.BlobAppendOffset, "0")
1627+ // _require.Equal(*appendFromURLResp.BlobCommittedBlockCount, int32(1))
1628+ // _require.NotNil(appendFromURLResp.ETag)
1629+ // _require.NotNil(appendFromURLResp.LastModified)
1630+ // _require.Equal((*appendFromURLResp.LastModified).IsZero(), false)
1631+ // _require.NotNil(appendFromURLResp.ContentMD5)
1632+ // _require.EqualValues(appendFromURLResp.ContentMD5, contentMD5)
1633+ // _require.NotNil(appendFromURLResp.RequestID)
1634+ // _require.NotNil(appendFromURLResp.Version)
1635+ // _require.NotNil(appendFromURLResp.Date)
1636+ // _require.Equal((*appendFromURLResp.Date).IsZero(), false)
1637+ // _require.Equal(*appendFromURLResp.IsServerEncrypted, true)
1638+ //
1639+ // // Get blob content without encryption key should fail the request.
1640+ // _, err = destBlob.DownloadStream(ctx, nil)
1641+ // _require.NotNil(err)
1642+ //
1643+ // // Download blob to do data integrity check.
1644+ // downloadBlobOptions := blob.downloadWriterAtOptions{
1645+ // CpkInfo: &testcommon.TestInvalidCPKByValue,
1646+ // }
1647+ // _, err = destBlob.DownloadStream(ctx, &downloadBlobOptions)
1648+ // _require.NotNil(err)
1649+ //
1650+ // // Download blob to do data integrity check.
1651+ // downloadBlobOptions = blob.downloadWriterAtOptions{
1652+ // CpkInfo: &testcommon.TestCPKByValue,
1653+ // }
1654+ // downloadResp, err := destBlob.DownloadStream(ctx, &downloadBlobOptions)
1655+ // _require.Nil(err)
1656+ //
1657+ // _require.Equal(*downloadResp.IsServerEncrypted, true)
1658+ // _require.EqualValues(*downloadResp.EncryptionKeySHA256, *testcommon.TestCPKByValue.EncryptionKeySHA256)
1659+ //
1660+ // destData, err := io.ReadAll(downloadResp.BodyReader(&blob.RetryReaderOptions{CpkInfo: &testcommon.TestCPKByValue}))
1661+ // _require.Nil(err)
1662+ // _require.EqualValues(destData, srcData)
1663+ //}
1664+
1665+ //nolint
1666+ //func (s *AppendBlobUnrecordedTestsSuite) TestAppendBlockFromURLWithCPKScope() {
1667+ // _require := require.New(s.T())
1668+ // testName := s.T().Name()
1669+ // svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil)
1670+ // if err != nil {
1671+ // s.Fail("Unable to fetch service client because " + err.Error())
1672+ // }
1673+ // containerClient := testcommon.CreateNewContainer(context.Background(), _require, testcommon.GenerateContainerName(testName)+"01", svcClient)
1674+ // defer testcommon.DeleteContainer(context.Background(), _require, containerClient)
1675+ //
1676+ // contentSize := 4 * 1024 * 1024 // 4MB
1677+ // r, srcData := getRandomDataAndReader(contentSize)
1678+ // md5Sum := md5.Sum(srcData)
1679+ // contentMD5 := md5Sum[:]
1680+ // ctx := ctx
1681+ // srcClient := containerClient.NewAppendBlobClient(generateName("src"))
1682+ // destBlob := containerClient.NewAppendBlobClient(generateName("dest"))
1683+ //
1684+ // _, err = srcClient.Create(ctx, nil)
1685+ // _require.Nil(err)
1686+ // //_require.Equal(cResp1.RawResponse.StatusCode, 201)
1687+ //
1688+ // resp, err := srcClient.AppendBlock(ctx, streaming.NopCloser(r), nil)
1689+ // _require.Nil(err)
1690+ // // _require.Equal(resp.RawResponse.StatusCode, 201)
1691+ // _require.Equal(*resp.BlobAppendOffset, "0")
1692+ // _require.Equal(*resp.BlobCommittedBlockCount, int32(1))
1693+ // _require.NotNil(resp.ETag)
1694+ // _require.NotNil(resp.LastModified)
1695+ // _require.Equal((*resp.LastModified).IsZero(), false)
1696+ // _require.Nil(resp.ContentMD5)
1697+ // _require.NotNil(resp.RequestID)
1698+ // _require.NotNil(resp.Version)
1699+ // _require.NotNil(resp.Date)
1700+ // _require.Equal((*resp.Date).IsZero(), false)
1701+ //
1702+ // srcBlobParts, _ := NewBlobURLParts(srcClient.URL())
1703+ //
1704+ // credential, err := getGenericCredential(nil, testcommon.TestAccountDefault)
1705+ // _require.Nil(err)
1706+ // srcBlobParts.SAS, err = BlobSASSignatureValues{
1707+ // Protocol: SASProtocolHTTPS,
1708+ // ExpiryTime: time.Now().UTC().Add(1 * time.Hour),
1709+ // ContainerName: srcBlobParts.ContainerName,
1710+ // BlobName: srcBlobParts.BlobName,
1711+ // Permissions: BlobSASPermissions{Read: true}.String(),
1712+ // }.Sign(credential)
1713+ // if err != nil {
1714+ // s.T().Fatal(err)
1715+ // }
1716+ //
1717+ // srcBlobURLWithSAS := srcBlobParts.URL()
1718+ //
1719+ // createAppendBlobOptions := appendblob.CreateOptions{
1720+ // CpkScopeInfo: &testcommon.TestCPKByScope,
1721+ // }
1722+ // _, err = destBlob.Create(ctx, &createAppendBlobOptions)
1723+ // _require.Nil(err)
1724+ // //_require.Equal(cResp2.RawResponse.StatusCode, 201)
1725+ //
1726+ // offset := int64(0)
1727+ // count := int64(contentSize)
1728+ // appendBlockURLOptions := AppendBlobAppendBlockFromURLOptions{
1729+ // Offset: &offset,
1730+ // Count: &count,
1731+ // CpkScopeInfo: &testcommon.TestCPKByScope,
1732+ // }
1733+ // appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions)
1734+ // _require.Nil(err)
1735+ // //_require.Equal(appendFromURLResp.RawResponse.StatusCode, 201)
1736+ // _require.Equal(*appendFromURLResp.BlobAppendOffset, "0")
1737+ // _require.Equal(*appendFromURLResp.BlobCommittedBlockCount, int32(1))
1738+ // _require.NotNil(appendFromURLResp.ETag)
1739+ // _require.NotNil(appendFromURLResp.LastModified)
1740+ // _require.Equal((*appendFromURLResp.LastModified).IsZero(), false)
1741+ // _require.NotNil(appendFromURLResp.ContentMD5)
1742+ // _require.EqualValues(appendFromURLResp.ContentMD5, contentMD5)
1743+ // _require.NotNil(appendFromURLResp.RequestID)
1744+ // _require.NotNil(appendFromURLResp.Version)
1745+ // _require.NotNil(appendFromURLResp.Date)
1746+ // _require.Equal((*appendFromURLResp.Date).IsZero(), false)
1747+ // _require.Equal(*appendFromURLResp.IsServerEncrypted, true)
1748+ //
1749+ // downloadBlobOptions := blob.downloadWriterAtOptions{
1750+ // CpkScopeInfo: &testcommon.TestCPKByScope,
1751+ // }
1752+ // downloadResp, err := destBlob.DownloadStream(ctx, &downloadBlobOptions)
1753+ // _require.Nil(err)
1754+ // _require.Equal(*downloadResp.IsServerEncrypted, true)
1755+ // _require.EqualValues(*downloadResp.EncryptionScope, *testcommon.TestCPKByScope.EncryptionScope)
1756+ //
1757+ // destData, err := io.ReadAll(downloadResp.BodyReader(&blob.RetryReaderOptions{CpkInfo: &testcommon.TestCPKByValue}))
1758+ // _require.Nil(err)
1759+ // _require.EqualValues(destData, srcData)
1760+ //}
0 commit comments