storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/pkg/event/rules_test.go (about) 1 /* 2 * MinIO Cloud Storage, (C) 2018 MinIO, Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package event 18 19 import ( 20 "reflect" 21 "testing" 22 ) 23 24 func TestNewPattern(t *testing.T) { 25 testCases := []struct { 26 prefix string 27 suffix string 28 expectedResult string 29 }{ 30 {"", "", ""}, 31 {"*", "", "*"}, 32 {"", "*", "*"}, 33 {"images/", "", "images/*"}, 34 {"images/*", "", "images/*"}, 35 {"", "jpg", "*jpg"}, 36 {"", "*jpg", "*jpg"}, 37 {"images/", "jpg", "images/*jpg"}, 38 {"images/*", "jpg", "images/*jpg"}, 39 {"images/", "*jpg", "images/*jpg"}, 40 {"images/*", "*jpg", "images/*jpg"}, 41 {"201*/images/", "jpg", "201*/images/*jpg"}, 42 } 43 44 for i, testCase := range testCases { 45 result := NewPattern(testCase.prefix, testCase.suffix) 46 47 if result != testCase.expectedResult { 48 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 49 } 50 } 51 } 52 53 func TestRulesAdd(t *testing.T) { 54 rulesCase1 := make(Rules) 55 56 rulesCase2 := make(Rules) 57 rulesCase2.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 58 59 rulesCase3 := make(Rules) 60 rulesCase3.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 61 62 rulesCase4 := make(Rules) 63 rulesCase4.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 64 65 rulesCase5 := make(Rules) 66 67 rulesCase6 := make(Rules) 68 rulesCase6.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 69 70 rulesCase7 := make(Rules) 71 rulesCase7.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 72 73 rulesCase8 := make(Rules) 74 rulesCase8.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 75 76 testCases := []struct { 77 rules Rules 78 pattern string 79 targetID TargetID 80 expectedResult int 81 }{ 82 {rulesCase1, NewPattern("*", ""), TargetID{"1", "webhook"}, 1}, 83 {rulesCase2, NewPattern("*", ""), TargetID{"2", "amqp"}, 2}, 84 {rulesCase3, NewPattern("2010*", ""), TargetID{"1", "webhook"}, 1}, 85 {rulesCase4, NewPattern("*", ""), TargetID{"1", "webhook"}, 2}, 86 {rulesCase5, NewPattern("", "*.jpg"), TargetID{"1", "webhook"}, 1}, 87 {rulesCase6, NewPattern("", "*"), TargetID{"2", "amqp"}, 2}, 88 {rulesCase7, NewPattern("", "*.jpg"), TargetID{"1", "webhook"}, 1}, 89 {rulesCase8, NewPattern("", "*.jpg"), TargetID{"1", "webhook"}, 2}, 90 } 91 92 for i, testCase := range testCases { 93 testCase.rules.Add(testCase.pattern, testCase.targetID) 94 result := len(testCase.rules) 95 96 if result != testCase.expectedResult { 97 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 98 } 99 } 100 } 101 102 func TestRulesMatch(t *testing.T) { 103 rulesCase1 := make(Rules) 104 105 rulesCase2 := make(Rules) 106 rulesCase2.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 107 108 rulesCase3 := make(Rules) 109 rulesCase3.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 110 rulesCase3.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 111 112 rulesCase4 := make(Rules) 113 rulesCase4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 114 115 testCases := []struct { 116 rules Rules 117 objectName string 118 expectedResult TargetIDSet 119 }{ 120 {rulesCase1, "photos.jpg", NewTargetIDSet()}, 121 {rulesCase2, "photos.jpg", NewTargetIDSet(TargetID{"1", "webhook"})}, 122 {rulesCase3, "2010/photos.jpg", NewTargetIDSet(TargetID{"1", "webhook"})}, 123 {rulesCase4, "2000/photos.jpg", NewTargetIDSet()}, 124 } 125 126 for i, testCase := range testCases { 127 result := testCase.rules.Match(testCase.objectName) 128 129 if !reflect.DeepEqual(testCase.expectedResult, result) { 130 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 131 } 132 } 133 } 134 135 func TestRulesClone(t *testing.T) { 136 rulesCase1 := make(Rules) 137 138 rulesCase2 := make(Rules) 139 rulesCase2.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 140 141 rulesCase3 := make(Rules) 142 rulesCase3.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 143 144 testCases := []struct { 145 rules Rules 146 prefix string 147 targetID TargetID 148 }{ 149 {rulesCase1, "2010*", TargetID{"1", "webhook"}}, 150 {rulesCase2, "2000*", TargetID{"2", "amqp"}}, 151 {rulesCase3, "2010*", TargetID{"1", "webhook"}}, 152 } 153 154 for i, testCase := range testCases { 155 result := testCase.rules.Clone() 156 157 if !reflect.DeepEqual(result, testCase.rules) { 158 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.rules, result) 159 } 160 161 result.Add(NewPattern(testCase.prefix, ""), testCase.targetID) 162 if reflect.DeepEqual(result, testCase.rules) { 163 t.Fatalf("test %v: result: expected: not equal, got: equal", i+1) 164 } 165 } 166 } 167 168 func TestRulesUnion(t *testing.T) { 169 rulesCase1 := make(Rules) 170 rules2Case1 := make(Rules) 171 expectedResultCase1 := make(Rules) 172 173 rulesCase2 := make(Rules) 174 rules2Case2 := make(Rules) 175 rules2Case2.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 176 expectedResultCase2 := make(Rules) 177 expectedResultCase2.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 178 179 rulesCase3 := make(Rules) 180 rulesCase3.Add(NewPattern("", "*"), TargetID{"1", "webhook"}) 181 rules2Case3 := make(Rules) 182 expectedResultCase3 := make(Rules) 183 expectedResultCase3.Add(NewPattern("", "*"), TargetID{"1", "webhook"}) 184 185 rulesCase4 := make(Rules) 186 rulesCase4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 187 rules2Case4 := make(Rules) 188 rules2Case4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 189 expectedResultCase4 := make(Rules) 190 expectedResultCase4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 191 192 rulesCase5 := make(Rules) 193 rulesCase5.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 194 rulesCase5.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 195 rules2Case5 := make(Rules) 196 rules2Case5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 197 expectedResultCase5 := make(Rules) 198 expectedResultCase5.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 199 expectedResultCase5.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 200 expectedResultCase5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 201 202 testCases := []struct { 203 rules Rules 204 rules2 Rules 205 expectedResult Rules 206 }{ 207 {rulesCase1, rules2Case1, expectedResultCase1}, 208 {rulesCase2, rules2Case2, expectedResultCase2}, 209 {rulesCase3, rules2Case3, expectedResultCase3}, 210 {rulesCase4, rules2Case4, expectedResultCase4}, 211 {rulesCase5, rules2Case5, expectedResultCase5}, 212 } 213 214 for i, testCase := range testCases { 215 result := testCase.rules.Union(testCase.rules2) 216 217 if !reflect.DeepEqual(testCase.expectedResult, result) { 218 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 219 } 220 } 221 } 222 223 func TestRulesDifference(t *testing.T) { 224 rulesCase1 := make(Rules) 225 rules2Case1 := make(Rules) 226 expectedResultCase1 := make(Rules) 227 228 rulesCase2 := make(Rules) 229 rules2Case2 := make(Rules) 230 rules2Case2.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 231 expectedResultCase2 := make(Rules) 232 233 rulesCase3 := make(Rules) 234 rulesCase3.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 235 rules2Case3 := make(Rules) 236 expectedResultCase3 := make(Rules) 237 expectedResultCase3.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 238 239 rulesCase4 := make(Rules) 240 rulesCase4.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 241 rules2Case4 := make(Rules) 242 rules2Case4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 243 rules2Case4.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 244 expectedResultCase4 := make(Rules) 245 expectedResultCase4.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 246 247 rulesCase5 := make(Rules) 248 rulesCase5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 249 rulesCase5.Add(NewPattern("", "*"), TargetID{"2", "amqp"}) 250 rules2Case5 := make(Rules) 251 rules2Case5.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 252 rules2Case5.Add(NewPattern("", "*"), TargetID{"2", "amqp"}) 253 expectedResultCase5 := make(Rules) 254 expectedResultCase5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 255 256 testCases := []struct { 257 rules Rules 258 rules2 Rules 259 expectedResult Rules 260 }{ 261 {rulesCase1, rules2Case1, expectedResultCase1}, 262 {rulesCase2, rules2Case2, expectedResultCase2}, 263 {rulesCase3, rules2Case3, expectedResultCase3}, 264 {rulesCase4, rules2Case4, expectedResultCase4}, 265 {rulesCase5, rules2Case5, expectedResultCase5}, 266 } 267 268 for i, testCase := range testCases { 269 result := testCase.rules.Difference(testCase.rules2) 270 271 if !reflect.DeepEqual(testCase.expectedResult, result) { 272 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 273 } 274 } 275 }