@@ -145,14 +145,8 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectDefault) {
145145 EXPECT_THAT (os.computed_hash (),
146146 HasSubstr (ComputeCrc32cChecksum (LoremIpsum ())));
147147 if (meta->has_metadata (" x_emulator_upload" )) {
148- if (UsingGrpc ()) {
149- EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_crc32c" , _)));
150- EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_md5" , _)));
151- } else {
152- // Streaming uploads over REST cannot include checksums
153- EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_crc32c" , _)));
154- EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_md5" , _)));
155- }
148+ EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_crc32c" , _)));
149+ EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_md5" , _)));
156150 }
157151}
158152
@@ -200,14 +194,8 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectExplicitEnable) {
200194 EXPECT_THAT (os.computed_hash (),
201195 HasSubstr (ComputeCrc32cChecksum (LoremIpsum ())));
202196 if (meta->has_metadata (" x_emulator_upload" )) {
203- if (UsingGrpc ()) {
204197 EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_crc32c" , _)));
205198 EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_md5" , _)));
206- } else {
207- // Streaming uploads over REST cannot include checksums
208- EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_crc32c" , _)));
209- EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_md5" , _)));
210- }
211199 }
212200}
213201
@@ -289,6 +277,54 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectUploadBadChecksum) {
289277 ASSERT_THAT (stream.metadata (), Not (IsOk ()));
290278}
291279
280+ // / @test Verify that full object checksums are sent in the final chunk.
281+ TEST_F (ObjectChecksumIntegrationTest, WriteObjectWithFullChecksumValidation) {
282+ auto client = MakeIntegrationTestClient ();
283+ auto object_name = MakeRandomObjectName ();
284+ auto content = LoremIpsum ();
285+ auto expected_crc32c = ComputeCrc32cChecksum (content);
286+
287+ auto os = client.WriteObject (bucket_name_, object_name,
288+ DisableCrc32cChecksum (false ),
289+ DisableMD5Hash (true ),
290+ IfGenerationMatch (0 ));
291+ os << content;
292+ os.Close ();
293+ auto meta = os.metadata ();
294+ ASSERT_STATUS_OK (meta);
295+ ScheduleForDelete (*meta);
296+
297+ EXPECT_EQ (os.computed_hash (), expected_crc32c);
298+
299+ if (meta->has_metadata (" x_emulator_upload" )) {
300+ EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_crc32c" , expected_crc32c)));
301+ EXPECT_THAT (meta->metadata (), Contains (Pair (" x_emulator_no_md5" , " true" )));
302+ }
303+ }
304+
305+ // / @test Verify that the upload fails when the provided CRC32C checksum does not match the data.
306+ TEST_F (ObjectChecksumIntegrationTest, WriteObjectWithIncorrectChecksumValue) {
307+ auto client = MakeIntegrationTestClient ();
308+ auto object_name = MakeRandomObjectName ();
309+ auto content = LoremIpsum ();
310+
311+ auto bad_crc32c = ComputeCrc32cChecksum (" this is not the data being uploaded" );
312+
313+ auto os = client.WriteObject (bucket_name_, object_name,
314+ Crc32cChecksumValue (bad_crc32c),
315+ DisableMD5Hash (true ),
316+ IfGenerationMatch (0 ));
317+
318+ os << content;
319+ os.Close ();
320+ EXPECT_TRUE (os.bad ());
321+ auto meta = os.metadata ();
322+ EXPECT_THAT (meta, Not (IsOk ()));
323+
324+ // The server returns FAILED_PRECONDITION (412) for checksum mismatches during finalization
325+ EXPECT_THAT (meta, StatusIs (StatusCode::kFailedPrecondition ));
326+ }
327+
292328// / @test Verify that CRC32C checksums are computed by default on downloads.
293329TEST_F (ObjectChecksumIntegrationTest, ReadObjectDefault) {
294330 // TODO(#14385) - the emulator does not support this feature for gRPC.
@@ -385,3 +421,4 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
385421} // namespace storage
386422} // namespace cloud
387423} // namespace google
424+
0 commit comments