in internal/storage/fake/fake_multi_range_downloader.go [73:127]
func (fmrd *fakeMultiRangeDownloader) Add(output io.Writer, offset, length int64, callback func(int64, int64, error)) {
if fmrd.defaultErr != nil {
if callback != nil {
callback(offset, 0, fmrd.defaultErr)
}
return
}
obj := fmrd.obj
size := int64(len(obj.data))
var err error
// Apply input checks as defined at https://github.com/googleapis/go-storage-prelaunch/blob/a5db2abd53775941df67b3337eabaf8d00ef0762/storage/reader.go#L373 .
if length < 0 {
err = fmt.Errorf("length < 0")
} else if offset > size {
err = fmt.Errorf("out of range. offset (%v) > size of content (%v) of %s", offset, size, obj.metadata.Name)
} else if offset <= -size {
offset = 0
length = size
} else if offset < 0 {
offset = size + offset
length = min(length, size-offset)
} else {
length = min(length, size-offset)
}
if err != nil {
// If inputs aren't correct, fail immediately and return callback.
fmrd.err = err
if callback != nil {
callback(offset, 0, err)
}
return
}
// Record this additional goroutine.
fmrd.wg.Add(1)
go func() {
// clear this goroutine from waitgroup.
defer fmrd.wg.Done()
time.Sleep(fmrd.sleepTime)
var n int
n, err = output.Write(obj.data[offset : offset+length])
if err != nil || int64(n) != length {
err = fmt.Errorf("failed to write %v bytes to writer through multi-range-downloader, bytes written = %v, error = %v", length, n, err)
}
if callback != nil {
callback(offset, int64(n), err)
}
// Don't clear pre-existing error in downloader.
if fmrd.err != nil {
fmrd.err = err
}
}()
}