mirror of https://github.com/minio/minio.git
				
				
				
			
		
			
				
	
	
		
			365 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			365 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
|  * Minio Cloud Storage, (C) 2016, 2017 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 (
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| // Test validates for duplicate configs.
 | |
| func TestCheckDuplicateConfigs(t *testing.T) {
 | |
| 	testCases := []struct {
 | |
| 		qConfigs        []queueConfig
 | |
| 		expectedErrCode APIErrorCode
 | |
| 	}{
 | |
| 		// Error for duplicate queue configs.
 | |
| 		{
 | |
| 			qConfigs: []queueConfig{
 | |
| 				{
 | |
| 					QueueARN: "arn:minio:sqs:us-east-1:1:redis",
 | |
| 				},
 | |
| 				{
 | |
| 					QueueARN: "arn:minio:sqs:us-east-1:1:redis",
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrOverlappingConfigs,
 | |
| 		},
 | |
| 		// Valid queue configs.
 | |
| 		{
 | |
| 			qConfigs: []queueConfig{
 | |
| 				{
 | |
| 					QueueARN: "arn:minio:sqs:us-east-1:1:redis",
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrNone,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	// ... validate for duplicate queue configs.
 | |
| 	for i, testCase := range testCases {
 | |
| 		errCode := checkDuplicateQueueConfigs(testCase.qConfigs)
 | |
| 		if errCode != testCase.expectedErrCode {
 | |
| 			t.Errorf("Test %d: Expected %d, got %d", i+1, testCase.expectedErrCode, errCode)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Tests for validating filter rules.
 | |
| func TestCheckFilterRules(t *testing.T) {
 | |
| 	testCases := []struct {
 | |
| 		rules           []filterRule
 | |
| 		expectedErrCode APIErrorCode
 | |
| 	}{
 | |
| 		// Valid prefix and suffix values.
 | |
| 		{
 | |
| 			rules: []filterRule{
 | |
| 				{
 | |
| 					Name:  "prefix",
 | |
| 					Value: "test/test1",
 | |
| 				},
 | |
| 				{
 | |
| 					Name:  "suffix",
 | |
| 					Value: ".jpg",
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrNone,
 | |
| 		},
 | |
| 		// Invalid filter name.
 | |
| 		{
 | |
| 			rules: []filterRule{
 | |
| 				{
 | |
| 					Name:  "unknown",
 | |
| 					Value: "test/test1",
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrFilterNameInvalid,
 | |
| 		},
 | |
| 		// Cannot have duplicate prefixes.
 | |
| 		{
 | |
| 			rules: []filterRule{
 | |
| 				{
 | |
| 					Name:  "prefix",
 | |
| 					Value: "test/test1",
 | |
| 				},
 | |
| 				{
 | |
| 					Name:  "prefix",
 | |
| 					Value: "test/test1",
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrFilterNamePrefix,
 | |
| 		},
 | |
| 		// Cannot have duplicate suffixes.
 | |
| 		{
 | |
| 			rules: []filterRule{
 | |
| 				{
 | |
| 					Name:  "suffix",
 | |
| 					Value: ".jpg",
 | |
| 				},
 | |
| 				{
 | |
| 					Name:  "suffix",
 | |
| 					Value: ".txt",
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrFilterNameSuffix,
 | |
| 		},
 | |
| 		// Filter value cannot be bigger than > 1024.
 | |
| 		{
 | |
| 			rules: []filterRule{
 | |
| 				{
 | |
| 					Name:  "prefix",
 | |
| 					Value: strings.Repeat("a", 1025),
 | |
| 				},
 | |
| 			},
 | |
| 			expectedErrCode: ErrFilterValueInvalid,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for i, testCase := range testCases {
 | |
| 		errCode := checkFilterRules(testCase.rules)
 | |
| 		if errCode != testCase.expectedErrCode {
 | |
| 			t.Errorf("Test %d: Expected %d, got %d", i+1, testCase.expectedErrCode, errCode)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Tests filter name validation.
 | |
| func TestIsValidFilterName(t *testing.T) {
 | |
| 	testCases := []struct {
 | |
| 		filterName string
 | |
| 		status     bool
 | |
| 	}{
 | |
| 		// Validate if 'prefix' is correct.
 | |
| 		{
 | |
| 			filterName: "prefix",
 | |
| 			status:     true,
 | |
| 		},
 | |
| 		// Validate if 'suffix' is correct.
 | |
| 		{
 | |
| 			filterName: "suffix",
 | |
| 			status:     true,
 | |
| 		},
 | |
| 		// Invalid filter name empty string should return false.
 | |
| 		{
 | |
| 			filterName: "",
 | |
| 			status:     false,
 | |
| 		},
 | |
| 		// Invalid filter name random character should return false.
 | |
| 		{
 | |
| 			filterName: "unknown",
 | |
| 			status:     false,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for i, testCase := range testCases {
 | |
| 		status := isValidFilterName(testCase.filterName)
 | |
| 		if testCase.status != status {
 | |
| 			t.Errorf("Test %d: Expected \"%t\", got \"%t\"", i+1, testCase.status, status)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Tests list of valid and invalid events.
 | |
| func TestValidEvents(t *testing.T) {
 | |
| 	testCases := []struct {
 | |
| 		events  []string
 | |
| 		errCode APIErrorCode
 | |
| 	}{
 | |
| 		// Return error for unknown event element.
 | |
| 		{
 | |
| 			events: []string{
 | |
| 				"s3:UnknownAPI",
 | |
| 			},
 | |
| 			errCode: ErrEventNotification,
 | |
| 		},
 | |
| 		// Return success for supported event.
 | |
| 		{
 | |
| 			events: []string{
 | |
| 				"s3:ObjectCreated:Put",
 | |
| 			},
 | |
| 			errCode: ErrNone,
 | |
| 		},
 | |
| 		// Return success for supported events.
 | |
| 		{
 | |
| 			events: []string{
 | |
| 				"s3:ObjectCreated:*",
 | |
| 				"s3:ObjectRemoved:*",
 | |
| 			},
 | |
| 			errCode: ErrNone,
 | |
| 		},
 | |
| 		// Return error for empty event list.
 | |
| 		{
 | |
| 			events:  []string{""},
 | |
| 			errCode: ErrEventNotification,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for i, testCase := range testCases {
 | |
| 		errCode := checkEvents(testCase.events)
 | |
| 		if testCase.errCode != errCode {
 | |
| 			t.Errorf("Test %d: Expected \"%d\", got \"%d\"", i+1, testCase.errCode, errCode)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Tests queue arn validation.
 | |
| func TestQueueARN(t *testing.T) {
 | |
| 	rootPath, err := newTestConfig(globalMinioDefaultRegion)
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("unable initialize config file, %s", err)
 | |
| 	}
 | |
| 	defer removeAll(rootPath)
 | |
| 
 | |
| 	testCases := []struct {
 | |
| 		queueARN string
 | |
| 		errCode  APIErrorCode
 | |
| 	}{
 | |
| 
 | |
| 		// Valid webhook queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:webhook",
 | |
| 			errCode:  ErrNone,
 | |
| 		},
 | |
| 		// Valid redis queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:redis",
 | |
| 			errCode:  ErrNone,
 | |
| 		},
 | |
| 		// Valid elasticsearch queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:elasticsearch",
 | |
| 			errCode:  ErrNone,
 | |
| 		},
 | |
| 		// Valid amqp queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:amqp",
 | |
| 			errCode:  ErrNone,
 | |
| 		},
 | |
| 		// Invalid empty queue arn.
 | |
| 		{
 | |
| 			queueARN: "",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 		// Invalid notification service type.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sns:us-east-1:1:listen",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 		// Invalid region 'us-west-1' in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-west-1:1:redis",
 | |
| 			errCode:  ErrRegionNotification,
 | |
| 		},
 | |
| 		// Invalid queue name empty in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 		// Invalid queue id empty in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1::redis",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 		// Invalid queue id and queue name empty in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1::",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 		// Missing queue id and separator missing at the end in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:amqp",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 		// Missing queue id and empty string at the end in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:",
 | |
| 			errCode:  ErrARNNotification,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	// Validate all tests for queue arn.
 | |
| 	for i, testCase := range testCases {
 | |
| 		errCode := checkQueueARN(testCase.queueARN)
 | |
| 		if testCase.errCode != errCode {
 | |
| 			t.Errorf("Test %d: Expected \"%d\", got \"%d\"", i+1, testCase.errCode, errCode)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Test unmarshal queue arn.
 | |
| func TestUnmarshalSQSARN(t *testing.T) {
 | |
| 	rootPath, err := newTestConfig(globalMinioDefaultRegion)
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("unable initialize config file, %s", err)
 | |
| 	}
 | |
| 	defer removeAll(rootPath)
 | |
| 
 | |
| 	testCases := []struct {
 | |
| 		queueARN string
 | |
| 		Type     string
 | |
| 	}{
 | |
| 		// Valid webhook queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:webhook",
 | |
| 			Type:     "webhook",
 | |
| 		},
 | |
| 		// Valid redis queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:redis",
 | |
| 			Type:     "redis",
 | |
| 		},
 | |
| 		// Valid elasticsearch queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:elasticsearch",
 | |
| 			Type:     "elasticsearch",
 | |
| 		},
 | |
| 		// Valid amqp queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:amqp",
 | |
| 			Type:     "amqp",
 | |
| 		},
 | |
| 		// Invalid empty queue arn.
 | |
| 		{
 | |
| 			queueARN: "",
 | |
| 			Type:     "",
 | |
| 		},
 | |
| 		// Invalid region 'us-west-1' in queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-west-1:1:redis",
 | |
| 			Type:     "",
 | |
| 		},
 | |
| 		// Partial queue arn.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:",
 | |
| 			Type:     "",
 | |
| 		},
 | |
| 		// Invalid queue service value.
 | |
| 		{
 | |
| 			queueARN: "arn:minio:sqs:us-east-1:1:*",
 | |
| 			Type:     "",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for i, testCase := range testCases {
 | |
| 		mSqs := unmarshalSqsARN(testCase.queueARN)
 | |
| 		if testCase.Type != mSqs.Type {
 | |
| 			t.Errorf("Test %d: Expected \"%s\", got \"%s\"", i+1, testCase.Type, mSqs.Type)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| }
 |