@@ -2072,81 +2072,91 @@ func TestReadObjectWrongChecksumWholeObjectSizeEmulated(t *testing.T) {
20722072
20732073 for _ , bidiReads := range []bool {false , true } {
20742074 for _ , disableChecksum := range []bool {false , true } {
2075- t .Run (fmt .Sprintf ("bidiReads=%v/disableChecksum=%v" , bidiReads , disableChecksum ), func (t * testing.T ) {
2076- ctx := context .Background ()
2077-
2078- streamInterceptor := grpc .WithStreamInterceptor (
2079- func (ctx context.Context , desc * grpc.StreamDesc , cc * grpc.ClientConn , method string , streamer grpc.Streamer , opts ... grpc.CallOption ) (grpc.ClientStream , error ) {
2080- clientStream , err := streamer (ctx , desc , cc , method , opts ... )
2081-
2082- switch method {
2083- case "/google.storage.v2.Storage/ReadObject" :
2084- clientStream = & customObjectCRCReadStream {ClientStream : clientStream , isBidi : false }
2085- case "/google.storage.v2.Storage/BidiReadObject" :
2086- clientStream = & customObjectCRCReadStream {ClientStream : clientStream , isBidi : true }
2087- }
2088- return clientStream , err
2089- })
2090-
2091- var clientOpts []option.ClientOption
2092- clientOpts = append (clientOpts , option .WithGRPCDialOption (streamInterceptor ))
2093- if bidiReads {
2094- clientOpts = append (clientOpts , experimental .WithGRPCBidiReads ())
2095- }
2096-
2097- client , err := NewGRPCClient (ctx , clientOpts ... )
2098- if err != nil {
2099- t .Fatalf ("NewGRPCClient: %v" , err )
2100- }
2101-
2102- var (
2103- contents = randomBytes9MiB
2104- prefix = time .Now ().Nanosecond ()
2105- bucket = fmt .Sprintf ("bucket-%d" , prefix )
2106- objName = fmt .Sprintf ("%d-object" , prefix )
2107- o = client .Bucket (bucket ).Object (objName )
2108- )
2109-
2110- if err := client .Bucket (bucket ).Create (ctx , "project" , nil ); err != nil {
2111- t .Fatalf ("creating test bucket: %v" , err )
2112- }
2113- w := o .NewWriter (ctx )
2114- if _ , err = w .Write (contents ); err != nil {
2115- t .Fatalf ("writing test data: got %v; want ok" , err )
2116- }
2117- if err := w .Close (); err != nil {
2118- t .Fatalf ("closing test data writer: got %v; want ok" , err )
2119- }
2120-
2121- var readerOpts []ReaderOption
2122- if disableChecksum {
2123- readerOpts = append (readerOpts , WithDisableReaderChecksum ())
2124- }
2075+ for _ , negativeOffset := range []bool {false , true } {
2076+ t .Run (fmt .Sprintf ("bidiReads=%v/disableChecksum=%v/negativeOffset=%v" , bidiReads , disableChecksum , negativeOffset ), func (t * testing.T ) {
2077+ ctx := context .Background ()
2078+
2079+ streamInterceptor := grpc .WithStreamInterceptor (
2080+ func (ctx context.Context , desc * grpc.StreamDesc , cc * grpc.ClientConn , method string , streamer grpc.Streamer , opts ... grpc.CallOption ) (grpc.ClientStream , error ) {
2081+ clientStream , err := streamer (ctx , desc , cc , method , opts ... )
2082+
2083+ switch method {
2084+ case "/google.storage.v2.Storage/ReadObject" :
2085+ clientStream = & customObjectCRCReadStream {ClientStream : clientStream , isBidi : false }
2086+ case "/google.storage.v2.Storage/BidiReadObject" :
2087+ clientStream = & customObjectCRCReadStream {ClientStream : clientStream , isBidi : true }
2088+ }
2089+ return clientStream , err
2090+ })
21252091
2126- r , err := o .NewRangeReader (ctx , 0 , int64 (len (contents )), readerOpts ... )
2127- if err != nil {
2128- t .Fatalf ("NewRangeReader: %v" , err )
2129- }
2092+ var clientOpts []option.ClientOption
2093+ clientOpts = append (clientOpts , option .WithGRPCDialOption (streamInterceptor ))
2094+ if bidiReads {
2095+ clientOpts = append (clientOpts , experimental .WithGRPCBidiReads ())
2096+ }
21302097
2131- if disableChecksum {
2132- buf := new (bytes.Buffer )
2133- _ , err = io .Copy (buf , r )
2098+ client , err := NewGRPCClient (ctx , clientOpts ... )
21342099 if err != nil {
2135- t .Fatalf ("expected nil error with checksum disabled, got %v" , err )
2100+ t .Fatalf ("NewGRPCClient: %v" , err )
21362101 }
2137- if got , want := buf .Bytes (), contents ; ! bytes .Equal (got , want ) {
2138- t .Errorf ("content mismatch: got %v bytes, want %v bytes" , len (got ), len (want ))
2102+ defer client .Close ()
2103+ var (
2104+ contents = randomBytes9MiB
2105+ prefix = time .Now ().Nanosecond ()
2106+ bucket = fmt .Sprintf ("bucket-%d" , prefix )
2107+ objName = fmt .Sprintf ("%d-object" , prefix )
2108+ o = client .Bucket (bucket ).Object (objName )
2109+ )
2110+
2111+ if err := client .Bucket (bucket ).Create (ctx , "project" , nil ); err != nil {
2112+ t .Fatalf ("creating test bucket: %v" , err )
21392113 }
2140- } else {
2141- _ , err = io .Copy (io .Discard , r )
2142- if err == nil {
2143- t .Fatalf ("expected error due to bad object CRC, got nil" )
2114+ w := o .NewWriter (ctx )
2115+ if _ , err = w .Write (contents ); err != nil {
2116+ t .Fatalf ("writing test data: got %v; want ok" , err )
21442117 }
2145- if got , want := err . Error (), "bad CRC on read" ; ! strings . Contains ( got , want ) {
2146- t .Errorf ( "error mismatch : got %q, want to contain %q " , got , want )
2118+ if err := w . Close (); err != nil {
2119+ t .Fatalf ( "closing test data writer : got %v; want ok " , err )
21472120 }
2148- }
2149- })
2121+
2122+ var readerOpts []ReaderOption
2123+ if disableChecksum {
2124+ readerOpts = append (readerOpts , WithDisableReaderChecksum ())
2125+ }
2126+
2127+ var offset , length int64
2128+ if negativeOffset {
2129+ offset = - int64 (len (contents ) + 1000 )
2130+ length = - 1
2131+ } else {
2132+ offset = 0
2133+ length = int64 (len (contents ))
2134+ }
2135+ r , err := o .NewRangeReader (ctx , offset , length , readerOpts ... )
2136+ if err != nil {
2137+ t .Fatalf ("NewRangeReader: %v" , err )
2138+ }
2139+ defer r .Close ()
2140+ if disableChecksum {
2141+ buf := new (bytes.Buffer )
2142+ _ , err = io .Copy (buf , r )
2143+ if err != nil {
2144+ t .Fatalf ("expected nil error with checksum disabled, got %v" , err )
2145+ }
2146+ if got , want := buf .Bytes (), contents ; ! bytes .Equal (got , want ) {
2147+ t .Errorf ("content mismatch: got %v bytes, want %v bytes" , len (got ), len (want ))
2148+ }
2149+ } else {
2150+ _ , err = io .Copy (io .Discard , r )
2151+ if err == nil {
2152+ t .Fatalf ("expected error due to bad object CRC, got nil" )
2153+ }
2154+ if got , want := err .Error (), "bad CRC on read" ; ! strings .Contains (got , want ) {
2155+ t .Errorf ("error mismatch: got %q, want to contain %q" , got , want )
2156+ }
2157+ }
2158+ })
2159+ }
21502160 }
21512161 }
21522162}
@@ -2170,6 +2180,7 @@ func TestReadObjectWrongChecksumUnfinalizedWholeObjectSizeEmulated(t *testing.T)
21702180 if err != nil {
21712181 t .Fatalf ("NewGRPCClient: %v" , err )
21722182 }
2183+ defer client .Close ()
21732184
21742185 var (
21752186 contents = randomBytes9MiB
0 commit comments