func()

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
		}
	}()
}