diff options
Diffstat (limited to 'pkg/v1/daemon/image_test.go')
-rw-r--r-- | pkg/v1/daemon/image_test.go | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/pkg/v1/daemon/image_test.go b/pkg/v1/daemon/image_test.go new file mode 100644 index 0000000..6456832 --- /dev/null +++ b/pkg/v1/daemon/image_test.go @@ -0,0 +1,159 @@ +// 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 daemon + +import ( + "context" + "errors" + "fmt" + "io" + "os" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/google/go-containerregistry/internal/compare" + "github.com/google/go-containerregistry/pkg/name" + "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/google/go-containerregistry/pkg/v1/validate" +) + +var imagePath = "../tarball/testdata/test_image_1.tar" + +type MockClient struct { + Client + path string + negotiated bool + + wantCtx context.Context + + loadErr error + loadBody io.ReadCloser + + saveErr error + saveBody io.ReadCloser +} + +func (m *MockClient) NegotiateAPIVersion(ctx context.Context) { + m.negotiated = true +} + +func (m *MockClient) ImageSave(_ context.Context, _ []string) (io.ReadCloser, error) { + if !m.negotiated { + return nil, errors.New("you forgot to call NegotiateAPIVersion before calling ImageSave") + } + + if m.path != "" { + return os.Open(m.path) + } + + return m.saveBody, m.saveErr +} + +func (m *MockClient) ImageInspectWithRaw(context.Context, string) (types.ImageInspect, []byte, error) { + return types.ImageInspect{ + ID: "sha256:6e0b05049ed9c17d02e1a55e80d6599dbfcce7f4f4b022e3c673e685789c470e", + }, nil, nil +} + +func TestImage(t *testing.T) { + for _, tc := range []struct { + name string + buffered bool + client *MockClient + wantResponse string + wantErr string + }{{ + name: "success", + client: &MockClient{ + path: imagePath, + }, + }, { + name: "save err", + client: &MockClient{ + saveBody: io.NopCloser(strings.NewReader("Loaded")), + saveErr: fmt.Errorf("locked and loaded"), + }, + wantErr: "locked and loaded", + }, { + name: "read err", + client: &MockClient{ + saveBody: io.NopCloser(&errReader{fmt.Errorf("goodbye, world")}), + }, + wantErr: "goodbye, world", + }} { + run := func(t *testing.T) { + opts := []Option{WithClient(tc.client)} + if tc.buffered { + opts = append(opts, WithBufferedOpener()) + } else { + opts = append(opts, WithUnbufferedOpener()) + } + img, err := tarball.ImageFromPath(imagePath, nil) + if err != nil { + t.Fatalf("error loading test image: %s", err) + } + + tag, err := name.NewTag("unused", name.WeakValidation) + if err != nil { + t.Fatalf("error creating test name: %s", err) + } + + dmn, err := Image(tag, opts...) + if err != nil { + if tc.wantErr == "" { + t.Errorf("Error loading daemon image: %s", err) + } else if !strings.Contains(err.Error(), tc.wantErr) { + t.Errorf("wanted %s to contain %s", err.Error(), tc.wantErr) + } + return + } + err = compare.Images(img, dmn) + if err != nil { + if tc.wantErr == "" { + t.Errorf("compare.Images: %v", err) + } else if !strings.Contains(err.Error(), tc.wantErr) { + t.Errorf("wanted %s to contain %s", err.Error(), tc.wantErr) + } + } + + err = validate.Image(dmn) + if err != nil { + if tc.wantErr == "" { + t.Errorf("validate.Image: %v", err) + } else if !strings.Contains(err.Error(), tc.wantErr) { + t.Errorf("wanted %s to contain %s", err.Error(), tc.wantErr) + } + } + } + + tc.buffered = true + t.Run(tc.name+" buffered", run) + + tc.buffered = false + t.Run(tc.name+" unbuffered", run) + } +} + +func TestImageDefaultClient(t *testing.T) { + wantErr := fmt.Errorf("bad client") + defaultClient = func() (Client, error) { + return nil, wantErr + } + + if _, err := Image(name.MustParseReference("unused")); !errors.Is(err, wantErr) { + t.Errorf("Image(): want %v; got %v", wantErr, err) + } +} |