0270bec916
Several API tests were added to ensure correct acceptance of zero-size and empty tar files. This led to several changes in the storage backend around the guarantees of remote file reading, which backs the layer and layer upload type. In support of these changes, zero-length and empty checks have been added to the digest package. These provide a sanity check against upstream tarsum changes. The fileReader has been modified to be more robust when reading and seeking on zero-length or non-existent files. The file no longer needs to exist for the reader to be created. Seeks can now move beyond the end of the file, causing reads to issue an io.EOF. This eliminates errors during certain race conditions for reading files which should be detected by stat calls. As a part of this, a few error types were factored out and the read buffer size was increased to something more reasonable. Signed-off-by: Stephen J Day <stephen.day@docker.com>
107 lines
3.0 KiB
Go
107 lines
3.0 KiB
Go
package digest
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseDigest(t *testing.T) {
|
|
for _, testcase := range []struct {
|
|
input string
|
|
err error
|
|
algorithm string
|
|
hex string
|
|
}{
|
|
{
|
|
input: "tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
|
|
algorithm: "tarsum+sha256",
|
|
hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
|
|
},
|
|
{
|
|
input: "tarsum.dev+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
|
|
algorithm: "tarsum.dev+sha256",
|
|
hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
|
|
},
|
|
{
|
|
input: "tarsum.v1+sha256:220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
|
|
algorithm: "tarsum.v1+sha256",
|
|
hex: "220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e",
|
|
},
|
|
{
|
|
input: "sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
|
|
algorithm: "sha256",
|
|
hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b",
|
|
},
|
|
{
|
|
input: "md5:d41d8cd98f00b204e9800998ecf8427e",
|
|
algorithm: "md5",
|
|
hex: "d41d8cd98f00b204e9800998ecf8427e",
|
|
},
|
|
{
|
|
// empty hex
|
|
input: "sha256:",
|
|
err: ErrDigestInvalidFormat,
|
|
},
|
|
{
|
|
// just hex
|
|
input: "d41d8cd98f00b204e9800998ecf8427e",
|
|
err: ErrDigestInvalidFormat,
|
|
},
|
|
{
|
|
input: "foo:d41d8cd98f00b204e9800998ecf8427e",
|
|
err: ErrDigestUnsupported,
|
|
},
|
|
} {
|
|
digest, err := ParseDigest(testcase.input)
|
|
if err != testcase.err {
|
|
t.Fatalf("error differed from expected while parsing %q: %v != %v", testcase.input, err, testcase.err)
|
|
}
|
|
|
|
if testcase.err != nil {
|
|
continue
|
|
}
|
|
|
|
if digest.Algorithm() != testcase.algorithm {
|
|
t.Fatalf("incorrect algorithm for parsed digest: %q != %q", digest.Algorithm(), testcase.algorithm)
|
|
}
|
|
|
|
if digest.Hex() != testcase.hex {
|
|
t.Fatalf("incorrect hex for parsed digest: %q != %q", digest.Hex(), testcase.hex)
|
|
}
|
|
|
|
// Parse string return value and check equality
|
|
newParsed, err := ParseDigest(digest.String())
|
|
|
|
if err != nil {
|
|
t.Fatalf("unexpected error parsing input %q: %v", testcase.input, err)
|
|
}
|
|
|
|
if newParsed != digest {
|
|
t.Fatalf("expected equal: %q != %q", newParsed, digest)
|
|
}
|
|
}
|
|
}
|
|
|
|
// A few test cases used to fix behavior we expect in storage backend.
|
|
|
|
func TestFromTarArchiveZeroLength(t *testing.T) {
|
|
checkTarsumDigest(t, "zero-length archive", bytes.NewReader([]byte{}), DigestTarSumV1EmptyTar)
|
|
}
|
|
|
|
func TestFromTarArchiveEmptyTar(t *testing.T) {
|
|
// String of 1024 zeros is a valid, empty tar file.
|
|
checkTarsumDigest(t, "1024 zero bytes", bytes.NewReader(bytes.Repeat([]byte("\x00"), 1024)), DigestTarSumV1EmptyTar)
|
|
}
|
|
|
|
func checkTarsumDigest(t *testing.T, msg string, rd io.Reader, expected Digest) {
|
|
dgst, err := FromTarArchive(rd)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error digesting %s: %v", msg, err)
|
|
}
|
|
|
|
if dgst != expected {
|
|
t.Fatalf("unexpected digest for %s: %q != %q", msg, dgst, expected)
|
|
}
|
|
}
|