github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/client/image_tag_test.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 "io" 8 "net/http" 9 "strings" 10 "testing" 11 12 "github.com/docker/docker/errdefs" 13 ) 14 15 func TestImageTagError(t *testing.T) { 16 client := &Client{ 17 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 18 } 19 20 err := client.ImageTag(context.Background(), "image_id", "repo:tag") 21 if !errdefs.IsSystem(err) { 22 t.Fatalf("expected a Server Error, got %[1]T: %[1]v", err) 23 } 24 } 25 26 // Note: this is not testing all the InvalidReference as it's the responsibility 27 // of distribution/reference package. 28 func TestImageTagInvalidReference(t *testing.T) { 29 client := &Client{ 30 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 31 } 32 33 err := client.ImageTag(context.Background(), "image_id", "aa/asdf$$^/aa") 34 if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag: invalid reference format` { 35 t.Fatalf("expected ErrReferenceInvalidFormat, got %v", err) 36 } 37 } 38 39 func TestImageTagInvalidSourceImageName(t *testing.T) { 40 client := &Client{ 41 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 42 } 43 44 err := client.ImageTag(context.Background(), "invalid_source_image_name_", "repo:tag") 45 if err == nil || err.Error() != "Error parsing reference: \"invalid_source_image_name_\" is not a valid repository/tag: invalid reference format" { 46 t.Fatalf("expected Parsing Reference Error, got %v", err) 47 } 48 } 49 50 func TestImageTagHexSource(t *testing.T) { 51 client := &Client{ 52 client: newMockClient(errorMock(http.StatusOK, "OK")), 53 } 54 55 err := client.ImageTag(context.Background(), "0d409d33b27e47423b049f7f863faa08655a8c901749c2b25b93ca67d01a470d", "repo:tag") 56 if err != nil { 57 t.Fatalf("got error: %v", err) 58 } 59 } 60 61 func TestImageTag(t *testing.T) { 62 expectedURL := "/images/image_id/tag" 63 tagCases := []struct { 64 reference string 65 expectedQueryParams map[string]string 66 }{ 67 { 68 reference: "repository:tag1", 69 expectedQueryParams: map[string]string{ 70 "repo": "repository", 71 "tag": "tag1", 72 }, 73 }, { 74 reference: "another_repository:latest", 75 expectedQueryParams: map[string]string{ 76 "repo": "another_repository", 77 "tag": "latest", 78 }, 79 }, { 80 reference: "another_repository", 81 expectedQueryParams: map[string]string{ 82 "repo": "another_repository", 83 "tag": "latest", 84 }, 85 }, { 86 reference: "test/another_repository", 87 expectedQueryParams: map[string]string{ 88 "repo": "test/another_repository", 89 "tag": "latest", 90 }, 91 }, { 92 reference: "test/another_repository:tag1", 93 expectedQueryParams: map[string]string{ 94 "repo": "test/another_repository", 95 "tag": "tag1", 96 }, 97 }, { 98 reference: "test/test/another_repository:tag1", 99 expectedQueryParams: map[string]string{ 100 "repo": "test/test/another_repository", 101 "tag": "tag1", 102 }, 103 }, { 104 reference: "test:5000/test/another_repository:tag1", 105 expectedQueryParams: map[string]string{ 106 "repo": "test:5000/test/another_repository", 107 "tag": "tag1", 108 }, 109 }, { 110 reference: "test:5000/test/another_repository", 111 expectedQueryParams: map[string]string{ 112 "repo": "test:5000/test/another_repository", 113 "tag": "latest", 114 }, 115 }, 116 } 117 for _, tagCase := range tagCases { 118 client := &Client{ 119 client: newMockClient(func(req *http.Request) (*http.Response, error) { 120 if !strings.HasPrefix(req.URL.Path, expectedURL) { 121 return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL) 122 } 123 if req.Method != http.MethodPost { 124 return nil, fmt.Errorf("expected POST method, got %s", req.Method) 125 } 126 query := req.URL.Query() 127 for key, expected := range tagCase.expectedQueryParams { 128 actual := query.Get(key) 129 if actual != expected { 130 return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) 131 } 132 } 133 return &http.Response{ 134 StatusCode: http.StatusOK, 135 Body: io.NopCloser(bytes.NewReader([]byte(""))), 136 }, nil 137 }), 138 } 139 err := client.ImageTag(context.Background(), "image_id", tagCase.reference) 140 if err != nil { 141 t.Fatal(err) 142 } 143 } 144 }