summaryrefslogtreecommitdiff
path: root/client/image_push_test.go
diff options
context:
space:
mode:
authorMichael Crosby <crosbymichael@gmail.com>2016-09-06 11:46:37 -0700
committerMichael Crosby <crosbymichael@gmail.com>2016-09-07 11:05:58 -0700
commit7c36a1af031b510cd990cf488ee5998a3efb450f (patch)
tree477f7c37b71fbc6dc641d7b294b68e17d6c869ec /client/image_push_test.go
parent91e197d614547f0202e6ae9b8a24d88ee131d950 (diff)
downloaddocker-7c36a1af031b510cd990cf488ee5998a3efb450f.tar.gz
Move engine-api client package
This moves the engine-api client package to `/docker/docker/client`. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
Diffstat (limited to 'client/image_push_test.go')
-rw-r--r--client/image_push_test.go180
1 files changed, 180 insertions, 0 deletions
diff --git a/client/image_push_test.go b/client/image_push_test.go
new file mode 100644
index 0000000000..d32f3ef3c7
--- /dev/null
+++ b/client/image_push_test.go
@@ -0,0 +1,180 @@
+package client
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "strings"
+ "testing"
+
+ "golang.org/x/net/context"
+
+ "github.com/docker/docker/api/types"
+)
+
+func TestImagePushReferenceError(t *testing.T) {
+ client := &Client{
+ transport: newMockClient(nil, func(req *http.Request) (*http.Response, error) {
+ return nil, nil
+ }),
+ }
+ // An empty reference is an invalid reference
+ _, err := client.ImagePush(context.Background(), "", types.ImagePushOptions{})
+ if err == nil || err.Error() != "repository name must have at least one component" {
+ t.Fatalf("expected an error, got %v", err)
+ }
+ // An canonical reference cannot be pushed
+ _, err = client.ImagePush(context.Background(), "repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", types.ImagePushOptions{})
+ if err == nil || err.Error() != "cannot push a digest reference" {
+ t.Fatalf("expected an error, got %v", err)
+ }
+}
+
+func TestImagePushAnyError(t *testing.T) {
+ client := &Client{
+ transport: newMockClient(nil, errorMock(http.StatusInternalServerError, "Server error")),
+ }
+ _, err := client.ImagePush(context.Background(), "myimage", types.ImagePushOptions{})
+ if err == nil || err.Error() != "Error response from daemon: Server error" {
+ t.Fatalf("expected a Server Error, got %v", err)
+ }
+}
+
+func TestImagePushStatusUnauthorizedError(t *testing.T) {
+ client := &Client{
+ transport: newMockClient(nil, errorMock(http.StatusUnauthorized, "Unauthorized error")),
+ }
+ _, err := client.ImagePush(context.Background(), "myimage", types.ImagePushOptions{})
+ if err == nil || err.Error() != "Error response from daemon: Unauthorized error" {
+ t.Fatalf("expected an Unauthorized Error, got %v", err)
+ }
+}
+
+func TestImagePushWithUnauthorizedErrorAndPrivilegeFuncError(t *testing.T) {
+ client := &Client{
+ transport: newMockClient(nil, errorMock(http.StatusUnauthorized, "Unauthorized error")),
+ }
+ privilegeFunc := func() (string, error) {
+ return "", fmt.Errorf("Error requesting privilege")
+ }
+ _, err := client.ImagePush(context.Background(), "myimage", types.ImagePushOptions{
+ PrivilegeFunc: privilegeFunc,
+ })
+ if err == nil || err.Error() != "Error requesting privilege" {
+ t.Fatalf("expected an error requesting privilege, got %v", err)
+ }
+}
+
+func TestImagePushWithUnauthorizedErrorAndAnotherUnauthorizedError(t *testing.T) {
+ client := &Client{
+ transport: newMockClient(nil, errorMock(http.StatusUnauthorized, "Unauthorized error")),
+ }
+ privilegeFunc := func() (string, error) {
+ return "a-auth-header", nil
+ }
+ _, err := client.ImagePush(context.Background(), "myimage", types.ImagePushOptions{
+ PrivilegeFunc: privilegeFunc,
+ })
+ if err == nil || err.Error() != "Error response from daemon: Unauthorized error" {
+ t.Fatalf("expected an Unauthorized Error, got %v", err)
+ }
+}
+
+func TestImagePushWithPrivilegedFuncNoError(t *testing.T) {
+ expectedURL := "/images/myimage/push"
+ client := &Client{
+ transport: newMockClient(nil, func(req *http.Request) (*http.Response, error) {
+ if !strings.HasPrefix(req.URL.Path, expectedURL) {
+ return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
+ }
+ auth := req.Header.Get("X-Registry-Auth")
+ if auth == "NotValid" {
+ return &http.Response{
+ StatusCode: http.StatusUnauthorized,
+ Body: ioutil.NopCloser(bytes.NewReader([]byte("Invalid credentials"))),
+ }, nil
+ }
+ if auth != "IAmValid" {
+ return nil, fmt.Errorf("Invalid auth header : expected %s, got %s", "IAmValid", auth)
+ }
+ query := req.URL.Query()
+ tag := query.Get("tag")
+ if tag != "tag" {
+ return nil, fmt.Errorf("tag not set in URL query properly. Expected '%s', got %s", "tag", tag)
+ }
+ return &http.Response{
+ StatusCode: http.StatusOK,
+ Body: ioutil.NopCloser(bytes.NewReader([]byte("hello world"))),
+ }, nil
+ }),
+ }
+ privilegeFunc := func() (string, error) {
+ return "IAmValid", nil
+ }
+ resp, err := client.ImagePush(context.Background(), "myimage:tag", types.ImagePushOptions{
+ RegistryAuth: "NotValid",
+ PrivilegeFunc: privilegeFunc,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ body, err := ioutil.ReadAll(resp)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if string(body) != "hello world" {
+ t.Fatalf("expected 'hello world', got %s", string(body))
+ }
+}
+
+func TestImagePushWithoutErrors(t *testing.T) {
+ expectedOutput := "hello world"
+ expectedURLFormat := "/images/%s/push"
+ pullCases := []struct {
+ reference string
+ expectedImage string
+ expectedTag string
+ }{
+ {
+ reference: "myimage",
+ expectedImage: "myimage",
+ expectedTag: "",
+ },
+ {
+ reference: "myimage:tag",
+ expectedImage: "myimage",
+ expectedTag: "tag",
+ },
+ }
+ for _, pullCase := range pullCases {
+ client := &Client{
+ transport: newMockClient(nil, func(req *http.Request) (*http.Response, error) {
+ expectedURL := fmt.Sprintf(expectedURLFormat, pullCase.expectedImage)
+ if !strings.HasPrefix(req.URL.Path, expectedURL) {
+ return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
+ }
+ query := req.URL.Query()
+ tag := query.Get("tag")
+ if tag != pullCase.expectedTag {
+ return nil, fmt.Errorf("tag not set in URL query properly. Expected '%s', got %s", pullCase.expectedTag, tag)
+ }
+ return &http.Response{
+ StatusCode: http.StatusOK,
+ Body: ioutil.NopCloser(bytes.NewReader([]byte(expectedOutput))),
+ }, nil
+ }),
+ }
+ resp, err := client.ImagePush(context.Background(), pullCase.reference, types.ImagePushOptions{})
+ if err != nil {
+ t.Fatal(err)
+ }
+ body, err := ioutil.ReadAll(resp)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if string(body) != expectedOutput {
+ t.Fatalf("expected '%s', got %s", expectedOutput, string(body))
+ }
+ }
+}