Merge pull request #2918 from dmathieu/test-blob-writer-write
Test httpBlobUpload.Write methodmaster
						commit
						740d4d1211
					
				|  | @ -8,7 +8,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"github.com/docker/distribution" | 	"github.com/docker/distribution" | ||||||
| 	"github.com/docker/distribution/registry/api/errcode" | 	"github.com/docker/distribution/registry/api/errcode" | ||||||
| 	"github.com/docker/distribution/registry/api/v2" | 	v2 "github.com/docker/distribution/registry/api/v2" | ||||||
| 	"github.com/docker/distribution/testutil" | 	"github.com/docker/distribution/testutil" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -297,3 +297,198 @@ func TestUploadSize(t *testing.T) { | ||||||
| 		t.Fatalf("Wrong size returned from Size: %d, expected 64", blobUpload.Size()) | 		t.Fatalf("Wrong size returned from Size: %d, expected 64", blobUpload.Size()) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestUploadWrite(t *testing.T) { | ||||||
|  | 	_, b := newRandomBlob(64) | ||||||
|  | 	repo := "test/upload/write" | ||||||
|  | 	locationPath := fmt.Sprintf("/v2/%s/uploads/testid", repo) | ||||||
|  | 
 | ||||||
|  | 	m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "GET", | ||||||
|  | 				Route:  "/v2/", | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusOK, | ||||||
|  | 				Headers: http.Header(map[string][]string{ | ||||||
|  | 					"Docker-Distribution-API-Version": {"registry/2.0"}, | ||||||
|  | 				}), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		// Test Valid case
 | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "PATCH", | ||||||
|  | 				Route:  locationPath, | ||||||
|  | 				Body:   b, | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusAccepted, | ||||||
|  | 				Headers: http.Header(map[string][]string{ | ||||||
|  | 					"Docker-Upload-UUID": {"46603072-7a1b-4b41-98f9-fd8a7da89f9b"}, | ||||||
|  | 					"Location":           {locationPath}, | ||||||
|  | 					"Range":              {"0-63"}, | ||||||
|  | 				}), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		// Test invalid range
 | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "PATCH", | ||||||
|  | 				Route:  locationPath, | ||||||
|  | 				Body:   b, | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusAccepted, | ||||||
|  | 				Headers: http.Header(map[string][]string{ | ||||||
|  | 					"Docker-Upload-UUID": {"46603072-7a1b-4b41-98f9-fd8a7da89f9b"}, | ||||||
|  | 					"Location":           {locationPath}, | ||||||
|  | 					"Range":              {""}, | ||||||
|  | 				}), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		// Test 404
 | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "PATCH", | ||||||
|  | 				Route:  locationPath, | ||||||
|  | 				Body:   b, | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusNotFound, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		// Test 400 valid json
 | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "PATCH", | ||||||
|  | 				Route:  locationPath, | ||||||
|  | 				Body:   b, | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusBadRequest, | ||||||
|  | 				Body: []byte(` | ||||||
|  | 					{ "errors": | ||||||
|  | 						[ | ||||||
|  | 							{ | ||||||
|  | 								"code": "BLOB_UPLOAD_INVALID", | ||||||
|  | 								"message": "blob upload invalid", | ||||||
|  | 								"detail": "more detail" | ||||||
|  | 							} | ||||||
|  | 						] | ||||||
|  | 					} `), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		// Test 400 invalid json
 | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "PATCH", | ||||||
|  | 				Route:  locationPath, | ||||||
|  | 				Body:   b, | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusBadRequest, | ||||||
|  | 				Body:       []byte("something bad happened"), | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		// Test 500
 | ||||||
|  | 		{ | ||||||
|  | 			Request: testutil.Request{ | ||||||
|  | 				Method: "PATCH", | ||||||
|  | 				Route:  locationPath, | ||||||
|  | 				Body:   b, | ||||||
|  | 			}, | ||||||
|  | 			Response: testutil.Response{ | ||||||
|  | 				StatusCode: http.StatusInternalServerError, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	e, c := testServer(m) | ||||||
|  | 	defer c() | ||||||
|  | 
 | ||||||
|  | 	blobUpload := &httpBlobUpload{ | ||||||
|  | 		client: &http.Client{}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Valid case
 | ||||||
|  | 	blobUpload.location = e + locationPath | ||||||
|  | 	n, err := blobUpload.Write(b) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatalf("Error calling Write: %s", err) | ||||||
|  | 	} | ||||||
|  | 	if n != 64 { | ||||||
|  | 		t.Fatalf("Wrong length returned from Write: %d, expected 64", n) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Bad range
 | ||||||
|  | 	blobUpload.location = e + locationPath | ||||||
|  | 	_, err = blobUpload.Write(b) | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Fatalf("Expected error when bad range received") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 404
 | ||||||
|  | 	blobUpload.location = e + locationPath | ||||||
|  | 	_, err = blobUpload.Write(b) | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Fatalf("Expected error when not found") | ||||||
|  | 	} | ||||||
|  | 	if err != distribution.ErrBlobUploadUnknown { | ||||||
|  | 		t.Fatalf("Wrong error thrown: %s, expected %s", err, distribution.ErrBlobUploadUnknown) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 400 valid json
 | ||||||
|  | 	blobUpload.location = e + locationPath | ||||||
|  | 	_, err = blobUpload.Write(b) | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Fatalf("Expected error when not found") | ||||||
|  | 	} | ||||||
|  | 	if uploadErr, ok := err.(errcode.Errors); !ok { | ||||||
|  | 		t.Fatalf("Wrong error type %T: %s", err, err) | ||||||
|  | 	} else if len(uploadErr) != 1 { | ||||||
|  | 		t.Fatalf("Unexpected number of errors: %d, expected 1", len(uploadErr)) | ||||||
|  | 	} else { | ||||||
|  | 		v2Err, ok := uploadErr[0].(errcode.Error) | ||||||
|  | 		if !ok { | ||||||
|  | 			t.Fatalf("Not an 'Error' type: %#v", uploadErr[0]) | ||||||
|  | 		} | ||||||
|  | 		if v2Err.Code != v2.ErrorCodeBlobUploadInvalid { | ||||||
|  | 			t.Fatalf("Unexpected error code: %s, expected %d", v2Err.Code.String(), v2.ErrorCodeBlobUploadInvalid) | ||||||
|  | 		} | ||||||
|  | 		if expected := "blob upload invalid"; v2Err.Message != expected { | ||||||
|  | 			t.Fatalf("Unexpected error message: %q, expected %q", v2Err.Message, expected) | ||||||
|  | 		} | ||||||
|  | 		if expected := "more detail"; v2Err.Detail.(string) != expected { | ||||||
|  | 			t.Fatalf("Unexpected error message: %q, expected %q", v2Err.Detail.(string), expected) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 400 invalid json
 | ||||||
|  | 	blobUpload.location = e + locationPath | ||||||
|  | 	_, err = blobUpload.Write(b) | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Fatalf("Expected error when not found") | ||||||
|  | 	} | ||||||
|  | 	if uploadErr, ok := err.(*UnexpectedHTTPResponseError); !ok { | ||||||
|  | 		t.Fatalf("Wrong error type %T: %s", err, err) | ||||||
|  | 	} else { | ||||||
|  | 		respStr := string(uploadErr.Response) | ||||||
|  | 		if expected := "something bad happened"; respStr != expected { | ||||||
|  | 			t.Fatalf("Unexpected response string: %s, expected: %s", respStr, expected) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 500
 | ||||||
|  | 	blobUpload.location = e + locationPath | ||||||
|  | 	_, err = blobUpload.Write(b) | ||||||
|  | 	if err == nil { | ||||||
|  | 		t.Fatalf("Expected error when not found") | ||||||
|  | 	} | ||||||
|  | 	if uploadErr, ok := err.(*UnexpectedHTTPStatusError); !ok { | ||||||
|  | 		t.Fatalf("Wrong error type %T: %s", err, err) | ||||||
|  | 	} else if expected := "500 " + http.StatusText(http.StatusInternalServerError); uploadErr.Status != expected { | ||||||
|  | 		t.Fatalf("Unexpected response status: %s, expected %s", uploadErr.Status, expected) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue