@@ -433,6 +433,27 @@ def response(msg):
433433 msg .resource .size = obj_len
434434 return msg
435435
436+ def update_upload_checksums (upload_metadata , object_checksums ):
437+ if object_checksums is None :
438+ upload_metadata .metadata ["x_emulator_no_crc32c" ] = "true"
439+ upload_metadata .metadata ["x_emulator_no_md5" ] = "true"
440+ else :
441+ if object_checksums .HasField ("crc32c" ):
442+ upload_metadata .metadata [
443+ "x_emulator_crc32c"
444+ ] = testbench .common .rest_crc32c_from_proto (object_checksums .crc32c )
445+ else :
446+ upload_metadata .metadata ["x_emulator_no_crc32c" ] = "true"
447+ if (
448+ object_checksums .md5_hash is not None
449+ and object_checksums .md5_hash != b""
450+ ):
451+ upload_metadata .metadata [
452+ "x_emulator_md5"
453+ ] = testbench .common .rest_md5_from_proto (object_checksums .md5_hash )
454+ else :
455+ upload_metadata .metadata ["x_emulator_no_md5" ] = "true"
456+
436457 for request in request_iterator :
437458 if request .HasField ("first_message" ):
438459 testbench .error .invalid ("Multiple first_message" , context )
@@ -511,9 +532,12 @@ def response(msg):
511532 # TODO(#720): (b) Decide if the testbench checks for flush or/and performs a background force-close.
512533 if is_appendable :
513534
535+ update_upload_checksums (upload .metadata , object_checksums )
536+
514537 def update_appendable_blob (blob , unused_generation ):
515538 blob .media = upload .media
516539 blob .metadata .size = len (upload .media )
540+ blob .metadata .checksums .crc32c = crc32c .crc32c (upload .media )
517541 return blob
518542
519543 blob = db .do_update_object (
@@ -540,25 +564,8 @@ def update_appendable_blob(blob, unused_generation):
540564 )
541565 )
542566
543- if object_checksums is None :
544- upload .metadata .metadata ["x_emulator_no_crc32c" ] = "true"
545- upload .metadata .metadata ["x_emulator_no_md5" ] = "true"
546- else :
547- if object_checksums .HasField ("crc32c" ):
548- upload .metadata .metadata [
549- "x_emulator_crc32c"
550- ] = testbench .common .rest_crc32c_from_proto (object_checksums .crc32c )
551- else :
552- upload .metadata .metadata ["x_emulator_no_crc32c" ] = "true"
553- if (
554- object_checksums .md5_hash is not None
555- and object_checksums .md5_hash != b""
556- ):
557- upload .metadata .metadata [
558- "x_emulator_md5"
559- ] = testbench .common .rest_md5_from_proto (object_checksums .md5_hash )
560- else :
561- upload .metadata .metadata ["x_emulator_no_md5" ] = "true"
567+ # Update metadata checksums fields on the upload instance.
568+ update_upload_checksums (upload .metadata , object_checksums )
562569
563570 # Create a new object when the write is completed.
564571 if upload .complete :
0 commit comments