@@ -19,7 +19,6 @@ import (
1919 "context"
2020 "errors"
2121 "fmt"
22- "io"
2322 "os"
2423 "testing"
2524 "time"
@@ -148,60 +147,31 @@ func (t *MrdKernelReaderTest) TestReadAt_NilMrdInstance() {
148147 assert .Equal (t .T (), 0 , resp .Size )
149148}
150149
151- func (t * MrdKernelReaderTest ) TestReadAt_ShortRead_RetrySuccess () {
150+ func (t * MrdKernelReaderTest ) TestReadAt_ShortRead_NoRetry () {
152151 data := []byte ("hello world" )
153- // First MRD returns short read.
154- fakeMRD1 := fake .NewFakeMultiRangeDownloaderWithShortRead (t .object , data )
155- // Second MRD returns full read.
156- fakeMRD2 := fake .NewFakeMultiRangeDownloader (t .object , data )
152+ // MRD returns short read.
153+ fakeMRD := fake .NewFakeMultiRangeDownloaderWithShortRead (t .object , data )
157154 // Expectation:
158- // 1. Initial Read calls ensureMRDPool -> NewMRDPool -> NewMultiRangeDownloader. Returns fakeMRD1 .
155+ // 1. Read calls ensureMRDPool -> NewMRDPool -> NewMultiRangeDownloader. Returns fakeMRD .
159156 // 2. Read returns short read.
160- // 3. ReadAt calls RecreateMRD -> NewMRDPool -> NewMultiRangeDownloader. Returns fakeMRD2 .
161- t . bucket . On ( "NewMultiRangeDownloader" , mock . Anything , mock . Anything ). Return ( fakeMRD1 , nil ). Once ()
162- t .bucket .On ("NewMultiRangeDownloader" , mock .Anything , mock .Anything ).Return (fakeMRD2 , nil ).Once ()
157+ // 3. isShortRead returns false because err is nil .
158+ // 4. ReadAt returns the short read without retrying.
159+ t .bucket .On ("NewMultiRangeDownloader" , mock .Anything , mock .Anything ).Return (fakeMRD , nil ).Once ()
163160 buf := make ([]byte , len (data ))
164- req := & ReadRequest {
165- Buffer : buf ,
166- Offset : 0 ,
167- }
161+ req := & ReadRequest {Buffer : buf , Offset : 0 }
168162
169163 resp , err := t .reader .ReadAt (context .Background (), req )
170164
171165 assert .NoError (t .T (), err )
172- assert .Equal (t .T (), len ( data ) , resp .Size )
173- assert .Equal (t .T (), string ( data ) , string (buf ))
174- // Verify refCount incremented
166+ assert .Equal (t .T (), 5 , resp .Size ) // Short read size
167+ assert .Equal (t .T (), "hello" , string (buf [: 5 ] ))
168+ // Verify refCount incremented (only once)
175169 t .mrdInstance .refCountMu .Lock ()
176170 assert .Equal (t .T (), int64 (1 ), t .mrdInstance .refCount )
177171 t .mrdInstance .refCountMu .Unlock ()
178172 t .bucket .AssertExpectations (t .T ())
179173}
180174
181- func (t * MrdKernelReaderTest ) TestReadAt_ShortRead_RetryFails () {
182- data := []byte ("hello world" )
183- // First MRD returns short read with io.EOF.
184- fakeMRD1 := fake .NewFakeMultiRangeDownloaderWithShortRead (t .object , data )
185- // Second MRD returns 0 bytes and an error.
186- retryErr := status .Error (codes .Internal , "Internal error" )
187- fakeMRD2 := fake .NewFakeMultiRangeDownloaderWithSleepAndDefaultError (t .object , []byte {}, 0 , retryErr )
188- t .bucket .On ("NewMultiRangeDownloader" , mock .Anything , mock .Anything ).Return (fakeMRD1 , nil ).Once ()
189- t .bucket .On ("NewMultiRangeDownloader" , mock .Anything , mock .Anything ).Return (fakeMRD2 , nil ).Once ()
190- buf := make ([]byte , len (data ))
191- req := & ReadRequest {
192- Buffer : buf ,
193- Offset : 0 ,
194- }
195-
196- resp , err := t .reader .ReadAt (context .Background (), req )
197-
198- // ReadAt returns the error from the last attempt (the retry).
199- assert .ErrorIs (t .T (), err , retryErr )
200- assert .Equal (t .T (), 5 , resp .Size )
201- assert .Equal (t .T (), "hello" , string (buf [:5 ]))
202- t .bucket .AssertExpectations (t .T ())
203- }
204-
205175func (t * MrdKernelReaderTest ) TestReadAt_OutOfRange_TriggersRetry () {
206176 data := []byte ("hello world" )
207177 // First MRD returns OutOfRange error.
@@ -274,32 +244,18 @@ func TestIsShortRead(t *testing.T) {
274244 expected : false ,
275245 },
276246 {
277- name : "Full read, EOF " ,
247+ name : "Full read, error " ,
278248 bytesRead : 10 ,
279249 bufferSize : 10 ,
280- err : io . EOF ,
250+ err : errors . New ( "error" ) ,
281251 expected : false ,
282252 },
283253 {
284254 name : "Short read, no error" ,
285255 bytesRead : 5 ,
286256 bufferSize : 10 ,
287257 err : nil ,
288- expected : true ,
289- },
290- {
291- name : "Short read, EOF" ,
292- bytesRead : 5 ,
293- bufferSize : 10 ,
294- err : io .EOF ,
295- expected : true ,
296- },
297- {
298- name : "Short read, UnexpectedEOF" ,
299- bytesRead : 5 ,
300- bufferSize : 10 ,
301- err : io .ErrUnexpectedEOF ,
302- expected : true ,
258+ expected : false ,
303259 },
304260 {
305261 name : "Short read, OutOfRange" ,
@@ -356,17 +312,17 @@ func (t *MrdKernelReaderTest) TestDestroy() {
356312}
357313
358314func (t * MrdKernelReaderTest ) TestReadAt_RecreateMRDFails_RetriesWithOldMRD () {
359- data := [] byte ( "hello world" )
360- // First MRD returns short read.
361- fakeMRD1 := fake .NewFakeMultiRangeDownloaderWithShortRead (t .object , data )
315+ // First MRD returns OutOfRange error.
316+ outOfRangeErr := status . Error ( codes . OutOfRange , "Out of range" )
317+ fakeMRD1 := fake .NewFakeMultiRangeDownloaderWithSleepAndDefaultError (t .object , [] byte {}, 0 , outOfRangeErr )
362318 // Expectation:
363319 // 1. Initial Read calls ensureMRDPool -> NewMRDPool -> NewMultiRangeDownloader. Returns fakeMRD1.
364- // 2. Read returns short read .
320+ // 2. Read returns OutOfRange .
365321 // 3. ReadAt calls RecreateMRD -> NewMRDPool -> NewMultiRangeDownloader. Returns ERROR.
366322 // 4. ReadAt logs warning and retries with existing pool (fakeMRD1).
367323 t .bucket .On ("NewMultiRangeDownloader" , mock .Anything , mock .Anything ).Return (fakeMRD1 , nil ).Once ()
368324 t .bucket .On ("NewMultiRangeDownloader" , mock .Anything , mock .Anything ).Return (nil , errors .New ("recreate failed" )).Once ()
369- buf := make ([]byte , len ( data ) )
325+ buf := make ([]byte , 10 )
370326 req := & ReadRequest {
371327 Buffer : buf ,
372328 Offset : 0 ,
@@ -376,11 +332,10 @@ func (t *MrdKernelReaderTest) TestReadAt_RecreateMRDFails_RetriesWithOldMRD() {
376332
377333 // Assert
378334 // We verify that we didn't get the "recreate failed" error.
379- if err != nil {
380- assert .NotEqual (t .T (), "recreate failed" , err .Error ())
381- }
382- // We expect some data to be read (from first attempt + potentially second attempt).
383- assert .Greater (t .T (), resp .Size , 0 )
335+ assert .ErrorIs (t .T (), err , outOfRangeErr )
336+ assert .NotEqual (t .T (), "recreate failed" , err .Error ())
337+ // We expect 0 bytes to be read as OutOfRange returns 0 bytes.
338+ assert .Equal (t .T (), 0 , resp .Size )
384339 t .bucket .AssertExpectations (t .T ())
385340}
386341
0 commit comments