Add some test cases for blob service (#4890)

This commit is contained in:
JinmingHu 2023-08-18 11:58:31 +08:00 committed by GitHub
parent 678d08072b
commit f6f2617201
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 137 additions and 45 deletions

View File

@ -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<std::string> ignoreQueryParameters = {
"st",

View File

@ -2,5 +2,5 @@
"AssetsRepo": "Azure/azure-sdk-assets",
"AssetsRepoPrefixPath": "cpp",
"TagPrefix": "cpp/storage",
"Tag": "cpp/storage_bc6afdd1c4"
"Tag": "cpp/storage_4491a2739b"
}

View File

@ -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<Blobs::BlobClientOptions>();
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

View File

@ -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);

View File

@ -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<uint8_t> 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<Blobs::BlobClientOptions>();
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