diff --git a/ci/abi-dumps/google_cloud_cpp_storage.expected.abi.dump.gz b/ci/abi-dumps/google_cloud_cpp_storage.expected.abi.dump.gz index 660326ecb971a..977089a370a9e 100644 Binary files a/ci/abi-dumps/google_cloud_cpp_storage.expected.abi.dump.gz and b/ci/abi-dumps/google_cloud_cpp_storage.expected.abi.dump.gz differ diff --git a/ci/abi-dumps/google_cloud_cpp_storage_grpc.expected.abi.dump.gz b/ci/abi-dumps/google_cloud_cpp_storage_grpc.expected.abi.dump.gz index 6dd6f1d810101..0c19181a6c09c 100644 Binary files a/ci/abi-dumps/google_cloud_cpp_storage_grpc.expected.abi.dump.gz and b/ci/abi-dumps/google_cloud_cpp_storage_grpc.expected.abi.dump.gz differ diff --git a/google/cloud/storage/benchmarks/throughput_experiment.cc b/google/cloud/storage/benchmarks/throughput_experiment.cc index aced424858d18..0401278bb3fb2 100644 --- a/google/cloud/storage/benchmarks/throughput_experiment.cc +++ b/google/cloud/storage/benchmarks/throughput_experiment.cc @@ -63,6 +63,17 @@ std::string ExtractUploadId(std::string v) { return v.substr(pos + std::strlen(kRestField)); } +gcs::ChecksumAlgorithm GetChecksumAlgorithm(bool enable_crc32c, + bool enable_md5) { + if (enable_crc32c && enable_md5) { + throw std::invalid_argument( + "Cannot enable both CRC32C and MD5 checksum validation"); + } + if (enable_crc32c) return gcs::ChecksumAlgorithm::kCrc32c; + if (enable_md5) return gcs::ChecksumAlgorithm::kMD5; + return gcs::ChecksumAlgorithm::kNone; +} + class ResumableUpload : public ThroughputExperiment { public: explicit ResumableUpload(google::cloud::storage::Client client, @@ -80,10 +91,10 @@ class ResumableUpload : public ThroughputExperiment { auto const start = std::chrono::system_clock::now(); auto timer = Timer::PerThread(); - auto writer = - client_.WriteObject(bucket_name, object_name, - gcs::DisableCrc32cChecksum(!config.enable_crc32c), - gcs::DisableMD5Hash(!config.enable_md5)); + auto writer = client_.WriteObject( + bucket_name, object_name, + google::cloud::Options{}.set( + GetChecksumAlgorithm(config.enable_crc32c, config.enable_md5))); auto upload_id = ExtractUploadId(writer.resumable_session_id()); for (std::int64_t offset = 0; offset < config.object_size; offset += config.app_buffer_size) { @@ -151,10 +162,10 @@ class SimpleUpload : public ThroughputExperiment { auto timer = Timer::PerThread(); auto data = absl::string_view{*random_data_}.substr( 0, static_cast(config.object_size)); - auto object_metadata = - client_.InsertObject(bucket_name, object_name, data, - gcs::DisableCrc32cChecksum(!config.enable_crc32c), - gcs::DisableMD5Hash(!config.enable_md5)); + auto object_metadata = client_.InsertObject( + bucket_name, object_name, data, + google::cloud::Options{}.set( + GetChecksumAlgorithm(config.enable_crc32c, config.enable_md5))); auto const usage = timer.Sample(); auto generation = object_metadata ? std::to_string(object_metadata->generation()) @@ -209,10 +220,10 @@ class DownloadObject : public ThroughputExperiment { config.read_range.has_value() ? gcs::ReadRange(offset, offset + config.read_range->second) : gcs::ReadRange(); - auto reader = - client_.ReadObject(bucket_name, object_name, read_range, - gcs::DisableCrc32cChecksum(!config.enable_crc32c), - gcs::DisableMD5Hash(!config.enable_md5)); + auto reader = client_.ReadObject( + bucket_name, object_name, read_range, + google::cloud::Options{}.set( + GetChecksumAlgorithm(config.enable_crc32c, config.enable_md5))); std::int64_t transfer_size = 0; while (!reader.eof() && !reader.bad()) { reader.read(buffer.data(), buffer.size()); diff --git a/google/cloud/storage/client.h b/google/cloud/storage/client.h index 9b62a8be5d088..6d57c52b087a0 100644 --- a/google/cloud/storage/client.h +++ b/google/cloud/storage/client.h @@ -946,8 +946,8 @@ class Client { * @param contents the contents (media) for the new object. * @param options a list of optional query parameters and/or request headers. * Valid types for this operation include `ContentEncoding`, - * `ContentType`, `Crc32cChecksumValue`, `DisableCrc32cChecksum`, - * `DisableMD5Hash`, `EncryptionKey`, `IfGenerationMatch`, + * `ContentType`, `Crc32cChecksumValue`, + * `UploadChecksumValidationOption`, `EncryptionKey`, `IfGenerationMatch`, * `IfGenerationNotMatch`, `IfMetagenerationMatch`, * `IfMetagenerationNotMatch`, `KmsKeyName`, `MD5HashValue`, * `PredefinedAcl`, `Projection`, `UserProject`, and `WithObjectMetadata`. @@ -1176,9 +1176,9 @@ class Client { * @param bucket_name the name of the bucket that contains the object. * @param object_name the name of the object to be read. * @param options a list of optional query parameters and/or request headers. - * Valid types for this operation include `DisableCrc32cChecksum`, - * `DisableMD5Hash`, `EncryptionKey`, `Generation`, `IfGenerationMatch`, - * `IfGenerationNotMatch`, `IfMetagenerationMatch`, + * Valid types for this operation include + * `DownloadChecksumValidationOption`, `EncryptionKey`, `Generation`, + * `IfGenerationMatch`, `IfGenerationNotMatch`, `IfMetagenerationMatch`, * `IfMetagenerationNotMatch`, `ReadFromOffset`, `ReadRange`, `ReadLast`, * `UserProject`, and `AcceptEncoding`. * @@ -1240,7 +1240,7 @@ class Client { * @param object_name the name of the object to be read. * @param options a list of optional query parameters and/or request headers. * Valid types for this operation include `ContentEncoding`, `ContentType`, - * `Crc32cChecksumValue`, `DisableCrc32cChecksum`, `DisableMD5Hash`, + * `Crc32cChecksumValue`, `UploadChecksumValidationOption`, * `EncryptionKey`, `IfGenerationMatch`, `IfGenerationNotMatch`, * `IfMetagenerationMatch`, `IfMetagenerationNotMatch`, `KmsKeyName`, * `MD5HashValue`, `PredefinedAcl`, `Projection`, @@ -1295,7 +1295,7 @@ class Client { * @param object_name the name of the object to be read. * @param options a list of optional query parameters and/or request headers. * Valid types for this operation include `ContentEncoding`, `ContentType`, - * `Crc32cChecksumValue`, `DisableCrc32cChecksum`, `DisableMD5Hash`, + * `Crc32cChecksumValue`, `UploadChecksumValidationOption`, * `EncryptionKey`, `IfGenerationMatch`, `IfGenerationNotMatch`, * `IfMetagenerationMatch`, `IfMetagenerationNotMatch`, `KmsKeyName`, * `MD5HashValue`, `PredefinedAcl`, `Projection`, `UserProject`, diff --git a/google/cloud/storage/client_object_test.cc b/google/cloud/storage/client_object_test.cc index 4e81f53c5cdac..35121d672b361 100644 --- a/google/cloud/storage/client_object_test.cc +++ b/google/cloud/storage/client_object_test.cc @@ -234,120 +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, ReadObjectChecksumPrecedenceDisableMD5) { - EXPECT_CALL(*mock_, ReadObject) - .WillOnce([](internal::ReadObjectRangeRequest const& r) { - EXPECT_TRUE(r.HasOption()); - EXPECT_TRUE(r.GetOption().value()); - - auto settings = - internal::GetDownloadChecksumSettings(r, CurrentOptions()); - // DisableMD5Hash(true) should override ChecksumAlgorithm::kMD5 - EXPECT_TRUE(settings.md5); - EXPECT_TRUE(settings.crc32c); // kMD5 disables 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(true), - Options{}.set(ChecksumAlgorithm::kMD5)); - 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, InsertObjectChecksumPrecedenceEnableCrc32c) { - EXPECT_CALL(*mock_, InsertObjectMedia) - .WillOnce([](internal::InsertObjectMediaRequest const& r) { - EXPECT_TRUE(r.HasOption()); - EXPECT_FALSE(r.GetOption().value()); - - auto settings = - internal::GetUploadChecksumSettings(r, CurrentOptions()); - // DisableCrc32cChecksum(false) should override ChecksumAlgorithm::kNone - EXPECT_FALSE(settings.crc32c); - EXPECT_TRUE(settings.md5); // kNone disables 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(false), - Options{}.set(ChecksumAlgorithm::kNone)); - ASSERT_STATUS_OK(actual); -} - TEST_F(ObjectTest, WriteObject) { EXPECT_CALL(*mock_, CreateResumableUpload) .WillOnce(Return(TransientError())) diff --git a/google/cloud/storage/hashing_options.h b/google/cloud/storage/hashing_options.h index 8b286d6587be0..47e40646fd556 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() = default; - 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,33 +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 } // namespace cloud diff --git a/google/cloud/storage/internal/checksum_helpers.h b/google/cloud/storage/internal/checksum_helpers.h index cbdb05e261e50..7cd00af8fb36c 100644 --- a/google/cloud/storage/internal/checksum_helpers.h +++ b/google/cloud/storage/internal/checksum_helpers.h @@ -31,50 +31,24 @@ struct HashDisabled { bool crc32c; }; -template -HashDisabled GetDownloadChecksumSettings(Request const& request, - Options const& options) { +inline HashDisabled GetDownloadChecksumSettings(Options const& options) { bool disable_md5 = true; bool disable_crc32c = 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); - } - - auto const md5 = request.template GetOption(); - if (md5.has_value()) { - disable_md5 = md5.value(); - } - auto const crc32c = request.template GetOption(); - if (crc32c.has_value()) { - disable_crc32c = crc32c.value(); + disable_md5 = (algo != ChecksumAlgorithm::kMD5); + disable_crc32c = (algo != ChecksumAlgorithm::kCrc32c); } return {disable_md5, disable_crc32c}; } -template -HashDisabled GetUploadChecksumSettings(Request const& request, - Options const& options) { +inline HashDisabled GetUploadChecksumSettings(Options const& options) { bool disable_md5 = true; bool disable_crc32c = 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); - } - - auto const md5 = request.template GetOption(); - if (md5.has_value()) { - disable_md5 = md5.value(); - } - auto const crc32c = request.template GetOption(); - if (crc32c.has_value()) { - disable_crc32c = crc32c.value(); + disable_md5 = (algo != ChecksumAlgorithm::kMD5); + disable_crc32c = (algo != ChecksumAlgorithm::kCrc32c); } return {disable_md5, disable_crc32c}; } diff --git a/google/cloud/storage/internal/checksum_helpers_test.cc b/google/cloud/storage/internal/checksum_helpers_test.cc index 8cdfea963674e..9f6c98ce81df2 100644 --- a/google/cloud/storage/internal/checksum_helpers_test.cc +++ b/google/cloud/storage/internal/checksum_helpers_test.cc @@ -24,155 +24,52 @@ namespace internal { namespace { TEST(ChecksumHelpersTest, DownloadChecksumSettingsDefaults) { - ReadObjectRangeRequest request("bucket", "object"); - auto settings = GetDownloadChecksumSettings(request, Options{}); + auto settings = GetDownloadChecksumSettings(Options{}); EXPECT_TRUE(settings.md5); EXPECT_FALSE(settings.crc32c); } TEST(ChecksumHelpersTest, DownloadChecksumSettingsOnlyNewOptions) { - ReadObjectRangeRequest request("bucket", "object"); auto settings = GetDownloadChecksumSettings( - request, Options{}.set(ChecksumAlgorithm::kMD5)); EXPECT_FALSE(settings.md5); EXPECT_TRUE(settings.crc32c); settings = GetDownloadChecksumSettings( - request, Options{}.set( - ChecksumAlgorithm::kCrc32c)); + Options{}.set( + ChecksumAlgorithm::kCrc32c)); EXPECT_TRUE(settings.md5); EXPECT_FALSE(settings.crc32c); settings = GetDownloadChecksumSettings( - request, Options{}.set( - ChecksumAlgorithm::kNone)); + Options{}.set( + ChecksumAlgorithm::kNone)); EXPECT_TRUE(settings.md5); EXPECT_TRUE(settings.crc32c); - - settings = GetDownloadChecksumSettings( - request, Options{}.set( - ChecksumAlgorithm::kCrc32cAndMD5)); - EXPECT_FALSE(settings.md5); - EXPECT_FALSE(settings.crc32c); -} - -TEST(ChecksumHelpersTest, DownloadChecksumSettingsOnlyOldOptions) { - ReadObjectRangeRequest request("bucket", "object"); - request.set_option(DisableMD5Hash(true)); - request.set_option(DisableCrc32cChecksum(true)); - auto settings = GetDownloadChecksumSettings(request, Options{}); - EXPECT_TRUE(settings.md5); - EXPECT_TRUE(settings.crc32c); - - request.set_option(DisableMD5Hash(false)); - request.set_option(DisableCrc32cChecksum(false)); - settings = GetDownloadChecksumSettings(request, Options{}); - EXPECT_FALSE(settings.md5); - EXPECT_FALSE(settings.crc32c); -} - -TEST(ChecksumHelpersTest, DownloadChecksumSettingsOverride) { - ReadObjectRangeRequest request("bucket", "object"); - request.set_option(DisableMD5Hash(true)); - request.set_option(DisableCrc32cChecksum(false)); - auto settings = GetDownloadChecksumSettings( - request, - Options{}.set(ChecksumAlgorithm::kMD5)); - EXPECT_TRUE(settings.md5); - EXPECT_FALSE(settings.crc32c); - - request.set_option(DisableMD5Hash(false)); - request.set_option(DisableCrc32cChecksum(true)); - settings = GetDownloadChecksumSettings( - request, - Options{}.set(ChecksumAlgorithm::kMD5)); - EXPECT_FALSE(settings.md5); - EXPECT_TRUE(settings.crc32c); - - request.set_option(DisableMD5Hash(true)); - request.set_option(DisableCrc32cChecksum(false)); - settings = GetDownloadChecksumSettings( - request, Options{}.set( - ChecksumAlgorithm::kNone)); - EXPECT_TRUE(settings.md5); - EXPECT_FALSE(settings.crc32c); } TEST(ChecksumHelpersTest, UploadChecksumSettingsDefaults) { - InsertObjectMediaRequest request("bucket", "object", "contents"); - auto settings = GetUploadChecksumSettings(request, Options{}); + auto settings = GetUploadChecksumSettings(Options{}); EXPECT_TRUE(settings.md5); EXPECT_FALSE(settings.crc32c); } TEST(ChecksumHelpersTest, UploadChecksumSettingsOnlyNewOptions) { - InsertObjectMediaRequest request("bucket", "object", "contents"); auto settings = GetUploadChecksumSettings( - request, Options{}.set(ChecksumAlgorithm::kMD5)); EXPECT_FALSE(settings.md5); EXPECT_TRUE(settings.crc32c); - settings = GetUploadChecksumSettings( - request, Options{}.set( - ChecksumAlgorithm::kCrc32c)); + settings = + GetUploadChecksumSettings(Options{}.set( + ChecksumAlgorithm::kCrc32c)); EXPECT_TRUE(settings.md5); EXPECT_FALSE(settings.crc32c); settings = GetUploadChecksumSettings( - request, Options{}.set(ChecksumAlgorithm::kNone)); EXPECT_TRUE(settings.md5); EXPECT_TRUE(settings.crc32c); - - settings = GetUploadChecksumSettings( - request, Options{}.set( - ChecksumAlgorithm::kCrc32cAndMD5)); - EXPECT_FALSE(settings.md5); - EXPECT_FALSE(settings.crc32c); -} - -TEST(ChecksumHelpersTest, UploadChecksumSettingsOnlyOldOptions) { - InsertObjectMediaRequest request("bucket", "object", "contents"); - request.set_option(DisableMD5Hash(true)); - request.set_option(DisableCrc32cChecksum(true)); - auto settings = GetUploadChecksumSettings(request, Options{}); - EXPECT_TRUE(settings.md5); - EXPECT_TRUE(settings.crc32c); - - request.set_option(DisableMD5Hash(false)); - request.set_option(DisableCrc32cChecksum(false)); - settings = GetUploadChecksumSettings(request, Options{}); - EXPECT_FALSE(settings.md5); - EXPECT_FALSE(settings.crc32c); -} - -TEST(ChecksumHelpersTest, UploadChecksumSettingsOverride) { - InsertObjectMediaRequest request("bucket", "object", "contents"); - request.set_option(DisableMD5Hash(true)); - request.set_option(DisableCrc32cChecksum(false)); - auto settings = GetUploadChecksumSettings( - request, - Options{}.set(ChecksumAlgorithm::kMD5)); - EXPECT_TRUE(settings.md5); - EXPECT_FALSE(settings.crc32c); - - request.set_option(DisableMD5Hash(false)); - request.set_option(DisableCrc32cChecksum(true)); - settings = GetUploadChecksumSettings( - request, - Options{}.set(ChecksumAlgorithm::kMD5)); - EXPECT_FALSE(settings.md5); - EXPECT_TRUE(settings.crc32c); - - request.set_option(DisableMD5Hash(true)); - request.set_option(DisableCrc32cChecksum(false)); - settings = GetUploadChecksumSettings( - request, - Options{}.set(ChecksumAlgorithm::kNone)); - EXPECT_TRUE(settings.md5); - EXPECT_FALSE(settings.crc32c); } } // namespace 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..cb67edf876723 100644 --- a/google/cloud/storage/internal/grpc/stub.cc +++ b/google/cloud/storage/internal/grpc/stub.cc @@ -348,13 +348,10 @@ StatusOr GrpcStub::InsertObjectMedia( ApplyRoutingHeaders(*ctx, request); 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); + auto const settings = 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..ec87bd4081249 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,8 @@ 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 +85,11 @@ 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 0e17442acce05..f104fa956e106 100644 --- a/google/cloud/storage/internal/hash_function.h +++ b/google/cloud/storage/internal/hash_function.h @@ -88,9 +88,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..c06399b242a51 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}, + }; 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,12 @@ 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..423cf99d2fb2c 100644 --- a/google/cloud/storage/internal/hash_validator.cc +++ b/google/cloud/storage/internal/hash_validator.cc @@ -57,17 +57,17 @@ 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); } std::unique_ptr CreateHashValidator( - ResumableUploadRequest const& request) { - auto const settings = GetUploadChecksumSettings( - request, google::cloud::internal::CurrentOptions()); + ResumableUploadRequest const& /*request*/) { + 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..ef2e51e6818ef 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}, + }; 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,10 @@ TEST(HashValidatorImplTest, CreateHashFunctionUpload) { auto const upload_cases = testing::UploadHashCases(); for (auto const& test : upload_cases) { - auto request = - ResumableUploadRequest("test-bucket", "test-object") - .set_multiple_options(test.crc32_disabled, test.crc32_value, - test.md5_disabled, test.md5_value); + google::cloud::internal::OptionsSpan span( + Options{}.set(test.validation_algo)); + auto request = ResumableUploadRequest("test-bucket", "test-object") + .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..f90a182f306ac 100644 --- a/google/cloud/storage/internal/object_requests.h +++ b/google/cloud/storage/internal/object_requests.h @@ -105,11 +105,10 @@ std::ostream& operator<<(std::ostream& os, GetObjectMetadataRequest const& r); */ template using InsertObjectRequestImpl = GenericObjectRequest< - Derived, ContentEncoding, ContentType, Crc32cChecksumValue, - DisableCrc32cChecksum, DisableMD5Hash, EncryptionKey, IfGenerationMatch, - IfGenerationNotMatch, IfMetagenerationMatch, IfMetagenerationNotMatch, - KmsKeyName, MD5HashValue, PredefinedAcl, Projection, UserProject, - UploadFromOffset, UploadLimit, WithObjectMetadata>; + Derived, ContentEncoding, ContentType, Crc32cChecksumValue, EncryptionKey, + IfGenerationMatch, IfGenerationNotMatch, IfMetagenerationMatch, + IfMetagenerationNotMatch, KmsKeyName, MD5HashValue, PredefinedAcl, + Projection, UserProject, UploadFromOffset, UploadLimit, WithObjectMetadata>; /** * Represents a request to the `Objects: insert` API with a string for the @@ -193,10 +192,9 @@ std::ostream& operator<<(std::ostream& os, CopyObjectRequest const& r); */ class ReadObjectRangeRequest : public GenericObjectRequest< - ReadObjectRangeRequest, DisableCrc32cChecksum, DisableMD5Hash, - EncryptionKey, Generation, IfGenerationMatch, IfGenerationNotMatch, - IfMetagenerationMatch, IfMetagenerationNotMatch, ReadFromOffset, - ReadRange, ReadLast, UserProject, AcceptEncoding> { + ReadObjectRangeRequest, EncryptionKey, Generation, IfGenerationMatch, + IfGenerationNotMatch, IfMetagenerationMatch, IfMetagenerationNotMatch, + ReadFromOffset, ReadRange, ReadLast, UserProject, AcceptEncoding> { public: using GenericObjectRequest::GenericObjectRequest; @@ -438,12 +436,12 @@ std::ostream& operator<<(std::ostream& os, RestoreObjectRequest const& r); class ResumableUploadRequest : public GenericObjectRequest< ResumableUploadRequest, ContentEncoding, ContentType, - Crc32cChecksumValue, DisableCrc32cChecksum, DisableMD5Hash, - EncryptionKey, IfGenerationMatch, IfGenerationNotMatch, - IfMetagenerationMatch, IfMetagenerationNotMatch, KmsKeyName, - MD5HashValue, PredefinedAcl, Projection, UseResumableUploadSession, - UserProject, UploadFromOffset, UploadLimit, WithObjectMetadata, - UploadContentLength, AutoFinalize, UploadBufferSize> { + Crc32cChecksumValue, EncryptionKey, IfGenerationMatch, + IfGenerationNotMatch, IfMetagenerationMatch, IfMetagenerationNotMatch, + KmsKeyName, MD5HashValue, PredefinedAcl, Projection, + UseResumableUploadSession, UserProject, UploadFromOffset, UploadLimit, + WithObjectMetadata, UploadContentLength, AutoFinalize, + UploadBufferSize> { public: ResumableUploadRequest() = default; diff --git a/google/cloud/storage/internal/object_requests_test.cc b/google/cloud/storage/internal/object_requests_test.cc index e9cbe0a85e7d0..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_FALSE(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..028ae320d4e83 100644 --- a/google/cloud/storage/internal/object_write_streambuf_test.cc +++ b/google/cloud/storage/internal/object_write_streambuf_test.cc @@ -688,13 +688,10 @@ 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 24ad632f144df..4232b157ce163 100644 --- a/google/cloud/storage/internal/rest/stub.cc +++ b/google/cloud/storage/internal/rest/stub.cc @@ -380,13 +380,10 @@ StatusOr RestStub::InsertObjectMediaMultipart( request.GetOption().value()); } - auto const settings = - storage::internal::GetUploadChecksumSettings(request, options); - auto disable_md5 = storage::DisableMD5Hash(settings.md5); - auto disable_crc32c = storage::DisableCrc32cChecksum(settings.crc32c); + auto const settings = 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(); @@ -460,8 +457,7 @@ StatusOr RestStub::InsertObjectMedia( // If the application has set an explicit hash value, or if it requires // computing the MD5 hash or CRC32C checksum, we need to use multipart // uploads. - auto const settings = - storage::internal::GetUploadChecksumSettings(request, options); + auto const settings = storage::internal::GetUploadChecksumSettings(options); if (!settings.md5 || !settings.crc32c || request.HasOption() || request.HasOption()) { return InsertObjectMediaMultipart(context, options, request); diff --git a/google/cloud/storage/options.h b/google/cloud/storage/options.h index ea687c9d090b8..df425bb37c2dd 100644 --- a/google/cloud/storage/options.h +++ b/google/cloud/storage/options.h @@ -89,10 +89,9 @@ struct CAPathOption { * @ingroup storage-options */ enum class ChecksumAlgorithm { - kNone, ///< Disable checksum validation - kCrc32c, ///< Use CRC32C for checksum validation - kMD5, ///< Use MD5 for checksum validation - kCrc32cAndMD5, ///< Use CRC32C and MD5 for checksum validation + kNone, ///< Disable checksum validation + kCrc32c, ///< Use CRC32C for checksum validation + kMD5, ///< Use MD5 for checksum validation }; /** diff --git a/google/cloud/storage/parallel_upload.h b/google/cloud/storage/parallel_upload.h index 5b0f09c6c87fe..897be310a4f92 100644 --- a/google/cloud/storage/parallel_upload.h +++ b/google/cloud/storage/parallel_upload.h @@ -700,9 +700,9 @@ NonResumableParallelUploadState::Create(Client client, std::vector streams; auto upload_options = StaticTupleFilter< - Among::TPred>(std::move(options)); + Among::TPred>( + std::move(options)); for (std::size_t i = 0; i < num_shards; ++i) { ResumableUploadRequest request( bucket_name, prefix + ".upload_shard_" + std::to_string(i)); @@ -805,9 +805,9 @@ StatusOr ResumableParallelUploadState::CreateNew( auto upload_options = std::tuple_cat( StaticTupleFilter< - Among::TPred>(options), + Among::TPred>( + options), std::make_tuple(UseResumableUploadSession(""))); for (std::size_t i = 0; i < num_shards; ++i) { ResumableUploadRequest request( @@ -863,8 +863,7 @@ StatusOr ResumableParallelUploadState::Resume( } auto read_options = std::tuple_cat( - StaticTupleFilter::TPred>( + StaticTupleFilter::TPred>( options), std::make_tuple(IfGenerationMatch(state_and_gen->second))); @@ -914,9 +913,9 @@ StatusOr ResumableParallelUploadState::Resume( std::vector streams; auto upload_options = StaticTupleFilter< - Among::TPred>(std::move(options)); + Among::TPred>( + std::move(options)); for (auto& stream_desc : persistent_state->streams) { ResumableUploadRequest request(bucket_name, std::move(stream_desc.object_name)); diff --git a/google/cloud/storage/testing/upload_hash_cases.cc b/google/cloud/storage/testing/upload_hash_cases.cc index 808d923b37a76..ad7e024d17613 100644 --- a/google/cloud/storage/testing/upload_hash_cases.cc +++ b/google/cloud/storage/testing/upload_hash_cases.cc @@ -37,28 +37,21 @@ 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)}, - // 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)}, // 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..3e7e7596f08b2 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)); + IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -64,13 +64,16 @@ 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)); + auto meta = client.InsertObject( + bucket_name_, object_name, LoremIpsum(), + Options{}.set(ChecksumAlgorithm::kNone), + IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -80,14 +83,17 @@ TEST_F(ObjectChecksumIntegrationTest, InsertObjectExplicitDisable) { } } -/// @test Verify that `DisableCrc32cChecksum(false)` works as expected. +/// @test Verify that +/// `Options{}.set(ChecksumAlgorithm::kCrc32c)` +/// 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)); + auto meta = client.InsertObject( + bucket_name_, object_name, LoremIpsum(), + Options{}.set(ChecksumAlgorithm::kCrc32c), + IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -104,7 +110,8 @@ 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 +129,8 @@ 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,8 +140,7 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectDefault) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - auto os = client.WriteObject(bucket_name_, object_name, DisableMD5Hash(true), - IfGenerationMatch(0)); + auto os = client.WriteObject(bucket_name_, object_name, IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -157,9 +164,10 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectExplicitDisable) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - auto os = - client.WriteObject(bucket_name_, object_name, DisableCrc32cChecksum(true), - DisableMD5Hash(true), IfGenerationMatch(0)); + auto os = client.WriteObject( + bucket_name_, object_name, + Options{}.set(ChecksumAlgorithm::kNone), + IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -181,9 +189,10 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectExplicitDisable) { 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)); + auto os = client.WriteObject( + bucket_name_, object_name, + Options{}.set(ChecksumAlgorithm::kCrc32c), + IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -208,7 +217,8 @@ 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 +241,8 @@ 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 +261,8 @@ 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 +283,8 @@ 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()); @@ -285,9 +298,10 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithFullChecksumValidation) { auto content = LoremIpsum(); auto expected_crc32c = ComputeCrc32cChecksum(content); - auto os = client.WriteObject(bucket_name_, object_name, - DisableCrc32cChecksum(false), - DisableMD5Hash(true), IfGenerationMatch(0)); + auto os = client.WriteObject( + bucket_name_, object_name, + Options{}.set(ChecksumAlgorithm::kCrc32c), + IfGenerationMatch(0)); os << content; os.Close(); auto meta = os.metadata(); @@ -315,9 +329,10 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithIncorrectChecksumValue) { auto bad_crc32c = ComputeCrc32cChecksum("this is not the data being uploaded"); - auto os = client.WriteObject(bucket_name_, object_name, - Crc32cChecksumValue(bad_crc32c), - DisableMD5Hash(true), IfGenerationMatch(0)); + auto os = client.WriteObject( + bucket_name_, object_name, Crc32cChecksumValue(bad_crc32c), + Options{}.set(ChecksumAlgorithm::kCrc32c), + IfGenerationMatch(0)); os << content; os.Close(); @@ -363,7 +378,9 @@ 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 +420,9 @@ 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..44e708c76a3a3 100644 --- a/google/cloud/storage/tests/object_file_integration_test.cc +++ b/google/cloud/storage/tests/object_file_integration_test.cc @@ -300,9 +300,10 @@ TEST_F(ObjectFileIntegrationTest, UploadFileNonRegularWarning) { os.close(); }); testing_util::ScopedLog log; - StatusOr meta = - client.UploadFile(file_name, bucket_name_, object_name, - IfGenerationMatch(0), DisableMD5Hash(true)); + StatusOr meta = client.UploadFile( + file_name, bucket_name_, object_name, 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..bbfbbc8a14a02 100644 --- a/google/cloud/storage/tests/object_hash_integration_test.cc +++ b/google/cloud/storage/tests/object_hash_integration_test.cc @@ -57,14 +57,13 @@ class ObjectHashIntegrationTest TEST_F(ObjectHashIntegrationTest, InsertObjectDefault) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - auto meta = - client.InsertObject(bucket_name_, object_name, LoremIpsum(), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + auto meta = client.InsertObject(bucket_name_, object_name, LoremIpsum(), + IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); if (meta->has_metadata("x_emulator_upload")) { - ASSERT_FALSE(meta->has_metadata("x_emulator_crc32c")); + ASSERT_TRUE(meta->has_metadata("x_emulator_crc32c")); ASSERT_FALSE(meta->has_metadata("x_emulator_md5")); } } @@ -75,8 +74,9 @@ 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::kNone), + IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -92,8 +92,9 @@ 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); @@ -107,10 +108,11 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectExplicitEnable) { TEST_F(ObjectHashIntegrationTest, InsertObjectWithValueSuccess) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - auto meta = - client.InsertObject(bucket_name_, object_name, LoremIpsum(), - MD5HashValue(ComputeMD5Hash(LoremIpsum())), - DisableCrc32cChecksum(true), IfGenerationMatch(0)); + auto meta = client.InsertObject( + bucket_name_, object_name, LoremIpsum(), + MD5HashValue(ComputeMD5Hash(LoremIpsum())), + Options{}.set(ChecksumAlgorithm::kMD5), + IfGenerationMatch(0)); ASSERT_STATUS_OK(meta); ScheduleForDelete(*meta); @@ -128,10 +130,10 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectWithValueFailure) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - // 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::kMD5), + IfGenerationMatch(0)); EXPECT_THAT(failure, Not(IsOk())); } @@ -139,9 +141,7 @@ TEST_F(ObjectHashIntegrationTest, InsertObjectWithValueFailure) { TEST_F(ObjectHashIntegrationTest, WriteObjectDefault) { auto client = MakeIntegrationTestClient(); auto object_name = MakeRandomObjectName(); - auto os = - client.WriteObject(bucket_name_, object_name, DisableCrc32cChecksum(true), - IfGenerationMatch(0)); + auto os = client.WriteObject(bucket_name_, object_name, IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -151,7 +151,7 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectDefault) { EXPECT_THAT(os.received_hash(), Not(HasSubstr(ComputeMD5Hash(LoremIpsum())))); EXPECT_THAT(os.computed_hash(), Not(HasSubstr(ComputeMD5Hash(LoremIpsum())))); if (meta->has_metadata("x_emulator_upload")) { - ASSERT_TRUE(meta->has_metadata("x_emulator_no_crc32c")); + ASSERT_FALSE(meta->has_metadata("x_emulator_no_crc32c")); ASSERT_TRUE(meta->has_metadata("x_emulator_no_md5")); } } @@ -160,9 +160,10 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectDefault) { 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)); + auto os = client.WriteObject( + bucket_name_, object_name, + Options{}.set(ChecksumAlgorithm::kNone), + IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -181,9 +182,10 @@ TEST_F(ObjectHashIntegrationTest, WriteObjectExplicitDisable) { 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)); + auto os = client.WriteObject( + bucket_name_, object_name, + Options{}.set(ChecksumAlgorithm::kMD5), + IfGenerationMatch(0)); os << LoremIpsum(); os.Close(); auto meta = os.metadata(); @@ -204,7 +206,8 @@ 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 +232,8 @@ 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 +252,8 @@ 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 +274,8 @@ 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 +318,8 @@ 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 +358,8 @@ 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..9d1b689d9b879 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,8 @@ 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 +441,8 @@ 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);