diff --git a/cmd/api-errors.go b/cmd/api-errors.go index 0632682a5..192500ae8 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -48,7 +48,6 @@ const ( ErrNone APIErrorCode = iota ErrAccessDenied ErrBadDigest - ErrBucketAlreadyExists ErrEntityTooSmall ErrEntityTooLarge ErrIncompleteBody @@ -193,11 +192,6 @@ var errorCodeResponse = map[APIErrorCode]APIError{ Description: "The Content-Md5 you specified did not match what we received.", HTTPStatusCode: http.StatusBadRequest, }, - ErrBucketAlreadyExists: { - Code: "BucketAlreadyExists", - Description: "The requested bucket name is not available.", - HTTPStatusCode: http.StatusConflict, - }, ErrEntityTooSmall: { Code: "EntityTooSmall", Description: "Your proposed upload is smaller than the minimum allowed object size.", @@ -613,6 +607,14 @@ func toAPIErrorCode(err error) (apiErr APIErrorCode) { apiErr = ErrWriteQuorum case InsufficientReadQuorum: apiErr = ErrReadQuorum + case UnsupportedDelimiter: + apiErr = ErrNotImplemented + case InvalidMarkerPrefixCombination: + apiErr = ErrNotImplemented + case InvalidUploadIDKeyCombination: + apiErr = ErrNotImplemented + case MalformedUploadID: + apiErr = ErrNoSuchUpload case PartTooSmall: apiErr = ErrEntityTooSmall default: diff --git a/cmd/api-errors_test.go b/cmd/api-errors_test.go new file mode 100644 index 000000000..ca5f653ec --- /dev/null +++ b/cmd/api-errors_test.go @@ -0,0 +1,135 @@ +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package cmd + +import ( + "errors" + "testing" +) + +func TestAPIErrCode(t *testing.T) { + testCases := []struct { + err error + errCode APIErrorCode + }{ + // Valid cases. + { + BadDigest{}, + ErrBadDigest, + }, + { + IncompleteBody{}, + ErrIncompleteBody, + }, + { + ObjectExistsAsDirectory{}, + ErrObjectExistsAsDirectory, + }, + { + BucketNameInvalid{}, + ErrInvalidBucketName, + }, + { + BucketExists{}, + ErrBucketAlreadyOwnedByYou, + }, + { + ObjectNotFound{}, + ErrNoSuchKey, + }, + { + ObjectNameInvalid{}, + ErrInvalidObjectName, + }, + { + InvalidUploadID{}, + ErrNoSuchUpload, + }, + { + InvalidPart{}, + ErrInvalidPart, + }, + { + InsufficientReadQuorum{}, + ErrReadQuorum, + }, + { + InsufficientWriteQuorum{}, + ErrWriteQuorum, + }, + { + UnsupportedDelimiter{}, + ErrNotImplemented, + }, + { + InvalidMarkerPrefixCombination{}, + ErrNotImplemented, + }, + { + InvalidUploadIDKeyCombination{}, + ErrNotImplemented, + }, + { + MalformedUploadID{}, + ErrNoSuchUpload, + }, + { + PartTooSmall{}, + ErrEntityTooSmall, + }, + { + BucketNotEmpty{}, + ErrBucketNotEmpty, + }, + { + BucketNotFound{}, + ErrNoSuchBucket, + }, + { + StorageFull{}, + ErrStorageFull, + }, + { + errSignatureMismatch, + ErrSignatureDoesNotMatch, + }, + { + errContentSHA256Mismatch, + ErrContentSHA256Mismatch, + }, // End of all valid cases. + + // Case where err is nil. + { + nil, + ErrNone, + }, + + // Case where err type is unknown. + { + errors.New("Custom error"), + ErrInternalError, + }, + } + + // Validate all the errors with their API error codes. + for i, testCase := range testCases { + errCode := toAPIErrorCode(testCase.err) + if errCode != testCase.errCode { + t.Errorf("Test %d: Expected error code %d, got %d", i+1, testCase.errCode, errCode) + } + } +} diff --git a/cmd/bucket-handlers_test.go b/cmd/bucket-handlers_test.go index aa89287a8..60b693ac8 100644 --- a/cmd/bucket-handlers_test.go +++ b/cmd/bucket-handlers_test.go @@ -202,7 +202,7 @@ func testHeadBucketHandler(obj ObjectLayer, instanceType string, t TestErrHandle // Wrapper for calling TestListMultipartUploadsHandler tests for both XL multiple disks and single node setup. func TestListMultipartUploadsHandler(t *testing.T) { - ExecObjectLayerTest(t, testListMultipartUploads) + ExecObjectLayerTest(t, testListMultipartUploadsHandler) } // testListMultipartUploadsHandler - Tests validate listing of multipart uploads. @@ -253,12 +253,12 @@ func testListMultipartUploadsHandler(obj ObjectLayer, instanceType string, t Tes // 2 - bucket not found. {"volatile-bucket-1", "", "", "", "", "0", http.StatusNotFound, false}, // 3 - invalid delimiter. - {bucketName, "", "", "", "-", "0", http.StatusBadRequest, false}, + {bucketName, "", "", "", "-", "0", http.StatusNotImplemented, false}, // 4 - invalid prefix and marker combination. {bucketName, "asia", "europe-object", "", "", "0", http.StatusNotImplemented, false}, // 5 - invalid upload id and marker combination. - {bucketName, "asia", "asia/europe/", "abc", "", "0", http.StatusBadRequest, false}, - // 6 - invalid max upload id. + {bucketName, "asia", "asia/europe/", "abc", "", "0", http.StatusNotImplemented, false}, + // 6 - invalid max uploads. {bucketName, "", "", "", "", "-1", http.StatusBadRequest, false}, // 7 - good case delimiter. {bucketName, "", "", "", "/", "100", http.StatusOK, true},