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