(ctx context.Context, f remotes.Fetcher, desc ocispec.Descriptor)
| 1150 | } |
| 1151 | |
| 1152 | func testFetch(ctx context.Context, f remotes.Fetcher, desc ocispec.Descriptor) error { |
| 1153 | r, err := f.Fetch(ctx, desc) |
| 1154 | if err != nil { |
| 1155 | return err |
| 1156 | } |
| 1157 | dgstr := desc.Digest.Algorithm().Digester() |
| 1158 | io.Copy(dgstr.Hash(), r) |
| 1159 | if dgstr.Digest() != desc.Digest { |
| 1160 | return fmt.Errorf("content mismatch: %s != %s", dgstr.Digest(), desc.Digest) |
| 1161 | } |
| 1162 | |
| 1163 | fByDigest, ok := f.(remotes.FetcherByDigest) |
| 1164 | if !ok { |
| 1165 | return fmt.Errorf("fetcher %T does not implement FetcherByDigest", f) |
| 1166 | } |
| 1167 | r2, desc2, err := fByDigest.FetchByDigest(ctx, desc.Digest) |
| 1168 | if err != nil { |
| 1169 | return fmt.Errorf("FetcherByDigest: failed to fetch %v: %w", desc.Digest, err) |
| 1170 | } |
| 1171 | if desc2.Size != desc.Size { |
| 1172 | r2b, err := io.ReadAll(r2) |
| 1173 | if err != nil { |
| 1174 | return fmt.Errorf("FetcherByDigest: size mismatch: %d != %d (content: %v)", desc2.Size, desc.Size, err) |
| 1175 | } |
| 1176 | return fmt.Errorf("FetcherByDigest: size mismatch: %d != %d (content: %q)", desc2.Size, desc.Size, string(r2b)) |
| 1177 | } |
| 1178 | dgstr2 := desc.Digest.Algorithm().Digester() |
| 1179 | if _, err = io.Copy(dgstr2.Hash(), r2); err != nil { |
| 1180 | return fmt.Errorf("FetcherByDigest: failed to copy: %w", err) |
| 1181 | } |
| 1182 | if dgstr2.Digest() != desc.Digest { |
| 1183 | return fmt.Errorf("FetcherByDigest: content mismatch: %s != %s", dgstr2.Digest(), desc.Digest) |
| 1184 | } |
| 1185 | return nil |
| 1186 | } |
| 1187 | |
| 1188 | func testocimanifest(ctx context.Context, f remotes.Fetcher, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { |
| 1189 | r, err := f.Fetch(ctx, desc) |
no test coverage detected
searching dependent graphs…