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