@@ -556,6 +556,87 @@ public boolean isSendReady() {
556556 }
557557 }
558558
559+ @ Test
560+ public void validateCumulativeChecksum_bidi_disabled_noFailureOnMismatch () throws Exception {
561+ ChecksummedTestContent testContent =
562+ ChecksummedTestContent .of (DataGenerator .base64Characters ().genBytes (10 ));
563+
564+ Object bidiMetadata =
565+ Object .newBuilder ()
566+ .setSize (testContent .length ())
567+ .setChecksums (
568+ ObjectChecksums .newBuilder ().setCrc32C (testContent .getCrc32c () + 1 ).build ())
569+ .build ();
570+
571+ SettableApiFuture <ResponseObserver <BidiReadObjectResponse >> observerFuture =
572+ SettableApiFuture .create ();
573+
574+ ZeroCopyBidiStreamingCallable <BidiReadObjectRequest , BidiReadObjectResponse > customCallable =
575+ new ZeroCopyBidiStreamingCallable <>(
576+ new BidiStreamingCallable <BidiReadObjectRequest , BidiReadObjectResponse >() {
577+ @ Override
578+ public ClientStream <BidiReadObjectRequest > internalCall (
579+ ResponseObserver <BidiReadObjectResponse > responseObserver ,
580+ ClientStreamReadyObserver <BidiReadObjectRequest > onReady ,
581+ ApiCallContext context ) {
582+ observerFuture .set (responseObserver );
583+ responseObserver .onStart (TestUtils .nullStreamController ());
584+ return new ClientStream <BidiReadObjectRequest >() {
585+ @ Override
586+ public void send (BidiReadObjectRequest request ) {}
587+
588+ @ Override
589+ public void closeSendWithError (Throwable t ) {}
590+
591+ @ Override
592+ public void closeSend () {
593+ responseObserver .onComplete ();
594+ }
595+
596+ @ Override
597+ public boolean isSendReady () {
598+ return true ;
599+ }
600+ };
601+ }
602+ },
603+ ResponseContentLifecycleManager .noopBidiReadObjectResponse ());
604+
605+ try (AccumulatingRead <byte []> read1 =
606+ ObjectReadSessionStreamRead .createByteArrayAccumulatingRead (
607+ 1 , RangeSpec .all (), Hasher .noop (), RetryContext .neverRetry ())) {
608+ state .putOutstandingRead (1 , read1 );
609+
610+ try (ObjectReadSessionStream stream =
611+ ObjectReadSessionStream .create (exec , customCallable , state , RetryContext .neverRetry ())) {
612+
613+ stream .send (BidiReadObjectRequest .getDefaultInstance ());
614+
615+ ResponseObserver <BidiReadObjectResponse > observer = observerFuture .get (2 , TimeUnit .SECONDS );
616+
617+ BidiReadObjectResponse resp =
618+ BidiReadObjectResponse .newBuilder ()
619+ .setMetadata (bidiMetadata )
620+ .addObjectDataRanges (
621+ com .google .storage .v2 .ObjectRangeData .newBuilder ()
622+ .setReadRange (
623+ com .google .storage .v2 .ReadRange .newBuilder ()
624+ .setReadId (1 )
625+ .setReadOffset (0 )
626+ .build ())
627+ .setChecksummedData (testContent .asChecksummedData ())
628+ .setRangeEnd (true )
629+ .build ())
630+ .build ();
631+
632+ observer .onResponse (resp );
633+
634+ byte [] resultBytes = read1 .get (2 , TimeUnit .SECONDS );
635+ assertThat (xxd (ByteBuffer .wrap (resultBytes ))).isEqualTo (xxd (testContent .asByteBuffer ()));
636+ }
637+ }
638+ }
639+
559640 @ Test
560641 public void validateCumulativeChecksum_bidi_skippedForRangedRead () throws Exception {
561642 ChecksummedTestContent testContent =
0 commit comments