/*
 * 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,
		},
		{
			NotSupported{},
			ErrNotSupported,
		},
		{
			NotImplemented{},
			ErrNotImplemented,
		},
		{
			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)
		}
	}
}
