| 
									
										
										
										
											2016-07-26 15:01:35 +08:00
										 |  |  | /* | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2016-07-26 15:01:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import "testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-17 07:44:44 +08:00
										 |  |  | // Tests for event filter rules.
 | 
					
						
							|  |  |  | func TestFilterMatch(t *testing.T) { | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		objectName        string | 
					
						
							|  |  |  | 		rules             []filterRule | 
					
						
							|  |  |  | 		expectedRuleMatch bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// Prefix matches for a parent.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test1/object.txt", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "prefix", | 
					
						
							|  |  |  | 					Value: "test", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Prefix matches for the object.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test1/object.txt", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "prefix", | 
					
						
							|  |  |  | 					Value: "test/test1/object", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Prefix doesn't match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test1/object.txt", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "prefix", | 
					
						
							|  |  |  | 					Value: "test/test1/object/", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Suffix matches.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test1/object.txt", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "suffix", | 
					
						
							|  |  |  | 					Value: ".txt", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Suffix doesn't match but prefix matches.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test1/object.txt", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "suffix", | 
					
						
							|  |  |  | 					Value: ".jpg", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "prefix", | 
					
						
							|  |  |  | 					Value: "test/test1", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Prefix doesn't match but suffix matches.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test2/object.jpg", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "suffix", | 
					
						
							|  |  |  | 					Value: ".jpg", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "prefix", | 
					
						
							|  |  |  | 					Value: "test/test1", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Suffix and prefix doesn't match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			objectName: "test/test2/object.jpg", | 
					
						
							|  |  |  | 			rules: []filterRule{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "suffix", | 
					
						
							|  |  |  | 					Value: ".txt", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Name:  "prefix", | 
					
						
							|  |  |  | 					Value: "test/test1", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			expectedRuleMatch: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// .. Validate all cases.
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		ruleMatch := filterRuleMatch(testCase.objectName, testCase.rules) | 
					
						
							|  |  |  | 		if ruleMatch != testCase.expectedRuleMatch { | 
					
						
							|  |  |  | 			t.Errorf("Test %d: Expected %t, got %t", i+1, testCase.expectedRuleMatch, ruleMatch) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-26 15:01:35 +08:00
										 |  |  | // Tests all event match.
 | 
					
						
							|  |  |  | func TestEventMatch(t *testing.T) { | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		eventName EventName | 
					
						
							|  |  |  | 		events    []string | 
					
						
							|  |  |  | 		match     bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// Valid object created PUT event.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedPut, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectCreated:Put", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Valid object removed DELETE event.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectRemovedDelete, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectRemoved:Delete", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Invalid events fails to match with empty events.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectRemovedDelete, | 
					
						
							|  |  |  | 			events:    []string{""}, | 
					
						
							|  |  |  | 			match:     false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Invalid events fails to match with valid events.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedCompleteMultipartUpload, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectRemoved:*", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Valid events wild card match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedPut, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectCreated:*", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Valid events wild card match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedPost, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectCreated:*", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Valid events wild card match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedCopy, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectCreated:*", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Valid events wild card match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedCompleteMultipartUpload, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectCreated:*", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Valid events wild card match.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			eventName: ObjectCreatedPut, | 
					
						
							|  |  |  | 			events: []string{ | 
					
						
							|  |  |  | 				"s3:ObjectCreated:*", | 
					
						
							|  |  |  | 				"s3:ObjectRemoved:*", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			match: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2016-08-05 13:01:58 +08:00
										 |  |  | 		ok := eventMatch(testCase.eventName.String(), testCase.events) | 
					
						
							| 
									
										
										
										
											2016-07-26 15:01:35 +08:00
										 |  |  | 		if testCase.match != ok { | 
					
						
							|  |  |  | 			t.Errorf("Test %d: Expected \"%t\", got \"%t\"", i+1, testCase.match, ok) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |