From f6f26172018e9c682133ea061669c288712e90f0 Mon Sep 17 00:00:00 2001 From: JinmingHu Date: Fri, 18 Aug 2023 11:58:31 +0800 Subject: [PATCH] Add some test cases for blob service (#4890) --- .../src/test_proxy_manager.cpp | 1 + sdk/storage/assets.json | 2 +- .../test/ut/blob_container_client_test.cpp | 91 +++++++++++++++---- .../test/ut/blob_container_client_test.hpp | 9 ++ .../test/ut/block_blob_client_test.cpp | 79 ++++++++++------ 5 files changed, 137 insertions(+), 45 deletions(-) diff --git a/sdk/core/azure-core-test/src/test_proxy_manager.cpp b/sdk/core/azure-core-test/src/test_proxy_manager.cpp index d81f800fb..4359e3ff7 100644 --- a/sdk/core/azure-core-test/src/test_proxy_manager.cpp +++ b/sdk/core/azure-core-test/src/test_proxy_manager.cpp @@ -280,6 +280,7 @@ void TestProxyManager::SetProxySanitizer() "x-ms-file-creation-time", "x-ms-file-last-write-time", "x-ms-rename-source", + "x-ms-immutability-policy-until-date", }; const std::vector ignoreQueryParameters = { "st", diff --git a/sdk/storage/assets.json b/sdk/storage/assets.json index 48de29a0a..91f9dd5f1 100644 --- a/sdk/storage/assets.json +++ b/sdk/storage/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "cpp", "TagPrefix": "cpp/storage", - "Tag": "cpp/storage_bc6afdd1c4" + "Tag": "cpp/storage_4491a2739b" } diff --git a/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.cpp b/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.cpp index 750abfc74..8ad6a7409 100644 --- a/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.cpp @@ -77,14 +77,14 @@ namespace Azure { namespace Storage { namespace Test { } Blobs::Models::BlobItem BlobContainerClientTest::GetBlobItem( + const Blobs::BlobContainerClient& containerClient, const std::string& blobName, Blobs::Models::ListBlobsIncludeFlags include) { Blobs::ListBlobsOptions options; options.Prefix = blobName; options.Include = include; - for (auto page = m_blobContainerClient->ListBlobs(options); page.HasPage(); - page.MoveToNextPage()) + for (auto page = containerClient.ListBlobs(options); page.HasPage(); page.MoveToNextPage()) { for (auto& blob : page.Blobs) { @@ -572,21 +572,10 @@ namespace Azure { namespace Storage { namespace Test { auto appendBlobClient = containerClient2.GetAppendBlobClient(blobName); auto blobContentInfo = appendBlobClient.Create(); { - Blobs::ListBlobsOptions listOptions; - listOptions.Prefix = blobName; - for (auto page = containerClient2.ListBlobs(listOptions); page.HasPage(); - page.MoveToNextPage()) - { - for (auto& blob : page.Blobs) - { - if (blob.Name == blobName) - { - EXPECT_TRUE(blob.Details.IsServerEncrypted); - EXPECT_TRUE(blob.Details.EncryptionScope.HasValue()); - EXPECT_EQ(blob.Details.EncryptionScope.Value(), testEncryptionScope); - } - } - } + auto blobItem = GetBlobItem(containerClient2, blobName); + EXPECT_TRUE(blobItem.Details.IsServerEncrypted); + EXPECT_TRUE(blobItem.Details.EncryptionScope.HasValue()); + EXPECT_EQ(blobItem.Details.EncryptionScope.Value(), testEncryptionScope); } appendBlobClient.Delete(); EXPECT_TRUE(blobContentInfo.Value.EncryptionScope.HasValue()); @@ -1382,4 +1371,72 @@ namespace Azure { namespace Storage { namespace Test { ASSERT_TRUE(blobItem.HasVersionsOnly.HasValue()); EXPECT_TRUE(blobItem.HasVersionsOnly.Value()); } + + TEST_F(BlobContainerClientTest, ObjectReplication_PLAYBACKONLY_) + { + auto clientOptions = InitStorageClientOptions(); + auto sourceServiceClient = Blobs::BlobServiceClient::CreateFromConnectionString( + StandardStorageConnectionString(), clientOptions); + auto destServiceClient = Blobs::BlobServiceClient::CreateFromConnectionString( + AdlsGen2ConnectionString(), clientOptions); + auto sourceContainerClient = sourceServiceClient.GetBlobContainerClient("src"); + auto destContainerClient = destServiceClient.GetBlobContainerClient("dest"); + + const auto blobName = "1.txt"; + auto sourceBlobClient = sourceContainerClient.GetBlockBlobClient(blobName); + auto destBlobClient = destContainerClient.GetBlockBlobClient(blobName); + + { + auto properties = sourceBlobClient.GetProperties().Value; + EXPECT_FALSE(properties.ObjectReplicationSourceProperties.empty()); + for (const auto& i : properties.ObjectReplicationSourceProperties) + { + EXPECT_FALSE(i.PolicyId.empty()); + EXPECT_FALSE(i.Rules.empty()); + for (const auto& j : i.Rules) + { + EXPECT_FALSE(j.RuleId.empty()); + EXPECT_FALSE(j.ReplicationStatus.ToString().empty()); + } + } + } + { + auto blobItem = GetBlobItem(sourceContainerClient, blobName); + EXPECT_FALSE(blobItem.Details.ObjectReplicationSourceProperties.empty()); + for (const auto& i : blobItem.Details.ObjectReplicationSourceProperties) + { + EXPECT_FALSE(i.PolicyId.empty()); + EXPECT_FALSE(i.Rules.empty()); + for (const auto& j : i.Rules) + { + EXPECT_FALSE(j.RuleId.empty()); + EXPECT_FALSE(j.ReplicationStatus.ToString().empty()); + } + } + } + { + auto downloadResponse = sourceBlobClient.Download().Value; + EXPECT_FALSE(downloadResponse.Details.ObjectReplicationSourceProperties.empty()); + for (const auto& i : downloadResponse.Details.ObjectReplicationSourceProperties) + { + EXPECT_FALSE(i.PolicyId.empty()); + EXPECT_FALSE(i.Rules.empty()); + for (const auto& j : i.Rules) + { + EXPECT_FALSE(j.RuleId.empty()); + EXPECT_FALSE(j.ReplicationStatus.ToString().empty()); + } + } + } + { + auto properties = destBlobClient.GetProperties().Value; + ASSERT_TRUE(properties.ObjectReplicationDestinationPolicyId.HasValue()); + EXPECT_FALSE(properties.ObjectReplicationDestinationPolicyId.Value().empty()); + } + { + auto downloadResponse = destBlobClient.Download().Value; + ASSERT_TRUE(downloadResponse.Details.ObjectReplicationDestinationPolicyId.HasValue()); + EXPECT_FALSE(downloadResponse.Details.ObjectReplicationDestinationPolicyId.Value().empty()); + } + } }}} // namespace Azure::Storage::Test diff --git a/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.hpp b/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.hpp index bfaf5cc74..16aa97083 100644 --- a/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.hpp +++ b/sdk/storage/azure-storage-blobs/test/ut/blob_container_client_test.hpp @@ -16,7 +16,16 @@ namespace Azure { namespace Storage { namespace Test { Blobs::BlobClientOptions clientOptions = Blobs::BlobClientOptions()); std::string GetSas(); + Blobs::Models::BlobItem GetBlobItem( + const std::string& blobName, + Blobs::Models::ListBlobsIncludeFlags include = Blobs::Models::ListBlobsIncludeFlags::None) + { + return GetBlobItem(*m_blobContainerClient, blobName, include); + } + + Blobs::Models::BlobItem GetBlobItem( + const Blobs::BlobContainerClient& containerClient, const std::string& blobName, Blobs::Models::ListBlobsIncludeFlags include = Blobs::Models::ListBlobsIncludeFlags::None); diff --git a/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp b/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp index 16c14959e..5fac79ccc 100644 --- a/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/ut/block_blob_client_test.cpp @@ -23,7 +23,8 @@ namespace Azure { namespace Storage { namespace Blobs { namespace Models { bool operator==(const BlobImmutabilityPolicy& lhs, const BlobImmutabilityPolicy& rhs) { - return lhs.ExpiresOn == rhs.ExpiresOn && lhs.PolicyMode == rhs.PolicyMode; + return lhs.PolicyMode == rhs.PolicyMode + && (lhs.ExpiresOn - rhs.ExpiresOn) <= std::chrono::seconds(1); } }}}} // namespace Azure::Storage::Blobs::Models @@ -135,32 +136,16 @@ namespace Azure { namespace Storage { namespace Test { blobClient.UploadFrom(nullptr, 0); - auto getBlobItem = [&]() { - Blobs::ListBlobsOptions options; - options.Prefix = blobName; - options.Include = Blobs::Models::ListBlobsIncludeFlags::Deleted; - for (auto page = blobContainerClient.ListBlobs(options); page.HasPage(); - page.MoveToNextPage()) - { - for (auto& blob : page.Blobs) - { - if (blob.Name == blobName) - { - return std::move(blob); - } - } - } - std::abort(); - }; - - auto blobItem = getBlobItem(); + auto blobItem + = GetBlobItem(blobContainerClient, blobName, Blobs::Models::ListBlobsIncludeFlags::Deleted); EXPECT_FALSE(blobItem.IsDeleted); EXPECT_FALSE(blobItem.Details.DeletedOn.HasValue()); EXPECT_FALSE(blobItem.Details.RemainingRetentionDays.HasValue()); blobClient.Delete(); - blobItem = getBlobItem(); + blobItem + = GetBlobItem(blobContainerClient, blobName, Blobs::Models::ListBlobsIncludeFlags::Deleted); EXPECT_TRUE(blobItem.IsDeleted); ASSERT_TRUE(blobItem.Details.DeletedOn.HasValue()); EXPECT_TRUE(IsValidTime(blobItem.Details.DeletedOn.Value())); @@ -1166,9 +1151,9 @@ namespace Azure { namespace Storage { namespace Test { } } - TEST_F(BlockBlobClientTest, DISABLED_Immutability) + TEST_F(BlockBlobClientTest, Immutability_PLAYBACKONLY_) { - const auto ImmutabilityMaxLength = std::chrono::seconds(5); + const auto ImmutabilityMaxLength = std::chrono::seconds(30); const std::string blobName = m_blobName; auto blobClient = *m_blockBlobClient; @@ -1222,12 +1207,12 @@ namespace Azure { namespace Storage { namespace Test { EXPECT_EQ(copyDestinationBlobClient.GetProperties().Value.ImmutabilityPolicy.Value(), policy); } - std::this_thread::sleep_for(ImmutabilityMaxLength); + TestSleep(ImmutabilityMaxLength); } - TEST_F(BlockBlobClientTest, DISABLED_ImmutabilityAccessCondition) + TEST_F(BlockBlobClientTest, ImmutabilityAccessCondition_PLAYBACKONLY_) { - const auto ImmutabilityMaxLength = std::chrono::seconds(5); + const auto ImmutabilityMaxLength = std::chrono::seconds(30); auto blobClient = *m_blockBlobClient; std::vector emptyContent; @@ -1249,7 +1234,7 @@ namespace Azure { namespace Storage { namespace Test { options.AccessConditions.IfUnmodifiedSince = timeAfterStr; EXPECT_NO_THROW(blobClient.SetImmutabilityPolicy(policy, options)); - std::this_thread::sleep_for(ImmutabilityMaxLength); + TestSleep(ImmutabilityMaxLength); } TEST_F(BlockBlobClientTest, LegalHold_PLAYBACKONLY_) @@ -2001,4 +1986,44 @@ namespace Azure { namespace Storage { namespace Test { #endif } + TEST_F(BlockBlobClientTest, AbortCopy_PLAYBACKONLY_) + { + const auto sourceContainerName = "container1"; + const auto sourceBlobName = "b1"; + auto clientOptions = InitStorageClientOptions(); + auto sourceServiceClient = Blobs::BlobServiceClient::CreateFromConnectionString( + AdlsGen2ConnectionString(), clientOptions); + auto sourceContainerClient = sourceServiceClient.GetBlobContainerClient(sourceContainerName); + auto sourceBlobClient = sourceContainerClient.GetBlockBlobClient(sourceBlobName); + + auto getSas = [&]() { + Sas::BlobSasBuilder sasBuilder; + auto keyCredential + = _internal::ParseConnectionString(AdlsGen2ConnectionString()).KeyCredential; + sasBuilder.BlobContainerName = sourceContainerName; + sasBuilder.BlobName = sourceBlobName; + sasBuilder.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(60); + sasBuilder.Resource = Sas::BlobSasResource::Blob; + sasBuilder.SetPermissions(Sas::BlobSasPermissions::Read); + auto sasToken = sasBuilder.GenerateSasToken(*keyCredential); + return sasToken; + }; + + auto copyOperation = m_blockBlobClient->StartCopyFromUri(sourceBlobClient.GetUrl() + getSas()); + const auto copyId = copyOperation.GetRawResponse().GetHeaders().at("x-ms-copy-id"); + + auto properties = m_blockBlobClient->GetProperties().Value; + ASSERT_TRUE(properties.CopyStatus.HasValue()); + EXPECT_EQ(properties.CopyStatus.Value(), Blobs::Models::CopyStatus::Pending); + EXPECT_FALSE(properties.CopyProgress.Value().empty()); + + TestSleep(1s); + + auto abortCopyResponse = m_blockBlobClient->AbortCopyFromUri(copyId); + + properties = m_blockBlobClient->GetProperties().Value; + ASSERT_TRUE(properties.CopyStatus.HasValue()); + EXPECT_EQ(properties.CopyStatus.Value(), Blobs::Models::CopyStatus::Aborted); + } + }}} // namespace Azure::Storage::Test