diff --git a/google/cloud/storage/client_object_test.cc b/google/cloud/storage/client_object_test.cc index 5c1b0fe06fdca..6307e53b5839e 100644 --- a/google/cloud/storage/client_object_test.cc +++ b/google/cloud/storage/client_object_test.cc @@ -234,64 +234,6 @@ TEST_F(ObjectTest, ReadObject) { EXPECT_EQ(actual.gcount(), 1024); } -TEST_F(ObjectTest, ReadObjectChecksumPrecedence) { - EXPECT_CALL(*mock_, ReadObject) - .WillOnce([](internal::ReadObjectRangeRequest const& r) { - EXPECT_TRUE(r.HasOption()); - EXPECT_FALSE(r.GetOption().value()); - - auto settings = - internal::GetDownloadChecksumSettings(r, CurrentOptions()); - // Verify MD5 is enabled (disable_md5 = false) and CRC32C is disabled - // (disable_crc32c = true) - EXPECT_FALSE(settings.md5); - EXPECT_TRUE(settings.crc32c); - - auto read_source = std::make_unique(); - EXPECT_CALL(*read_source, IsOpen()).WillRepeatedly(Return(true)); - EXPECT_CALL(*read_source, Read) - .WillOnce(Return(internal::ReadSourceResult{1024, {}})); - EXPECT_CALL(*read_source, Close).Times(1); - return StatusOr>( - std::move(read_source)); - }); - auto client = ClientForMock(); - auto actual = client.ReadObject( - "test-bucket-name", "test-object-name", DisableMD5Hash(false), - Options{}.set( - ChecksumAlgorithm::kNone)); - ASSERT_STATUS_OK(actual.status()); - std::vector v(1024); - actual.read(v.data(), v.size()); - EXPECT_EQ(actual.gcount(), 1024); -} - -TEST_F(ObjectTest, InsertObjectChecksumPrecedence) { - EXPECT_CALL(*mock_, InsertObjectMedia) - .WillOnce([](internal::InsertObjectMediaRequest const& r) { - EXPECT_TRUE(r.HasOption()); - EXPECT_TRUE(r.GetOption().value()); - - auto settings = - internal::GetUploadChecksumSettings(r, CurrentOptions()); - // Verify CRC32C is disabled (disable_crc32c = true) and MD5 remains - // enabled (disable_md5 = false) - EXPECT_TRUE(settings.crc32c); - EXPECT_FALSE(settings.md5); - - return make_status_or( - storage::internal::ObjectMetadataParser::FromString( - R"({"name": "test-object-name"})") - .value()); - }); - auto client = ClientForMock(); - auto actual = - client.InsertObject("test-bucket-name", "test-object-name", "payload", - DisableCrc32cChecksum(true), - Options{}.set( - ChecksumAlgorithm::kCrc32cAndMD5)); - ASSERT_STATUS_OK(actual); -} TEST_F(ObjectTest, WriteObject) { EXPECT_CALL(*mock_, CreateResumableUpload) diff --git a/google/cloud/storage/hashing_options.h b/google/cloud/storage/hashing_options.h index d9c26edbc6b8f..946eef3a56a87 100644 --- a/google/cloud/storage/hashing_options.h +++ b/google/cloud/storage/hashing_options.h @@ -61,40 +61,6 @@ inline std::string ComputeMD5Hash(char const* payload) { : absl::string_view{payload}); } -/** - * Disable or enable MD5 Hashing computations. - * - * By default MD5 hashes are disabled. To enable them use the - * `EnableMD5Hash()` helper function. - * - * @warning MD5 hashes are disabled by default, as they are computationally - * expensive, and CRC32C checksums provide enough data integrity protection - * for most applications. Disabling CRC32C checksums while MD5 hashes remain - * disabled exposes your application to data corruption. We recommend that all - * uploads to GCS and downloads from GCS use CRC32C checksums. - * - * @deprecated Use `UploadChecksumValidationOption` and - * `DownloadChecksumValidationOption` instead. - */ -struct [[deprecated( - "Use UploadChecksumValidationOption and DownloadChecksumValidationOption " - "instead")]] DisableMD5Hash - : public internal::ComplexOption { - using ComplexOption::ComplexOption; - // GCC <= 7.0 does not use the inherited default constructor, redeclare it - // explicitly - DisableMD5Hash() : DisableMD5Hash(true) {} - static char const* name() { return "disable-md5-hash"; } -}; - -/** - * Enable MD5 hashes in upload and download operations. - * - * Use this function where the option `DisableMD5Hash` is expected to enable MD5 - * hashes. - */ -inline DisableMD5Hash EnableMD5Hash() { return DisableMD5Hash(false); } - /** * Provide a pre-computed CRC32C checksum value. * @@ -130,32 +96,6 @@ inline std::string ComputeCrc32cChecksum(char const* payload) { : absl::string_view{payload}); } -/** - * Disable CRC32C checksum computations. - * - * By default the GCS client library computes CRC32C checksums in all upload and - * download operations. The application can use this option to disable the - * checksum computation. - * - * @warning MD5 hashes are disabled by default, as they are computationally - * expensive, and CRC32C checksums provide enough data integrity protection - * for most applications. Disabling CRC32C checksums while MD5 hashes remain - * disabled exposes your application to data corruption. We recommend that all - * uploads to GCS and downloads from GCS use CRC32C checksums. - * - * @deprecated Use `UploadChecksumValidationOption` and - * `DownloadChecksumValidationOption` instead. - */ -struct [[deprecated( - "Use UploadChecksumValidationOption and DownloadChecksumValidationOption " - "instead")]] DisableCrc32cChecksum - : public internal::ComplexOption { - using ComplexOption::ComplexOption; - // GCC <= 7.0 does not use the inherited default constructor, redeclare it - // explicitly - DisableCrc32cChecksum() = default; - static char const* name() { return "disable-crc32c-checksum"; } -}; GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END } // namespace storage diff --git a/google/cloud/storage/internal/checksum_helpers.h b/google/cloud/storage/internal/checksum_helpers.h index 9b07d9341aa47..f14b252bf2804 100644 --- a/google/cloud/storage/internal/checksum_helpers.h +++ b/google/cloud/storage/internal/checksum_helpers.h @@ -31,69 +31,31 @@ struct HashDisabled { bool crc32c; }; -template -HashDisabled GetDownloadChecksumSettings(Request const& request, - Options const& options) { - bool disable_md5 = false; +inline HashDisabled GetDownloadChecksumSettings(Options const& options) { + bool disable_md5 = true; bool disable_crc32c = false; - bool use_new_algo = false; if (options.has()) { auto const algo = options.get(); disable_md5 = (algo != ChecksumAlgorithm::kMD5 && algo != ChecksumAlgorithm::kCrc32cAndMD5); disable_crc32c = (algo != ChecksumAlgorithm::kCrc32c && algo != ChecksumAlgorithm::kCrc32cAndMD5); - use_new_algo = true; } - auto const md5 = request.template GetOption(); - if (md5.has_value()) { - // DisableMD5Hash defaults to true. We only override the new option if the - // legacy option was explicitly set to false, or if the new option was not - // provided at all. - if (!use_new_algo || md5.value() != true) { - disable_md5 = md5.value(); - } - } - auto const crc32c = request.template GetOption(); - if (crc32c.has_value()) { - // DisableCrc32cChecksum defaults to std::nullopt, so if it has a value, it - // was explicitly set. - disable_crc32c = crc32c.value(); - } return {disable_md5, disable_crc32c}; } -template -HashDisabled GetUploadChecksumSettings(Request const& request, - Options const& options) { - bool disable_md5 = false; +inline HashDisabled GetUploadChecksumSettings(Options const& options) { + bool disable_md5 = true; bool disable_crc32c = false; - bool use_new_algo = false; if (options.has()) { auto const algo = options.get(); disable_md5 = (algo != ChecksumAlgorithm::kMD5 && algo != ChecksumAlgorithm::kCrc32cAndMD5); disable_crc32c = (algo != ChecksumAlgorithm::kCrc32c && algo != ChecksumAlgorithm::kCrc32cAndMD5); - use_new_algo = true; } - auto const md5 = request.template GetOption(); - if (md5.has_value()) { - // DisableMD5Hash defaults to true. We only override the new option if the - // legacy option was explicitly set to false, or if the new option was not - // provided at all. - if (!use_new_algo || md5.value() != true) { - disable_md5 = md5.value(); - } - } - auto const crc32c = request.template GetOption(); - if (crc32c.has_value()) { - // DisableCrc32cChecksum defaults to std::nullopt, so if it has a value, it - // was explicitly set. - disable_crc32c = crc32c.value(); - } return {disable_md5, disable_crc32c}; } diff --git a/google/cloud/storage/internal/connection_impl.cc b/google/cloud/storage/internal/connection_impl.cc index 4e51345c18893..b80276f0f1850 100644 --- a/google/cloud/storage/internal/connection_impl.cc +++ b/google/cloud/storage/internal/connection_impl.cc @@ -814,7 +814,7 @@ This is often a problem because: preserve data integrity. Consider using UploadLimit option or Client::WriteObject(). You may also need to disable data -integrity checks using the DisableMD5Hash() and DisableCrc32cChecksum() options. +integrity checks using the UploadChecksumValidationOption() option. )"""; } else { std::error_code size_err; diff --git a/google/cloud/storage/internal/grpc/stub.cc b/google/cloud/storage/internal/grpc/stub.cc index 086da25985fed..15e33f2dc20e6 100644 --- a/google/cloud/storage/internal/grpc/stub.cc +++ b/google/cloud/storage/internal/grpc/stub.cc @@ -349,12 +349,10 @@ StatusOr GrpcStub::InsertObjectMedia( auto stream = stub_->WriteObject(std::move(ctx), options); auto const settings = - storage::internal::GetUploadChecksumSettings(request, options); - auto disable_md5 = storage::DisableMD5Hash(settings.md5); - auto disable_crc32c = storage::DisableCrc32cChecksum(settings.crc32c); + storage::internal::GetUploadChecksumSettings(options); auto hash_function = storage::internal::CreateHashFunction( - request.GetOption(), disable_crc32c, - request.GetOption(), disable_md5); + request.GetOption(), settings.crc32c, + request.GetOption(), settings.md5); auto splitter = SplitObjectWriteData(request.payload()); std::int64_t offset = 0; diff --git a/google/cloud/storage/internal/hash_function.cc b/google/cloud/storage/internal/hash_function.cc index fdaf3f1782a27..640874b658347 100644 --- a/google/cloud/storage/internal/hash_function.cc +++ b/google/cloud/storage/internal/hash_function.cc @@ -29,15 +29,14 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN namespace internal { std::unique_ptr CreateHashFunction( - Crc32cChecksumValue const& crc32c_value, - DisableCrc32cChecksum const& crc32c_disabled, MD5HashValue const& md5_value, - DisableMD5Hash const& md5_disabled) { + Crc32cChecksumValue const& crc32c_value, bool disable_crc32c, + MD5HashValue const& md5_value, bool disable_md5) { auto crc32c = std::unique_ptr(); auto crc32c_v = crc32c_value.value_or(""); if (!crc32c_v.empty()) { crc32c = std::make_unique( HashValues{/*.crc32c=*/std::move(crc32c_v), /*md5=*/{}}); - } else if (!crc32c_disabled.value_or(false)) { + } else if (!disable_crc32c) { crc32c = std::make_unique(); } @@ -46,7 +45,7 @@ std::unique_ptr CreateHashFunction( if (!md5_v.empty()) { md5 = std::make_unique( HashValues{/*.crc32c=*/{}, /*.md5=*/std::move(md5_v)}); - } else if (!md5_disabled.value_or(false)) { + } else if (!disable_md5) { md5 = MD5HashFunction::Create(); } @@ -65,8 +64,7 @@ std::unique_ptr CreateHashFunction( ReadObjectRangeRequest const& request) { if (request.RequiresRangeHeader()) return CreateNullHashFunction(); - auto const settings = GetDownloadChecksumSettings( - request, google::cloud::internal::CurrentOptions()); + auto const settings = GetDownloadChecksumSettings(google::cloud::internal::CurrentOptions()); auto const disable_md5 = settings.md5; auto const disable_crc32c = settings.crc32c; if (disable_md5 && disable_crc32c) { @@ -86,13 +84,10 @@ std::unique_ptr CreateHashFunction( return CreateNullHashFunction(); } - auto const settings = GetUploadChecksumSettings( - request, google::cloud::internal::CurrentOptions()); - auto disable_md5 = DisableMD5Hash(settings.md5); - auto disable_crc32c = DisableCrc32cChecksum(settings.crc32c); + auto const settings = GetUploadChecksumSettings(google::cloud::internal::CurrentOptions()); return CreateHashFunction(request.GetOption(), - disable_crc32c, request.GetOption(), - disable_md5); + settings.crc32c, request.GetOption(), + settings.md5); } } // namespace internal diff --git a/google/cloud/storage/internal/hash_function.h b/google/cloud/storage/internal/hash_function.h index a8c7819f4352f..7d6e77de41f6c 100644 --- a/google/cloud/storage/internal/hash_function.h +++ b/google/cloud/storage/internal/hash_function.h @@ -94,9 +94,8 @@ class HashFunction { /// Create a hash function configured by several options. std::unique_ptr CreateHashFunction( - Crc32cChecksumValue const& crc32c_value, - DisableCrc32cChecksum const& crc32c_disabled, MD5HashValue const& md5_value, - DisableMD5Hash const& md5_disabled); + Crc32cChecksumValue const& crc32c_value, bool disable_crc32c, + MD5HashValue const& md5_value, bool disable_md5); /// Create a no-op hash function std::unique_ptr CreateNullHashFunction(); diff --git a/google/cloud/storage/internal/hash_function_impl_test.cc b/google/cloud/storage/internal/hash_function_impl_test.cc index 0d4949019be27..6229bf4186c9f 100644 --- a/google/cloud/storage/internal/hash_function_impl_test.cc +++ b/google/cloud/storage/internal/hash_function_impl_test.cc @@ -378,22 +378,19 @@ TEST(HashFunctionImplTest, CreateHashFunctionRead) { struct Test { std::string crc32c_expected; std::string md5_expected; - DisableCrc32cChecksum crc32_disabled; - DisableMD5Hash md5_disabled; + ChecksumAlgorithm validation_algo; } cases[]{ - {"", "", DisableCrc32cChecksum(true), DisableMD5Hash(true)}, - {"", kQuickFoxMD5Hash, DisableCrc32cChecksum(true), - DisableMD5Hash(false)}, - {kQuickFoxCrc32cChecksum, "", DisableCrc32cChecksum(false), - DisableMD5Hash(true)}, - {kQuickFoxCrc32cChecksum, kQuickFoxMD5Hash, DisableCrc32cChecksum(false), - DisableMD5Hash(false)}, + {"", "", ChecksumAlgorithm::kNone}, + {"", kQuickFoxMD5Hash, ChecksumAlgorithm::kMD5}, + {kQuickFoxCrc32cChecksum, "", ChecksumAlgorithm::kCrc32c}, + {kQuickFoxCrc32cChecksum, kQuickFoxMD5Hash, ChecksumAlgorithm::kCrc32cAndMD5}, }; for (auto const& test : cases) { + google::cloud::internal::OptionsSpan span( + Options{}.set(test.validation_algo)); auto function = CreateHashFunction( - ReadObjectRangeRequest("test-bucket", "test-object") - .set_multiple_options(test.crc32_disabled, test.md5_disabled)); + ReadObjectRangeRequest("test-bucket", "test-object")); function->Update(kQuickFox); auto const actual = std::move(*function).Finish(); EXPECT_EQ(test.crc32c_expected, actual.crc32c); @@ -404,9 +401,9 @@ TEST(HashFunctionImplTest, CreateHashFunctionRead) { struct UploadTest { std::string crc32c_expected; std::string md5_expected; - DisableCrc32cChecksum crc32_disabled; + bool disable_crc32c; Crc32cChecksumValue crc32_value; - DisableMD5Hash md5_disabled; + bool disable_md5; MD5HashValue md5_value; }; @@ -414,10 +411,11 @@ TEST(HashFunctionImplTest, CreateHashFunctionUpload) { auto const upload_cases = testing::UploadHashCases(); for (auto const& test : upload_cases) { + google::cloud::internal::OptionsSpan span( + Options{}.set(test.validation_algo)); auto function = CreateHashFunction( ResumableUploadRequest("test-bucket", "test-object") - .set_multiple_options(test.crc32_disabled, test.crc32_value, - test.md5_disabled, test.md5_value)); + .set_multiple_options(test.crc32_value, test.md5_value)); function->Update(kQuickFox); auto const actual = std::move(*function).Finish(); EXPECT_EQ(test.crc32c_expected, actual.crc32c); @@ -428,9 +426,7 @@ TEST(HashFunctionImplTest, CreateHashFunctionUpload) { TEST(HashFunctionImplTest, CreateHashFunctionUploadResumedSession) { auto function = CreateHashFunction( ResumableUploadRequest("test-bucket", "test-object") - .set_multiple_options(UseResumableUploadSession("test-session-id"), - DisableCrc32cChecksum(false), - DisableMD5Hash(false))); + .set_multiple_options(UseResumableUploadSession("test-session-id"))); function->Update(kQuickFox); auto const actual = std::move(*function).Finish(); EXPECT_THAT(actual.crc32c, IsEmpty()); @@ -441,8 +437,9 @@ TEST(HashFunctionImplTest, CreateHashFunctionInsertObjectMedia) { auto const upload_cases = testing::UploadHashCases(); for (auto const& test : upload_cases) { - auto function = CreateHashFunction(test.crc32_value, test.crc32_disabled, - test.md5_value, test.md5_disabled); + bool disable_crc32c = (test.validation_algo == ChecksumAlgorithm::kNone || test.validation_algo == ChecksumAlgorithm::kMD5); + bool disable_md5 = (test.validation_algo == ChecksumAlgorithm::kNone || test.validation_algo == ChecksumAlgorithm::kCrc32c); + auto function = CreateHashFunction(test.crc32_value, disable_crc32c, test.md5_value, disable_md5); ASSERT_STATUS_OK(function->Update(/*offset=*/0, kQuickFox)); auto const actual = function->Finish(); EXPECT_EQ(test.crc32c_expected, actual.crc32c); diff --git a/google/cloud/storage/internal/hash_validator.cc b/google/cloud/storage/internal/hash_validator.cc index 931e108dca6c7..fcf23c52cf931 100644 --- a/google/cloud/storage/internal/hash_validator.cc +++ b/google/cloud/storage/internal/hash_validator.cc @@ -57,8 +57,7 @@ std::unique_ptr CreateHashValidator( ReadObjectRangeRequest const& request) { if (request.RequiresRangeHeader()) return CreateNullHashValidator(); - auto const settings = GetDownloadChecksumSettings( - request, google::cloud::internal::CurrentOptions()); + auto const settings = GetDownloadChecksumSettings(google::cloud::internal::CurrentOptions()); auto const disable_md5 = settings.md5; auto const disable_crc32c = settings.crc32c; return CreateHashValidator(disable_md5, disable_crc32c); @@ -66,8 +65,7 @@ std::unique_ptr CreateHashValidator( std::unique_ptr CreateHashValidator( ResumableUploadRequest const& request) { - auto const settings = GetUploadChecksumSettings( - request, google::cloud::internal::CurrentOptions()); + auto const settings = GetUploadChecksumSettings(google::cloud::internal::CurrentOptions()); auto const disable_md5 = settings.md5; auto const disable_crc32c = settings.crc32c; return CreateHashValidator(disable_md5, disable_crc32c); diff --git a/google/cloud/storage/internal/hash_validator_test.cc b/google/cloud/storage/internal/hash_validator_test.cc index 212e7f996bfa7..7dc26d5967190 100644 --- a/google/cloud/storage/internal/hash_validator_test.cc +++ b/google/cloud/storage/internal/hash_validator_test.cc @@ -200,22 +200,18 @@ TEST(HashValidatorImplTest, CreateHashFunctionRead) { struct Test { std::string crc32c_expected; std::string md5_expected; - DisableCrc32cChecksum crc32_disabled; - DisableMD5Hash md5_disabled; + ChecksumAlgorithm validation_algo; } cases[]{ - {"", "", DisableCrc32cChecksum(true), DisableMD5Hash(true)}, - {"", kQuickFoxMD5Hash, DisableCrc32cChecksum(true), - DisableMD5Hash(false)}, - {kQuickFoxCrc32cChecksum, "", DisableCrc32cChecksum(false), - DisableMD5Hash(true)}, - {kQuickFoxCrc32cChecksum, kQuickFoxMD5Hash, DisableCrc32cChecksum(false), - DisableMD5Hash(false)}, + {"", "", ChecksumAlgorithm::kNone}, + {"", kQuickFoxMD5Hash, ChecksumAlgorithm::kMD5}, + {kQuickFoxCrc32cChecksum, "", ChecksumAlgorithm::kCrc32c}, + {kQuickFoxCrc32cChecksum, kQuickFoxMD5Hash, ChecksumAlgorithm::kCrc32cAndMD5}, }; for (auto const& test : cases) { - auto request = - ReadObjectRangeRequest("test-bucket", "test-object") - .set_multiple_options(test.crc32_disabled, test.md5_disabled); + google::cloud::internal::OptionsSpan span( + Options{}.set(test.validation_algo)); + auto request = ReadObjectRangeRequest("test-bucket", "test-object"); auto validator = CreateHashValidator(request); auto actual = std::move(*validator).Finish(HashQuick(CreateHashFunction(request))); @@ -228,10 +224,11 @@ TEST(HashValidatorImplTest, CreateHashFunctionUpload) { auto const upload_cases = testing::UploadHashCases(); for (auto const& test : upload_cases) { + google::cloud::internal::OptionsSpan span( + Options{}.set(test.validation_algo)); auto request = ResumableUploadRequest("test-bucket", "test-object") - .set_multiple_options(test.crc32_disabled, test.crc32_value, - test.md5_disabled, test.md5_value); + .set_multiple_options(test.crc32_value, test.md5_value); auto validator = CreateHashValidator(request); auto actual = std::move(*validator).Finish(HashQuick(CreateHashFunction(request))); diff --git a/google/cloud/storage/internal/object_requests.h b/google/cloud/storage/internal/object_requests.h index 532d0dc167d2e..568809d2349ab 100644 --- a/google/cloud/storage/internal/object_requests.h +++ b/google/cloud/storage/internal/object_requests.h @@ -106,7 +106,7 @@ std::ostream& operator<<(std::ostream& os, GetObjectMetadataRequest const& r); template using InsertObjectRequestImpl = GenericObjectRequest< Derived, ContentEncoding, ContentType, Crc32cChecksumValue, - DisableCrc32cChecksum, DisableMD5Hash, EncryptionKey, IfGenerationMatch, + EncryptionKey, IfGenerationMatch, IfGenerationNotMatch, IfMetagenerationMatch, IfMetagenerationNotMatch, KmsKeyName, MD5HashValue, PredefinedAcl, Projection, UserProject, UploadFromOffset, UploadLimit, WithObjectMetadata>; @@ -193,7 +193,7 @@ std::ostream& operator<<(std::ostream& os, CopyObjectRequest const& r); */ class ReadObjectRangeRequest : public GenericObjectRequest< - ReadObjectRangeRequest, DisableCrc32cChecksum, DisableMD5Hash, + ReadObjectRangeRequest, EncryptionKey, Generation, IfGenerationMatch, IfGenerationNotMatch, IfMetagenerationMatch, IfMetagenerationNotMatch, ReadFromOffset, ReadRange, ReadLast, UserProject, AcceptEncoding> { @@ -438,7 +438,7 @@ std::ostream& operator<<(std::ostream& os, RestoreObjectRequest const& r); class ResumableUploadRequest : public GenericObjectRequest< ResumableUploadRequest, ContentEncoding, ContentType, - Crc32cChecksumValue, DisableCrc32cChecksum, DisableMD5Hash, + Crc32cChecksumValue, EncryptionKey, IfGenerationMatch, IfGenerationNotMatch, IfMetagenerationMatch, IfMetagenerationNotMatch, KmsKeyName, MD5HashValue, PredefinedAcl, Projection, UseResumableUploadSession, diff --git a/google/cloud/storage/internal/object_requests_test.cc b/google/cloud/storage/internal/object_requests_test.cc index cf4e893d8293d..e28e9b1bc97e7 100644 --- a/google/cloud/storage/internal/object_requests_test.cc +++ b/google/cloud/storage/internal/object_requests_test.cc @@ -1117,9 +1117,7 @@ TEST(DefaultCtorsWork, Trivial) { EXPECT_FALSE(ReadFromOffset().has_value()); EXPECT_FALSE(ReadLast().has_value()); EXPECT_FALSE(MD5HashValue().has_value()); - EXPECT_TRUE(DisableMD5Hash().has_value()); EXPECT_FALSE(Crc32cChecksumValue().has_value()); - EXPECT_FALSE(DisableCrc32cChecksum().has_value()); EXPECT_FALSE(WithObjectMetadata().has_value()); EXPECT_FALSE(UseResumableUploadSession().has_value()); } diff --git a/google/cloud/storage/internal/object_write_streambuf_test.cc b/google/cloud/storage/internal/object_write_streambuf_test.cc index 1d9854e821eb5..85280c4701355 100644 --- a/google/cloud/storage/internal/object_write_streambuf_test.cc +++ b/google/cloud/storage/internal/object_write_streambuf_test.cc @@ -688,13 +688,12 @@ TEST(ObjectWriteStreambufTest, FlushFinalWithHashes) { }); ResumableUploadRequest request; - request.set_option(DisableCrc32cChecksum(false)); - request.set_option(DisableMD5Hash(false)); + ObjectWriteStreambuf streambuf( std::move(mock), request, "test-only-upload-id", /*committed_size=*/0, std::nullopt, /*max_buffer_size=*/quantum, - CreateHashFunction(Crc32cChecksumValue(), DisableCrc32cChecksum(false), - MD5HashValue(), DisableMD5Hash(false)), + CreateHashFunction(Crc32cChecksumValue(), false, + MD5HashValue(), false), HashValues{}, CreateHashValidator(request), AutoFinalizeConfig::kEnabled); streambuf.sputn(payload.data(), payload.size()); diff --git a/google/cloud/storage/internal/rest/stub.cc b/google/cloud/storage/internal/rest/stub.cc index 983f599e9fd1a..e379b036098c5 100644 --- a/google/cloud/storage/internal/rest/stub.cc +++ b/google/cloud/storage/internal/rest/stub.cc @@ -381,12 +381,10 @@ StatusOr RestStub::InsertObjectMediaMultipart( } auto const settings = - storage::internal::GetUploadChecksumSettings(request, options); - auto disable_md5 = storage::DisableMD5Hash(settings.md5); - auto disable_crc32c = storage::DisableCrc32cChecksum(settings.crc32c); + storage::internal::GetUploadChecksumSettings(options); auto hash_function = storage::internal::CreateHashFunction( - request.GetOption(), disable_crc32c, - request.GetOption(), disable_md5); + request.GetOption(), settings.crc32c, + request.GetOption(), settings.md5); hash_function->Update(/*offset=*/0, request.payload()); auto hashes = hash_function->Finish(); @@ -458,10 +456,9 @@ StatusOr RestStub::InsertObjectMedia( } // If the application has set an explicit hash value we need to use multipart - // uploads. `DisableMD5Hash` and `DisableCrc32cChecksum` should not be - // dependent on each other. + // uploads. auto const settings = - storage::internal::GetUploadChecksumSettings(request, options); + storage::internal::GetUploadChecksumSettings(options); if (!settings.md5 || !settings.crc32c || request.HasOption() || request.HasOption()) { return InsertObjectMediaMultipart(context, options, request); diff --git a/google/cloud/storage/parallel_upload.h b/google/cloud/storage/parallel_upload.h index d5ebb05684a85..e035cd7ee2133 100644 --- a/google/cloud/storage/parallel_upload.h +++ b/google/cloud/storage/parallel_upload.h @@ -700,7 +700,7 @@ NonResumableParallelUploadState::Create(Client client, std::vector streams; auto upload_options = StaticTupleFilter< - Among::TPred>( std::move(options)); @@ -806,8 +806,8 @@ StatusOr ResumableParallelUploadState::CreateNew( auto upload_options = std::tuple_cat( StaticTupleFilter< - Among::TPred>(options), std::make_tuple(UseResumableUploadSession(""))); @@ -865,7 +865,7 @@ StatusOr ResumableParallelUploadState::Resume( } auto read_options = std::tuple_cat( - StaticTupleFilter::TPred>(options), std::make_tuple(IfGenerationMatch(state_and_gen->second))); @@ -916,7 +916,7 @@ StatusOr ResumableParallelUploadState::Resume( std::vector streams; auto upload_options = StaticTupleFilter< - Among::TPred>( std::move(options)); diff --git a/google/cloud/storage/testing/upload_hash_cases.cc b/google/cloud/storage/testing/upload_hash_cases.cc index 808d923b37a76..f1ca5b1574309 100644 --- a/google/cloud/storage/testing/upload_hash_cases.cc +++ b/google/cloud/storage/testing/upload_hash_cases.cc @@ -37,28 +37,28 @@ std::vector UploadHashCases() { return std::vector{ // clang-format off // DisableCrc32c == true, Crc32cChecksumValue == {} and change the MD5 - {"", "", DisableCrc32cChecksum(true), Crc32cChecksumValue(), DisableMD5Hash(true), MD5HashValue()}, - {"", kEmptyStringMD5Hash, DisableCrc32cChecksum(true), Crc32cChecksumValue(), DisableMD5Hash(true), MD5HashValue(kEmptyStringMD5Hash)}, - {"", kQuickFoxMD5Hash, DisableCrc32cChecksum(true), Crc32cChecksumValue(), DisableMD5Hash(false), MD5HashValue()}, - {"", kEmptyStringMD5Hash, DisableCrc32cChecksum(true), Crc32cChecksumValue(), DisableMD5Hash(false), MD5HashValue(kEmptyStringMD5Hash)}, + {"", "", ChecksumAlgorithm::kNone, Crc32cChecksumValue(), MD5HashValue()}, + {"", kEmptyStringMD5Hash, ChecksumAlgorithm::kNone, Crc32cChecksumValue(), MD5HashValue(kEmptyStringMD5Hash)}, + {"", kQuickFoxMD5Hash, ChecksumAlgorithm::kMD5, Crc32cChecksumValue(), MD5HashValue()}, + {"", kEmptyStringMD5Hash, ChecksumAlgorithm::kMD5, Crc32cChecksumValue(), MD5HashValue(kEmptyStringMD5Hash)}, // DisableCrc32c == true, Crc32cChecksumValue == kEmptyStringCrc32cChecksum and change the MD5 - {kEmptyStringCrc32cChecksum, "", DisableCrc32cChecksum(true), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(true), MD5HashValue()}, - {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, DisableCrc32cChecksum(true), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(true), MD5HashValue(kEmptyStringMD5Hash)}, - {kEmptyStringCrc32cChecksum, kQuickFoxMD5Hash, DisableCrc32cChecksum(true), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(false), MD5HashValue()}, - {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, DisableCrc32cChecksum(true), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(false), MD5HashValue(kEmptyStringMD5Hash)}, + {kEmptyStringCrc32cChecksum, "", ChecksumAlgorithm::kNone, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue()}, + {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, ChecksumAlgorithm::kNone, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue(kEmptyStringMD5Hash)}, + {kEmptyStringCrc32cChecksum, kQuickFoxMD5Hash, ChecksumAlgorithm::kMD5, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue()}, + {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, ChecksumAlgorithm::kMD5, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue(kEmptyStringMD5Hash)}, // DisableCrc32c == false, Crc32cChecksumValue == {} and change the MD5 - {kQuickFoxCrc32cChecksum, "", DisableCrc32cChecksum(false), Crc32cChecksumValue(), DisableMD5Hash(true), MD5HashValue()}, - {kQuickFoxCrc32cChecksum, kEmptyStringMD5Hash, DisableCrc32cChecksum(false), Crc32cChecksumValue(), DisableMD5Hash(true), MD5HashValue(kEmptyStringMD5Hash)}, - {kQuickFoxCrc32cChecksum, kQuickFoxMD5Hash, DisableCrc32cChecksum(false), Crc32cChecksumValue(), DisableMD5Hash(false), MD5HashValue()}, - {kQuickFoxCrc32cChecksum, kEmptyStringMD5Hash, DisableCrc32cChecksum(false), Crc32cChecksumValue(), DisableMD5Hash(false), MD5HashValue(kEmptyStringMD5Hash)}, + {kQuickFoxCrc32cChecksum, "", ChecksumAlgorithm::kCrc32c, Crc32cChecksumValue(), MD5HashValue()}, + {kQuickFoxCrc32cChecksum, kEmptyStringMD5Hash, ChecksumAlgorithm::kCrc32c, Crc32cChecksumValue(), MD5HashValue(kEmptyStringMD5Hash)}, + {kQuickFoxCrc32cChecksum, kQuickFoxMD5Hash, ChecksumAlgorithm::kCrc32cAndMD5, Crc32cChecksumValue(), MD5HashValue()}, + {kQuickFoxCrc32cChecksum, kEmptyStringMD5Hash, ChecksumAlgorithm::kCrc32cAndMD5, Crc32cChecksumValue(), MD5HashValue(kEmptyStringMD5Hash)}, // DisableCrc32c == false, Crc32cChecksumValue == kEmptyStringCrc32Checksum and change the MD5 - {kEmptyStringCrc32cChecksum, "", DisableCrc32cChecksum(false), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(true), MD5HashValue()}, - {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, DisableCrc32cChecksum(false), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(true), MD5HashValue(kEmptyStringMD5Hash)}, - {kEmptyStringCrc32cChecksum, kQuickFoxMD5Hash, DisableCrc32cChecksum(false), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(false), MD5HashValue()}, - {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, DisableCrc32cChecksum(false), Crc32cChecksumValue(kEmptyStringCrc32cChecksum), DisableMD5Hash(false), MD5HashValue(kEmptyStringMD5Hash)}, + {kEmptyStringCrc32cChecksum, "", ChecksumAlgorithm::kCrc32c, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue()}, + {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, ChecksumAlgorithm::kCrc32c, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue(kEmptyStringMD5Hash)}, + {kEmptyStringCrc32cChecksum, kQuickFoxMD5Hash, ChecksumAlgorithm::kCrc32cAndMD5, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue()}, + {kEmptyStringCrc32cChecksum, kEmptyStringMD5Hash, ChecksumAlgorithm::kCrc32cAndMD5, Crc32cChecksumValue(kEmptyStringCrc32cChecksum), MD5HashValue(kEmptyStringMD5Hash)}, // clang-format on }; } diff --git a/google/cloud/storage/testing/upload_hash_cases.h b/google/cloud/storage/testing/upload_hash_cases.h index 4b01f8d301642..1bc81389677da 100644 --- a/google/cloud/storage/testing/upload_hash_cases.h +++ b/google/cloud/storage/testing/upload_hash_cases.h @@ -28,9 +28,8 @@ namespace testing { struct UploadHashCase { std::string crc32c_expected; std::string md5_expected; - DisableCrc32cChecksum crc32_disabled; + ChecksumAlgorithm validation_algo; Crc32cChecksumValue crc32_value; - DisableMD5Hash md5_disabled; MD5HashValue md5_value; }; diff --git a/google/cloud/storage/tests/object_checksum_integration_test.cc b/google/cloud/storage/tests/object_checksum_integration_test.cc index edf0e74c6ce51..0c733409a91b6 100644 --- a/google/cloud/storage/tests/object_checksum_integration_test.cc +++ b/google/cloud/storage/tests/object_checksum_integration_test.cc @@ -54,7 +54,7 @@ TEST_F(ObjectChecksumIntegrationTest, InsertObjectDefault) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto meta = client.InsertObject(bucket_name_, object_name, LoremIpsum(), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -64,13 +64,12 @@ TEST_F(ObjectChecksumIntegrationTest, InsertObjectDefault) { } } -/// @test Verify that `DisableCrc32cChecksum(true)` works as expected. +/// @test Verify that `Options{}.set(ChecksumAlgorithm::kMD5)` works as expected. TEST_F(ObjectChecksumIntegrationTest, InsertObjectExplicitDisable) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto meta = client.InsertObject(bucket_name_, object_name, LoremIpsum(), - DisableCrc32cChecksum(true), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kNone), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -80,14 +79,13 @@ TEST_F(ObjectChecksumIntegrationTest, InsertObjectExplicitDisable) { } } -/// @test Verify that `DisableCrc32cChecksum(false)` works as expected. +/// @test Verify that `Options{}.set(ChecksumAlgorithm::kCrc32cAndMD5)` works as expected. TEST_F(ObjectChecksumIntegrationTest, InsertObjectExplicitEnable) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto meta = client.InsertObject(bucket_name_, object_name, LoremIpsum(), - DisableCrc32cChecksum(false), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -104,7 +102,7 @@ TEST_F(ObjectChecksumIntegrationTest, InsertObjectWithValueSuccess) { auto meta = client.InsertObject( bucket_name_, object_name, LoremIpsum(), Crc32cChecksumValue(ComputeCrc32cChecksum(LoremIpsum())), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -122,7 +120,7 @@ TEST_F(ObjectChecksumIntegrationTest, InsertObjectWithValueFailure) { auto object_name = MakeRandomObjectName(); auto failure = client.InsertObject( - bucket_name_, object_name, LoremIpsum(), DisableMD5Hash(true), + bucket_name_, object_name, LoremIpsum(), Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0), Crc32cChecksumValue(ComputeCrc32cChecksum(""))); EXPECT_THAT(failure, Not(IsOk())); } @@ -132,7 +130,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectDefault) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - auto os = client.WriteObject(bucket_name_, object_name, DisableMD5Hash(true), + auto os = client.WriteObject(bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); @@ -158,8 +156,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectExplicitDisable) { auto object_name = MakeRandomObjectName(); auto os = - client.WriteObject(bucket_name_, object_name, DisableCrc32cChecksum(true), - DisableMD5Hash(true), IfGenerationMatch(0)); + client.WriteObject(bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kNone), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -182,8 +179,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectExplicitEnable) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto os = client.WriteObject(bucket_name_, object_name, - DisableCrc32cChecksum(false), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32cAndMD5), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -208,7 +204,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithValueSuccess) { auto os = client.WriteObject( bucket_name_, object_name, Crc32cChecksumValue(ComputeCrc32cChecksum(LoremIpsum())), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -231,7 +227,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithValueFailure) { auto os = client.WriteObject( bucket_name_, object_name, MD5HashValue(ComputeMD5Hash("")), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -250,7 +246,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectReceiveBadChecksum) { // Create a stream to upload an object. ObjectWriteStream stream = client.WriteObject( - bucket_name_, object_name, DisableMD5Hash(true), + bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kCrc32c), CustomHeader("x-goog-emulator-instructions", "inject-upload-data-error"), IfGenerationMatch(0)); stream << LoremIpsum() << "\n"; @@ -271,7 +267,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectUploadBadChecksum) { // Create a stream to upload an object. ObjectWriteStream stream = client.WriteObject( bucket_name_, object_name, Crc32cChecksumValue(ComputeCrc32cChecksum("")), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); stream << LoremIpsum() << "\n"; stream.Close(); EXPECT_TRUE(stream.bad()); @@ -286,8 +282,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithFullChecksumValidation) { auto expected_crc32c = ComputeCrc32cChecksum(content); auto os = client.WriteObject(bucket_name_, object_name, - DisableCrc32cChecksum(false), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32cAndMD5), IfGenerationMatch(0)); os << content; os.Close(); auto meta = os.metadata(); @@ -317,7 +312,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithIncorrectChecksumValue) { auto os = client.WriteObject(bucket_name_, object_name, Crc32cChecksumValue(bad_crc32c), - DisableMD5Hash(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32c), IfGenerationMatch(0)); os << content; os.Close(); @@ -363,7 +358,7 @@ TEST_F(ObjectChecksumIntegrationTest, ReadObjectCorruptedByServerGetc) { ScheduleForDelete(*meta); auto stream = client.ReadObject( - bucket_name_, object_name, DisableMD5Hash(true), + bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kCrc32c), CustomHeader("x-goog-emulator-instructions", "return-corrupted-data")); #if GOOGLE_CLOUD_CPP_HAVE_EXCEPTIONS @@ -403,7 +398,7 @@ TEST_F(ObjectChecksumIntegrationTest, ReadObjectCorruptedByServerRead) { ScheduleForDelete(*meta); auto stream = client.ReadObject( - bucket_name_, object_name, DisableMD5Hash(true), + bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kCrc32c), CustomHeader("x-goog-emulator-instructions", "return-corrupted-data")); // Create a buffer large enough to read the full contents. diff --git a/google/cloud/storage/tests/object_file_integration_test.cc b/google/cloud/storage/tests/object_file_integration_test.cc index 47544f54d1808..f63b79407c6a8 100644 --- a/google/cloud/storage/tests/object_file_integration_test.cc +++ b/google/cloud/storage/tests/object_file_integration_test.cc @@ -302,7 +302,7 @@ TEST_F(ObjectFileIntegrationTest, UploadFileNonRegularWarning) { testing_util::ScopedLog log; StatusOr meta = client.UploadFile(file_name, bucket_name_, object_name, - IfGenerationMatch(0), DisableMD5Hash(true)); + IfGenerationMatch(0), Options{}.set(ChecksumAlgorithm::kCrc32c)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); diff --git a/google/cloud/storage/tests/object_hash_integration_test.cc b/google/cloud/storage/tests/object_hash_integration_test.cc index 351627f65a5f3..fc3dc0d90be2a 100644 --- a/google/cloud/storage/tests/object_hash_integration_test.cc +++ b/google/cloud/storage/tests/object_hash_integration_test.cc @@ -59,7 +59,7 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectDefault) { auto object_name = MakeRandomObjectName(); auto meta = client.InsertObject(bucket_name_, object_name, LoremIpsum(), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -75,8 +75,7 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectExplicitDisable) { auto object_name = MakeRandomObjectName(); auto meta = client.InsertObject( - bucket_name_, object_name, LoremIpsum(), DisableMD5Hash(true), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + bucket_name_, object_name, LoremIpsum(), Options{}.set(ChecksumAlgorithm::kCrc32cAndMD5), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -92,8 +91,7 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectExplicitEnable) { auto object_name = MakeRandomObjectName(); auto meta = client.InsertObject( - bucket_name_, object_name, LoremIpsum(), DisableMD5Hash(false), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + bucket_name_, object_name, LoremIpsum(), Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -110,7 +108,7 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectWithValueSuccess) { auto meta = client.InsertObject(bucket_name_, object_name, LoremIpsum(), MD5HashValue(ComputeMD5Hash(LoremIpsum())), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -131,7 +129,7 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectWithValueFailure) { // This should fail because the MD5 hash value is incorrect. auto failure = client.InsertObject( bucket_name_, object_name, LoremIpsum(), MD5HashValue(ComputeMD5Hash("")), - DisableCrc32cChecksum(false), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kCrc32cAndMD5), IfGenerationMatch(0)); EXPECT_THAT(failure, Not(IsOk())); } @@ -140,7 +138,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectDefault) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto os = - client.WriteObject(bucket_name_, object_name, DisableCrc32cChecksum(true), + client.WriteObject(bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); @@ -161,8 +159,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectExplicitDisable) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto os = - client.WriteObject(bucket_name_, object_name, DisableMD5Hash(true), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + client.WriteObject(bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kNone), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -182,8 +179,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectExplicitEnable) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); auto os = - client.WriteObject(bucket_name_, object_name, DisableMD5Hash(false), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + client.WriteObject(bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -204,7 +200,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectWithValueSuccess) { auto object_name = MakeRandomObjectName(); auto os = client.WriteObject( bucket_name_, object_name, MD5HashValue(ComputeMD5Hash(LoremIpsum())), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -229,7 +225,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectWithValueFailure) { auto object_name = MakeRandomObjectName(); auto os = client.WriteObject( bucket_name_, object_name, MD5HashValue(ComputeMD5Hash("")), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -248,8 +244,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectReceiveBadChecksum) { // Create a stream to upload an object. ObjectWriteStream stream = client.WriteObject( - bucket_name_, object_name, DisableMD5Hash(false), - DisableCrc32cChecksum(true), + bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kMD5), CustomHeader("x-goog-emulator-instructions", "inject-upload-data-error"), IfGenerationMatch(0)); stream << LoremIpsum() << "\n"; @@ -270,7 +265,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectUploadBadChecksum) { // Create a stream to upload an object. ObjectWriteStream stream = client.WriteObject( bucket_name_, object_name, MD5HashValue(ComputeMD5Hash("")), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + Options{}.set(ChecksumAlgorithm::kMD5), IfGenerationMatch(0)); stream << LoremIpsum() << "\n"; stream.Close(); EXPECT_TRUE(stream.bad()); @@ -313,8 +308,7 @@ TEST_F(ObjectHashIntegrationTest, ReadObjectCorruptedByServerGetc) { ScheduleForDelete(*meta); auto stream = client.ReadObject( - bucket_name_, object_name, DisableMD5Hash(false), - DisableCrc32cChecksum(true), + bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kMD5), CustomHeader("x-goog-emulator-instructions", "return-corrupted-data")); #if GOOGLE_CLOUD_CPP_HAVE_EXCEPTIONS @@ -353,8 +347,7 @@ TEST_F(ObjectHashIntegrationTest, ReadObjectCorruptedByServerRead) { ScheduleForDelete(*meta); auto stream = client.ReadObject( - bucket_name_, object_name, DisableMD5Hash(false), - DisableCrc32cChecksum(true), + bucket_name_, object_name, Options{}.set(ChecksumAlgorithm::kMD5), CustomHeader("x-goog-emulator-instructions", "return-corrupted-data")); // Create a buffer large enough to read the full contents. diff --git a/google/cloud/storage/tests/object_insert_integration_test.cc b/google/cloud/storage/tests/object_insert_integration_test.cc index 2b3df34b08fc7..c0830ecc2947c 100644 --- a/google/cloud/storage/tests/object_insert_integration_test.cc +++ b/google/cloud/storage/tests/object_insert_integration_test.cc @@ -91,7 +91,7 @@ TEST_P(ObjectInsertIntegrationTest, SimpleInsertWithNonUrlSafeName) { // Create the object, but only if it does not exist already. StatusOr meta = client.InsertObject( bucket_name_, object_name, expected, IfGenerationMatch(0), - DisableCrc32cChecksum(true), DisableMD5Hash(true)); + Options{}.set(ChecksumAlgorithm::kNone)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); EXPECT_EQ(object_name, meta->name()); @@ -369,7 +369,7 @@ TEST_P(ObjectInsertIntegrationTest, InsertSimpleWithUserIp) { testing_util::ScopedLog log; StatusOr insert_meta = client.InsertObject( bucket_name_, object_name, LoremIpsum(), IfGenerationMatch(0), - DisableCrc32cChecksum(true), DisableMD5Hash(true), UserIp("10.0.0.1")); + Options{}.set(ChecksumAlgorithm::kNone), UserIp("10.0.0.1")); ASSERT_STATUS_OK(insert_meta); ScheduleForDelete(*insert_meta); @@ -440,7 +440,7 @@ TEST_P(ObjectInsertIntegrationTest, InsertSimpleWithUserIpBlank) { testing_util::ScopedLog log; StatusOr insert_meta = client.InsertObject( bucket_name_, object_name, LoremIpsum(), IfGenerationMatch(0), - DisableCrc32cChecksum(true), DisableMD5Hash(true), UserIp("")); + Options{}.set(ChecksumAlgorithm::kNone), UserIp("")); ASSERT_STATUS_OK(insert_meta); ScheduleForDelete(*insert_meta);