in go/pkg/fakes/cas.go [61:122]
func (f *Reader) Read(req *bspb.ReadRequest, stream bsgrpc.ByteStream_ReadServer) error {
path := strings.Split(req.ResourceName, "/")
if (len(path) != 4 && len(path) != 5) || path[0] != "instance" || (path[1] != "blobs" && path[1] != "compressed-blobs") {
return status.Error(codes.InvalidArgument, "test fake expected resource name of the form \"instance/blobs|compressed-blobs/<compressor?>/<hash>/<size>\"")
}
// indexOffset for all 2+ paths - `compressed-blobs` has one more URI element.
indexOffset := 0
if path[1] == "compressed-blobs" {
indexOffset = 1
}
dg := digest.NewFromBlob(f.Blob)
if path[2+indexOffset] != dg.Hash || path[3+indexOffset] != strconv.FormatInt(dg.Size, 10) {
return status.Errorf(codes.NotFound, "test fake only has blob with digest %s, but %s/%s was requested", dg, path[2+indexOffset], path[3+indexOffset])
}
offset := req.ReadOffset
limit := req.ReadLimit
blob := f.Blob
chunks := f.Chunks
if path[1] == "compressed-blobs" {
if !f.ExpectCompressed {
return status.Errorf(codes.FailedPrecondition, "fake expected a call with uncompressed bytes")
}
if path[2] != "zstd" {
return status.Error(codes.InvalidArgument, "test fake expected valid compressor, eg zstd")
}
blob = zstdEncoder.EncodeAll(blob[offset:], nil)
offset = 0
// For simplicity in coordinating test server & client, compressed blobs are returned as
// one chunk.
chunks = []int{len(blob)}
} else if f.ExpectCompressed {
return status.Errorf(codes.FailedPrecondition, "fake expected a call with compressed bytes")
}
for len(chunks) > 0 {
buf := blob[:chunks[0]]
if offset >= int64(len(buf)) {
offset -= int64(len(buf))
} else {
if offset > 0 {
buf = buf[offset:]
offset = 0
}
if limit > 0 {
if limit < int64(len(buf)) {
buf = buf[:limit]
}
limit -= int64(len(buf))
}
if err := stream.Send(&bspb.ReadResponse{Data: buf}); err != nil {
return err
}
if limit == 0 && req.ReadLimit != 0 {
break
}
}
blob = blob[chunks[0]:]
chunks = chunks[1:]
}
return nil
}