summaryrefslogtreecommitdiffstats
path: root/pkg/crane/filemap_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/crane/filemap_test.go')
-rw-r--r--pkg/crane/filemap_test.go187
1 files changed, 187 insertions, 0 deletions
diff --git a/pkg/crane/filemap_test.go b/pkg/crane/filemap_test.go
new file mode 100644
index 0000000..21d8d54
--- /dev/null
+++ b/pkg/crane/filemap_test.go
@@ -0,0 +1,187 @@
+// 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 crane_test
+
+import (
+ "archive/tar"
+ "errors"
+ "io"
+ "testing"
+
+ "github.com/google/go-containerregistry/pkg/crane"
+)
+
+func TestLayer(t *testing.T) {
+ tcs := []struct {
+ Name string
+ FileMap map[string][]byte
+ Digest string
+ }{{
+ Name: "Empty contents",
+ Digest: "sha256:89732bc7504122601f40269fc9ddfb70982e633ea9caf641ae45736f2846b004",
+ }, {
+ Name: "One file",
+ FileMap: map[string][]byte{
+ "/test": []byte("testy"),
+ },
+ Digest: "sha256:ec3ff19f471b99a76fb1c339c1dfdaa944a4fba25be6bcdc99fe7e772103079e",
+ }, {
+ Name: "Two files",
+ FileMap: map[string][]byte{
+ "/test": []byte("testy"),
+ "/testalt": []byte("footesty"),
+ },
+ Digest: "sha256:a48bcb7be3ab3ec608ee56eb80901224e19e31dc096cc06a8fd3a8dae1aa8947",
+ }, {
+ Name: "Many files",
+ FileMap: map[string][]byte{
+ "/1": []byte("1"),
+ "/2": []byte("2"),
+ "/3": []byte("3"),
+ "/4": []byte("4"),
+ "/5": []byte("5"),
+ "/6": []byte("6"),
+ "/7": []byte("7"),
+ "/8": []byte("8"),
+ "/9": []byte("9"),
+ },
+ Digest: "sha256:1e637602abbcab2dcedcc24e0b7c19763454a47261f1658b57569530b369ccb9",
+ }}
+
+ for _, tc := range tcs {
+ t.Run(tc.Name, func(t *testing.T) {
+ l, err := crane.Layer(tc.FileMap)
+ if err != nil {
+ t.Fatalf("Error calling layer: %v", err)
+ }
+
+ d, err := l.Digest()
+ if err != nil {
+ t.Fatalf("Error calling digest: %v", err)
+ }
+ if d.String() != tc.Digest {
+ t.Errorf("Incorrect digest, want %q, got %q", tc.Digest, d.String())
+ }
+
+ // Check contents match.
+ rc, err := l.Uncompressed()
+ if err != nil {
+ t.Fatalf("Uncompressed: %v", err)
+ }
+ defer rc.Close()
+ tr := tar.NewReader(rc)
+ saw := map[string]struct{}{}
+ for {
+ th, err := tr.Next()
+ if errors.Is(err, io.EOF) {
+ break
+ }
+ if err != nil {
+ t.Fatalf("Next: %v", err)
+ }
+ saw[th.Name] = struct{}{}
+ want, found := tc.FileMap[th.Name]
+ if !found {
+ t.Errorf("found %q, not in original map", th.Name)
+ continue
+ }
+ got, err := io.ReadAll(tr)
+ if err != nil {
+ t.Fatalf("ReadAll(%q): %v", th.Name, err)
+ }
+ if string(want) != string(got) {
+ t.Errorf("File %q: got %v, want %v", th.Name, string(got), string(want))
+ }
+ }
+ for k := range saw {
+ delete(tc.FileMap, k)
+ }
+ for k := range tc.FileMap {
+ t.Errorf("Layer did not contain %q", k)
+ }
+ })
+ t.Run(tc.Name+" is reproducible", func(t *testing.T) {
+ l1, _ := crane.Layer(tc.FileMap)
+ l2, _ := crane.Layer(tc.FileMap)
+ d1, _ := l1.Digest()
+ d2, _ := l2.Digest()
+ if d1 != d2 {
+ t.Fatalf("Non matching digests, want %q, got %q", d1, d2)
+ }
+ })
+ }
+}
+
+func TestImage(t *testing.T) {
+ tcs := []struct {
+ Name string
+ FileMap map[string][]byte
+ Digest string
+ }{{
+ Name: "Empty contents",
+ Digest: "sha256:98132f58b523c391a5788997327cac95e114e3a6609d01163189774510705399",
+ }, {
+ Name: "One file",
+ FileMap: map[string][]byte{
+ "/test": []byte("testy"),
+ },
+ Digest: "sha256:d905c03ac635172a96c12b8af6c90cfd028e3edaa3114b31a9e196ab38c16963",
+ }, {
+ Name: "Two files",
+ FileMap: map[string][]byte{
+ "/test": []byte("testy"),
+ "/bar": []byte("not useful"),
+ },
+ Digest: "sha256:20e7e4800e5eb167f170970936c08d9e1bcbe91372420eeb6ab8d1a07752c3a3",
+ }, {
+ Name: "Many files",
+ FileMap: map[string][]byte{
+ "/1": []byte("1"),
+ "/2": []byte("2"),
+ "/3": []byte("3"),
+ "/4": []byte("4"),
+ "/5": []byte("5"),
+ "/6": []byte("6"),
+ "/7": []byte("7"),
+ "/8": []byte("8"),
+ "/9": []byte("9"),
+ },
+ Digest: "sha256:dfca2803510c8e3b83a3151f7c035c60cfa2a8a52465b802e18b85014de361f1",
+ }}
+ for _, tc := range tcs {
+ t.Run(tc.Name, func(t *testing.T) {
+ i, err := crane.Image(tc.FileMap)
+ if err != nil {
+ t.Fatalf("Error calling image: %v", err)
+ }
+ d, err := i.Digest()
+ if err != nil {
+ t.Fatalf("Error calling digest: %v", err)
+ }
+ if d.String() != tc.Digest {
+ t.Fatalf("Incorrect digest, want %q, got %q", tc.Digest, d.String())
+ }
+ })
+ t.Run(tc.Name+" is reproducible", func(t *testing.T) {
+ i1, _ := crane.Image(tc.FileMap)
+ i2, _ := crane.Image(tc.FileMap)
+ d1, _ := i1.Digest()
+ d2, _ := i2.Digest()
+ if d1 != d2 {
+ t.Fatalf("Non matching digests, want %q, got %q", d1, d2)
+ }
+ })
+ }
+}