From 98b188330b0d1e983735693ede3545382bf38513 Mon Sep 17 00:00:00 2001 From: JinmingHu Date: Fri, 3 Sep 2021 12:57:50 +0800 Subject: [PATCH] StartsOn and ExpiresOn were changed to nullable (#2828) --- sdk/storage/azure-storage-blobs/CHANGELOG.md | 2 + .../blobs/protocol/blob_rest_client.hpp | 42 ++++++++------ .../test/ut/blob_container_client_test.cpp | 47 +++++++++++----- .../azure-storage-files-datalake/CHANGELOG.md | 2 + .../test/datalake_file_system_client_test.cpp | 56 +++++++++++++------ 5 files changed, 100 insertions(+), 49 deletions(-) diff --git a/sdk/storage/azure-storage-blobs/CHANGELOG.md b/sdk/storage/azure-storage-blobs/CHANGELOG.md index d3f691722..770d63294 100644 --- a/sdk/storage/azure-storage-blobs/CHANGELOG.md +++ b/sdk/storage/azure-storage-blobs/CHANGELOG.md @@ -6,6 +6,8 @@ ### Breaking Changes +- `StartsOn` and `ExpiresOn` in `SignedIdentifier` were changed to nullable. + ### Bugs Fixed ### Other Changes diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp index 209b38e02..a9561c9ab 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp @@ -296,11 +296,11 @@ namespace Azure { namespace Storage { namespace Blobs { /** * Date and time since when this policy is active. */ - Azure::DateTime StartsOn; + Azure::Nullable StartsOn; /** * Date and time the policy expires. */ - Azure::DateTime ExpiresOn; + Azure::Nullable ExpiresOn; /** * The permissions for this ACL policy. */ @@ -6527,22 +6527,28 @@ namespace Azure { namespace Storage { namespace Blobs { writer.Write(_internal::XmlNode{_internal::XmlNodeType::Text, std::string(), options.Id}); writer.Write(_internal::XmlNode{_internal::XmlNodeType::EndTag}); writer.Write(_internal::XmlNode{_internal::XmlNodeType::StartTag, "AccessPolicy"}); - writer.Write(_internal::XmlNode{_internal::XmlNodeType::StartTag, "Start"}); - writer.Write(_internal::XmlNode{ - _internal::XmlNodeType::Text, - std::string(), - options.StartsOn.ToString( - Azure::DateTime::DateFormat::Rfc3339, - Azure::DateTime::TimeFractionFormat::AllDigits)}); - writer.Write(_internal::XmlNode{_internal::XmlNodeType::EndTag}); - writer.Write(_internal::XmlNode{_internal::XmlNodeType::StartTag, "Expiry"}); - writer.Write(_internal::XmlNode{ - _internal::XmlNodeType::Text, - std::string(), - options.ExpiresOn.ToString( - Azure::DateTime::DateFormat::Rfc3339, - Azure::DateTime::TimeFractionFormat::AllDigits)}); - writer.Write(_internal::XmlNode{_internal::XmlNodeType::EndTag}); + if (options.StartsOn.HasValue()) + { + writer.Write(_internal::XmlNode{_internal::XmlNodeType::StartTag, "Start"}); + writer.Write(_internal::XmlNode{ + _internal::XmlNodeType::Text, + std::string(), + options.StartsOn.Value().ToString( + Azure::DateTime::DateFormat::Rfc3339, + Azure::DateTime::TimeFractionFormat::AllDigits)}); + writer.Write(_internal::XmlNode{_internal::XmlNodeType::EndTag}); + } + if (options.ExpiresOn.HasValue()) + { + writer.Write(_internal::XmlNode{_internal::XmlNodeType::StartTag, "Expiry"}); + writer.Write(_internal::XmlNode{ + _internal::XmlNodeType::Text, + std::string(), + options.ExpiresOn.Value().ToString( + Azure::DateTime::DateFormat::Rfc3339, + Azure::DateTime::TimeFractionFormat::AllDigits)}); + writer.Write(_internal::XmlNode{_internal::XmlNodeType::EndTag}); + } writer.Write(_internal::XmlNode{_internal::XmlNodeType::StartTag, "Permission"}); writer.Write( _internal::XmlNode{_internal::XmlNodeType::Text, std::string(), options.Permissions}); 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 fbe4d0338..8a9cda752 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 @@ -15,7 +15,10 @@ namespace Azure { namespace Storage { namespace Blobs { namespace Models { bool operator==(const SignedIdentifier& lhs, const SignedIdentifier& rhs) { - return lhs.Id == rhs.Id && lhs.StartsOn == rhs.StartsOn && lhs.ExpiresOn == rhs.ExpiresOn + return lhs.Id == rhs.Id && lhs.StartsOn.HasValue() == rhs.StartsOn.HasValue() + && (!lhs.StartsOn.HasValue() || lhs.StartsOn.Value() == rhs.StartsOn.Value()) + && lhs.ExpiresOn.HasValue() == rhs.ExpiresOn.HasValue() + && (!lhs.ExpiresOn.HasValue() || lhs.ExpiresOn.Value() == rhs.ExpiresOn.Value()) && lhs.Permissions == rhs.Permissions; } @@ -381,18 +384,36 @@ namespace Azure { namespace Storage { namespace Test { Blobs::SetBlobContainerAccessPolicyOptions options; options.AccessType = Blobs::Models::PublicAccessType::Blob; - Blobs::Models::SignedIdentifier identifier; - identifier.Id = RandomString(64); - identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1); - identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1); - identifier.Permissions = "r"; - options.SignedIdentifiers.emplace_back(identifier); - identifier.Id = RandomString(64); - identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(2); - identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(2); - /* cspell:disable-next-line */ - identifier.Permissions = "racwdxlt"; - options.SignedIdentifiers.emplace_back(identifier); + { + Blobs::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1); + identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1); + identifier.Permissions = "r"; + options.SignedIdentifiers.emplace_back(identifier); + } + { + Blobs::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(2); + identifier.ExpiresOn.Reset(); + /* cspell:disable-next-line */ + identifier.Permissions = "racwdxlt"; + options.SignedIdentifiers.emplace_back(identifier); + } + { + Blobs::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.Permissions = "r"; + options.SignedIdentifiers.emplace_back(identifier); + } + { + Blobs::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1); + identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1); + options.SignedIdentifiers.emplace_back(identifier); + } auto ret = container_client.SetAccessPolicy(options); EXPECT_TRUE(ret.Value.ETag.HasValue()); diff --git a/sdk/storage/azure-storage-files-datalake/CHANGELOG.md b/sdk/storage/azure-storage-files-datalake/CHANGELOG.md index 9dc1e9c43..f4238d5c4 100644 --- a/sdk/storage/azure-storage-files-datalake/CHANGELOG.md +++ b/sdk/storage/azure-storage-files-datalake/CHANGELOG.md @@ -6,6 +6,8 @@ ### Breaking Changes +- `StartsOn` and `ExpiresOn` in `SignedIdentifier` were changed to nullable. + ### Bugs Fixed ### Other Changes diff --git a/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp b/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp index 7b34d17b4..dd8de1810 100644 --- a/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp +++ b/sdk/storage/azure-storage-files-datalake/test/datalake_file_system_client_test.cpp @@ -8,6 +8,12 @@ #include #include +namespace Azure { namespace Storage { namespace Blobs { namespace Models { + + bool operator==(const SignedIdentifier& lhs, const SignedIdentifier& rhs); + +}}}} // namespace Azure::Storage::Blobs::Models + namespace Azure { namespace Storage { namespace Test { const size_t PathTestSize = 5; @@ -361,18 +367,36 @@ namespace Azure { namespace Storage { namespace Test { Files::DataLake::SetFileSystemAccessPolicyOptions options; options.AccessType = Files::DataLake::Models::PublicAccessType::Path; - Files::DataLake::Models::SignedIdentifier identifier; - identifier.Id = RandomString(64); - identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1); - identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1); - identifier.Permissions = "r"; - options.SignedIdentifiers.emplace_back(identifier); - identifier.Id = RandomString(64); - identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(2); - identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(2); - /* cspell:disable-next-line */ - identifier.Permissions = "racwdxlt"; - options.SignedIdentifiers.emplace_back(identifier); + { + Files::DataLake::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1); + identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1); + identifier.Permissions = "r"; + options.SignedIdentifiers.emplace_back(identifier); + } + { + Files::DataLake::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(2); + identifier.ExpiresOn.Reset(); + /* cspell:disable-next-line */ + identifier.Permissions = "racwdxlt"; + options.SignedIdentifiers.emplace_back(identifier); + } + { + Files::DataLake::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.Permissions = "r"; + options.SignedIdentifiers.emplace_back(identifier); + } + { + Files::DataLake::Models::SignedIdentifier identifier; + identifier.Id = RandomString(64); + identifier.StartsOn = std::chrono::system_clock::now() - std::chrono::minutes(1); + identifier.ExpiresOn = std::chrono::system_clock::now() + std::chrono::minutes(1); + options.SignedIdentifiers.emplace_back(identifier); + } auto ret = fileSystem.SetAccessPolicy(options); EXPECT_TRUE(ret.Value.ETag.HasValue()); @@ -380,14 +404,10 @@ namespace Azure { namespace Storage { namespace Test { auto ret2 = fileSystem.GetAccessPolicy(); EXPECT_EQ(ret2.Value.AccessType, options.AccessType); + ASSERT_EQ(ret2.Value.SignedIdentifiers.size(), options.SignedIdentifiers.size()); for (size_t i = 0; i < ret2.Value.SignedIdentifiers.size(); ++i) { - EXPECT_EQ(ret2.Value.SignedIdentifiers[i].StartsOn, options.SignedIdentifiers[i].StartsOn); - EXPECT_EQ( - ret2.Value.SignedIdentifiers[i].ExpiresOn, options.SignedIdentifiers[i].ExpiresOn); - EXPECT_EQ(ret2.Value.SignedIdentifiers[i].Id, options.SignedIdentifiers[i].Id); - EXPECT_EQ( - ret2.Value.SignedIdentifiers[i].Permissions, options.SignedIdentifiers[i].Permissions); + EXPECT_EQ(ret2.Value.SignedIdentifiers[i], options.SignedIdentifiers[i]); } options.AccessType = Files::DataLake::Models::PublicAccessType::FileSystem;