summaryrefslogtreecommitdiffstats
path: root/pkg/name/digest_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/name/digest_test.go')
-rw-r--r--pkg/name/digest_test.go152
1 files changed, 152 insertions, 0 deletions
diff --git a/pkg/name/digest_test.go b/pkg/name/digest_test.go
new file mode 100644
index 0000000..85775cc
--- /dev/null
+++ b/pkg/name/digest_test.go
@@ -0,0 +1,152 @@
+// Copyright 2018 Google LLC All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package name
+
+import (
+ "path"
+ "strings"
+ "testing"
+)
+
+const validDigest = "sha256:deadb33fdeadb33fdeadb33fdeadb33fdeadb33fdeadb33fdeadb33fdeadb33f"
+
+var goodStrictValidationDigestNames = []string{
+ "gcr.io/g-convoy/hello-world@" + validDigest,
+ "gcr.io/google.com/project-id/hello-world@" + validDigest,
+ "us.gcr.io/project-id/sub-repo@" + validDigest,
+ "example.text/foo/bar@" + validDigest,
+}
+
+var goodStrictValidationTagDigestNames = []string{
+ "example.text/foo/bar:latest@" + validDigest,
+ "example.text:8443/foo/bar:latest@" + validDigest,
+ "example.text/foo/bar:v1.0.0-alpine@" + validDigest,
+}
+
+var goodWeakValidationDigestNames = []string{
+ "namespace/pathcomponent/image@" + validDigest,
+ "library/ubuntu@" + validDigest,
+}
+
+var goodWeakValidationTagDigestNames = []string{
+ "nginx:latest@" + validDigest,
+ "library/nginx:latest@" + validDigest,
+}
+
+var badDigestNames = []string{
+ "gcr.io/project-id/unknown-alg@unknown:abc123",
+ "gcr.io/project-id/wrong-length@sha256:d34db33fd34db33f",
+ "gcr.io/project-id/missing-digest@",
+ // https://github.com/google/go-containerregistry/issues/1394
+ "repo@sha256:" + strings.Repeat(":", 64),
+ "repo@sha256:" + strings.Repeat("sh", 32),
+ "repo@sha256:" + validDigest + "@" + validDigest,
+}
+
+func TestNewDigestStrictValidation(t *testing.T) {
+ t.Parallel()
+
+ for _, name := range goodStrictValidationDigestNames {
+ if digest, err := NewDigest(name, StrictValidation); err != nil {
+ t.Errorf("`%s` should be a valid Digest name, got error: %v", name, err)
+ } else if digest.Name() != name {
+ t.Errorf("`%v` .Name() should reproduce the original name. Wanted: %s Got: %s", digest, name, digest.Name())
+ }
+ }
+
+ for _, name := range goodStrictValidationTagDigestNames {
+ if _, err := NewDigest(name, StrictValidation); err != nil {
+ t.Errorf("`%s` should be a valid Digest name, got error: %v", name, err)
+ }
+ }
+
+ for _, name := range append(goodWeakValidationDigestNames, badDigestNames...) {
+ if repo, err := NewDigest(name, StrictValidation); err == nil {
+ t.Errorf("`%s` should be an invalid Digest name, got Digest: %#v", name, repo)
+ }
+ }
+}
+
+func TestNewDigest(t *testing.T) {
+ t.Parallel()
+
+ for _, name := range append(goodStrictValidationDigestNames, append(goodWeakValidationDigestNames, goodWeakValidationTagDigestNames...)...) {
+ if _, err := NewDigest(name, WeakValidation); err != nil {
+ t.Errorf("`%s` should be a valid Digest name, got error: %v", name, err)
+ }
+ }
+
+ for _, name := range badDigestNames {
+ if repo, err := NewDigest(name, WeakValidation); err == nil {
+ t.Errorf("`%s` should be an invalid Digest name, got Digest: %#v", name, repo)
+ }
+ }
+}
+
+func TestDigestComponents(t *testing.T) {
+ t.Parallel()
+ testRegistry := "gcr.io"
+ testRepository := "project-id/image"
+ fullRepo := path.Join(testRegistry, testRepository)
+
+ digestNameStr := testRegistry + "/" + testRepository + "@" + validDigest
+ digest, err := NewDigest(digestNameStr, StrictValidation)
+ if err != nil {
+ t.Fatalf("`%s` should be a valid Digest name, got error: %v", digestNameStr, err)
+ }
+
+ if got := digest.String(); got != digestNameStr {
+ t.Errorf("String() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, digestNameStr, got)
+ }
+ if got := digest.Identifier(); got != validDigest {
+ t.Errorf("Identifier() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, validDigest, got)
+ }
+ actualRegistry := digest.RegistryStr()
+ if actualRegistry != testRegistry {
+ t.Errorf("RegistryStr() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, testRegistry, actualRegistry)
+ }
+ actualRepository := digest.RepositoryStr()
+ if actualRepository != testRepository {
+ t.Errorf("RepositoryStr() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, testRepository, actualRepository)
+ }
+ contextRepo := digest.Context().String()
+ if contextRepo != fullRepo {
+ t.Errorf("Context().String() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, fullRepo, contextRepo)
+ }
+ actualDigest := digest.DigestStr()
+ if actualDigest != validDigest {
+ t.Errorf("DigestStr() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, validDigest, actualDigest)
+ }
+}
+
+func TestDigestScopes(t *testing.T) {
+ t.Parallel()
+ testRegistry := "gcr.io"
+ testRepo := "project-id/image"
+ testAction := "pull"
+
+ expectedScope := strings.Join([]string{"repository", testRepo, testAction}, ":")
+
+ digestNameStr := testRegistry + "/" + testRepo + "@" + validDigest
+ digest, err := NewDigest(digestNameStr, StrictValidation)
+ if err != nil {
+ t.Fatalf("`%s` should be a valid Digest name, got error: %v", digestNameStr, err)
+ }
+
+ actualScope := digest.Scope(testAction)
+ if actualScope != expectedScope {
+ t.Errorf("scope was incorrect for %v. Wanted: `%s` Got: `%s`", digest, expectedScope, actualScope)
+ }
+}