summaryrefslogtreecommitdiffstats
path: root/internal/cmd/edit_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cmd/edit_test.go')
-rw-r--r--internal/cmd/edit_test.go174
1 files changed, 174 insertions, 0 deletions
diff --git a/internal/cmd/edit_test.go b/internal/cmd/edit_test.go
new file mode 100644
index 0000000..df18c45
--- /dev/null
+++ b/internal/cmd/edit_test.go
@@ -0,0 +1,174 @@
+// Copyright 2022 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 cmd
+
+import (
+ "bytes"
+ "io"
+ "net/http/httptest"
+ "net/url"
+ "path"
+ "strings"
+ "testing"
+
+ "github.com/google/go-containerregistry/pkg/crane"
+ "github.com/google/go-containerregistry/pkg/registry"
+ "github.com/google/go-containerregistry/pkg/v1/random"
+)
+
+func mustRegistry(t *testing.T) (*httptest.Server, string) {
+ t.Helper()
+ s := httptest.NewServer(registry.New())
+ u, err := url.Parse(s.URL)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return s, u.Host
+}
+
+func TestEditConfig(t *testing.T) {
+ reg, host := mustRegistry(t)
+ defer reg.Close()
+ src := path.Join(host, "crane/edit/config")
+
+ img, err := random.Image(1024, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := crane.Push(img, src); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := NewCmdEditConfig(&[]crane.Option{})
+ cmd.SetArgs([]string{src})
+ cmd.SetIn(strings.NewReader("{}"))
+
+ if err := cmd.Execute(); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func TestEditManifest(t *testing.T) {
+ reg, host := mustRegistry(t)
+ defer reg.Close()
+ src := path.Join(host, "crane/edit/manifest")
+
+ img, err := random.Image(1024, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := crane.Push(img, src); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := NewCmdEditManifest(&[]crane.Option{})
+ cmd.SetArgs([]string{src})
+ cmd.SetIn(strings.NewReader("{}"))
+ if err := cmd.Execute(); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func TestEditFilesystem(t *testing.T) {
+ reg, host := mustRegistry(t)
+ defer reg.Close()
+ src := path.Join(host, "crane/edit/fs")
+
+ img, err := random.Image(1024, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := crane.Push(img, src); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := NewCmdEditFs(&[]crane.Option{})
+ cmd.SetArgs([]string{src})
+ cmd.Flags().Set("filename", "/foo/bar")
+ cmd.SetIn(strings.NewReader("baz"))
+ if err := cmd.Execute(); err != nil {
+ t.Fatal(err)
+ }
+
+ img, err = crane.Pull(src)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ r, _, err := findFile(img, "/foo/bar")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ got, err := io.ReadAll(r)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !bytes.Equal(got, []byte("baz")) {
+ t.Fatalf("got: %s, want %s", got, "baz")
+ }
+
+ // Edit the same file to make sure we can edit existing files.
+ cmd = NewCmdEditFs(&[]crane.Option{})
+ cmd.SetArgs([]string{src})
+ cmd.Flags().Set("filename", "/foo/bar")
+ cmd.SetIn(strings.NewReader("quux"))
+ if err := cmd.Execute(); err != nil {
+ t.Fatal(err)
+ }
+
+ img, err = crane.Pull(src)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ r, _, err = findFile(img, "/foo/bar")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ got, err = io.ReadAll(r)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !bytes.Equal(got, []byte("quux")) {
+ t.Fatalf("got: %s, want %s", got, "quux")
+ }
+}
+
+func TestFindFile(t *testing.T) {
+ img, err := random.Image(1024, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ r, h, err := findFile(img, "/does-not-exist")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ b, err := io.ReadAll(r)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(b) != 0 {
+ t.Errorf("expected empty reader, got: %s", string(b))
+ }
+
+ if h.Name != "/does-not-exist" {
+ t.Errorf("tar.Header has wrong name: %v", h)
+ }
+}