Merge branch 'print-error-msg' of https://github.com/k4leung4/distribution into print-error-msg
Changed to use typed error instead of formatted string. Added tests for new public method. Signed-off-by: Kenny Leung <kleung@google.com>master
						commit
						7ff5042c1e
					
				| 
						 | 
					@ -241,7 +241,7 @@ func (th *tokenHandler) fetchToken(params map[string]string) (token *tokenRespon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !client.SuccessStatus(resp.StatusCode) {
 | 
						if !client.SuccessStatus(resp.StatusCode) {
 | 
				
			||||||
		err := client.HandleErrorResponse(resp)
 | 
							err := client.HandleErrorResponse(resp)
 | 
				
			||||||
		return nil, fmt.Errorf("token auth attempt for registry: %s request failed with status: %d %s: %q", req.URL, resp.StatusCode, http.StatusText(resp.StatusCode), err)
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	decoder := json.NewDecoder(resp.Body)
 | 
						decoder := json.NewDecoder(resp.Body)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,89 @@
 | 
				
			||||||
 | 
					package client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type nopCloser struct {
 | 
				
			||||||
 | 
						io.Reader
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (nopCloser) Close() error { return nil }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHandleErrorResponse401ValidBody(t *testing.T) {
 | 
				
			||||||
 | 
						json := "{\"errors\":[{\"code\":\"UNAUTHORIZED\",\"message\":\"action requires authentication\"}]}"
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							Status:     "401 Unauthorized",
 | 
				
			||||||
 | 
							StatusCode: 401,
 | 
				
			||||||
 | 
							Body:       nopCloser{bytes.NewBufferString(json)},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := HandleErrorResponse(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMsg := "unauthorized: action requires authentication"
 | 
				
			||||||
 | 
						if !strings.Contains(err.Error(), expectedMsg) {
 | 
				
			||||||
 | 
							t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHandleErrorResponse401WithInvalidBody(t *testing.T) {
 | 
				
			||||||
 | 
						json := "{invalid json}"
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							Status:     "401 Unauthorized",
 | 
				
			||||||
 | 
							StatusCode: 401,
 | 
				
			||||||
 | 
							Body:       nopCloser{bytes.NewBufferString(json)},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := HandleErrorResponse(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMsg := "unauthorized: authentication required"
 | 
				
			||||||
 | 
						if !strings.Contains(err.Error(), expectedMsg) {
 | 
				
			||||||
 | 
							t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHandleErrorResponseExpectedStatusCode400ValidBody(t *testing.T) {
 | 
				
			||||||
 | 
						json := "{\"errors\":[{\"code\":\"DIGEST_INVALID\",\"message\":\"provided digest does not match\"}]}"
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							Status:     "400 Bad Request",
 | 
				
			||||||
 | 
							StatusCode: 400,
 | 
				
			||||||
 | 
							Body:       nopCloser{bytes.NewBufferString(json)},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := HandleErrorResponse(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMsg := "digest invalid: provided digest does not match"
 | 
				
			||||||
 | 
						if !strings.Contains(err.Error(), expectedMsg) {
 | 
				
			||||||
 | 
							t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHandleErrorResponseExpectedStatusCode404InvalidBody(t *testing.T) {
 | 
				
			||||||
 | 
						json := "{invalid json}"
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							Status:     "404 Not Found",
 | 
				
			||||||
 | 
							StatusCode: 404,
 | 
				
			||||||
 | 
							Body:       nopCloser{bytes.NewBufferString(json)},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := HandleErrorResponse(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMsg := "Error parsing HTTP response: invalid character 'i' looking for beginning of object key string: \"{invalid json}\""
 | 
				
			||||||
 | 
						if !strings.Contains(err.Error(), expectedMsg) {
 | 
				
			||||||
 | 
							t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHandleErrorResponseUnexpectedStatusCode501(t *testing.T) {
 | 
				
			||||||
 | 
						response := &http.Response{
 | 
				
			||||||
 | 
							Status:     "501 Not Implemented",
 | 
				
			||||||
 | 
							StatusCode: 501,
 | 
				
			||||||
 | 
							Body:       nopCloser{bytes.NewBufferString("{\"Error Encountered\" : \"Function not implemented.\"}")},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := HandleErrorResponse(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMsg := "Received unexpected HTTP status: 501 Not Implemented"
 | 
				
			||||||
 | 
						if !strings.Contains(err.Error(), expectedMsg) {
 | 
				
			||||||
 | 
							t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue