mirror of https://github.com/minio/minio.git
				
				
				
			
		
			
	
	
		
			355 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			355 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | /* | ||
|  |  * 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 "testing" | ||
|  | 
 | ||
|  | // 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 topic arn validation.
 | ||
|  | func TestTopicARN(t *testing.T) { | ||
|  | 	rootPath, err := newTestConfig("us-east-1") | ||
|  | 	if err != nil { | ||
|  | 		t.Fatalf("unable initialize config file, %s", err) | ||
|  | 	} | ||
|  | 	defer removeAll(rootPath) | ||
|  | 
 | ||
|  | 	testCases := []struct { | ||
|  | 		topicARN string | ||
|  | 		errCode  APIErrorCode | ||
|  | 	}{ | ||
|  | 		// Valid minio topic with '1' account id.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:1:minio", | ||
|  | 			errCode:  ErrNone, | ||
|  | 		}, | ||
|  | 		// Valid minio topic with '10' account id.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:10:minio", | ||
|  | 			errCode:  ErrNone, | ||
|  | 		}, | ||
|  | 		// Invalid empty topic  arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 		// Invalid notification service type.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sqs:us-east-1:1:listen", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 		// Invalid region 'us-west-1' in queue arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-west-1:1:listen", | ||
|  | 			errCode:  ErrRegionNotification, | ||
|  | 		}, | ||
|  | 		// Empty topic account id is invalid.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1::listen", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 		// Empty topic account name is invalid.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:10:", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 		// Empty topic account id and account name is invalid.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1::", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 		// Missing topic id and separator missing at the end in topic arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:listen", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 		// Missing topic id and empty string at the end in topic arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:", | ||
|  | 			errCode:  ErrARNNotification, | ||
|  | 		}, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// Validate all topics.
 | ||
|  | 	for i, testCase := range testCases { | ||
|  | 		errCode := checkTopicARN(testCase.topicARN) | ||
|  | 		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("us-east-1") | ||
|  | 	if err != nil { | ||
|  | 		t.Fatalf("unable initialize config file, %s", err) | ||
|  | 	} | ||
|  | 	defer removeAll(rootPath) | ||
|  | 
 | ||
|  | 	testCases := []struct { | ||
|  | 		queueARN string | ||
|  | 		errCode  APIErrorCode | ||
|  | 	}{ | ||
|  | 		// 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 topic arn.
 | ||
|  | func TestUnmarshalTopicARN(t *testing.T) { | ||
|  | 	rootPath, err := newTestConfig("us-east-1") | ||
|  | 	if err != nil { | ||
|  | 		t.Fatalf("unable initialize config file, %s", err) | ||
|  | 	} | ||
|  | 	defer removeAll(rootPath) | ||
|  | 
 | ||
|  | 	testCases := []struct { | ||
|  | 		topicARN string | ||
|  | 		Type     string | ||
|  | 	}{ | ||
|  | 		// Valid minio topic arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:1:listen", | ||
|  | 			Type:     "listen", | ||
|  | 		}, | ||
|  | 		// Invalid empty topic arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "", | ||
|  | 			Type:     "", | ||
|  | 		}, | ||
|  | 		// Invalid region 'us-west-1' in topic arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-west-1:1:listen", | ||
|  | 			Type:     "", | ||
|  | 		}, | ||
|  | 		// Partial topic arn.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:", | ||
|  | 			Type:     "", | ||
|  | 		}, | ||
|  | 		// Invalid topic service value.
 | ||
|  | 		{ | ||
|  | 			topicARN: "arn:minio:sns:us-east-1:1:*", | ||
|  | 			Type:     "", | ||
|  | 		}, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	for i, testCase := range testCases { | ||
|  | 		topic := unmarshalTopicARN(testCase.topicARN) | ||
|  | 		if testCase.Type != topic.Type { | ||
|  | 			t.Errorf("Test %d: Expected \"%s\", got \"%s\"", i+1, testCase.Type, topic.Type) | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // Test unmarshal queue arn.
 | ||
|  | func TestUnmarshalSqsARN(t *testing.T) { | ||
|  | 	rootPath, err := newTestConfig("us-east-1") | ||
|  | 	if err != nil { | ||
|  | 		t.Fatalf("unable initialize config file, %s", err) | ||
|  | 	} | ||
|  | 	defer removeAll(rootPath) | ||
|  | 
 | ||
|  | 	testCases := []struct { | ||
|  | 		queueARN string | ||
|  | 		Type     string | ||
|  | 	}{ | ||
|  | 		// 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) | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | } |