github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/event/rules_test.go (about) 1 // Copyright (c) 2015-2021 MinIO, Inc. 2 // 3 // This file is part of MinIO Object Storage stack 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package event 19 20 import ( 21 "reflect" 22 "testing" 23 ) 24 25 func TestNewPattern(t *testing.T) { 26 testCases := []struct { 27 prefix string 28 suffix string 29 expectedResult string 30 }{ 31 {"", "", ""}, 32 {"*", "", "*"}, 33 {"", "*", "*"}, 34 {"images/", "", "images/*"}, 35 {"images/*", "", "images/*"}, 36 {"", "jpg", "*jpg"}, 37 {"", "*jpg", "*jpg"}, 38 {"images/", "jpg", "images/*jpg"}, 39 {"images/*", "jpg", "images/*jpg"}, 40 {"images/", "*jpg", "images/*jpg"}, 41 {"images/*", "*jpg", "images/*jpg"}, 42 {"201*/images/", "jpg", "201*/images/*jpg"}, 43 } 44 45 for i, testCase := range testCases { 46 result := NewPattern(testCase.prefix, testCase.suffix) 47 48 if result != testCase.expectedResult { 49 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 50 } 51 } 52 } 53 54 func TestRulesAdd(t *testing.T) { 55 rulesCase1 := make(Rules) 56 57 rulesCase2 := make(Rules) 58 rulesCase2.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 59 60 rulesCase3 := make(Rules) 61 rulesCase3.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 62 63 rulesCase4 := make(Rules) 64 rulesCase4.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 65 66 rulesCase5 := make(Rules) 67 68 rulesCase6 := make(Rules) 69 rulesCase6.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 70 71 rulesCase7 := make(Rules) 72 rulesCase7.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 73 74 rulesCase8 := make(Rules) 75 rulesCase8.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 76 77 testCases := []struct { 78 rules Rules 79 pattern string 80 targetID TargetID 81 expectedResult int 82 }{ 83 {rulesCase1, NewPattern("*", ""), TargetID{"1", "webhook"}, 1}, 84 {rulesCase2, NewPattern("*", ""), TargetID{"2", "amqp"}, 2}, 85 {rulesCase3, NewPattern("2010*", ""), TargetID{"1", "webhook"}, 1}, 86 {rulesCase4, NewPattern("*", ""), TargetID{"1", "webhook"}, 2}, 87 {rulesCase5, NewPattern("", "*.jpg"), TargetID{"1", "webhook"}, 1}, 88 {rulesCase6, NewPattern("", "*"), TargetID{"2", "amqp"}, 2}, 89 {rulesCase7, NewPattern("", "*.jpg"), TargetID{"1", "webhook"}, 1}, 90 {rulesCase8, NewPattern("", "*.jpg"), TargetID{"1", "webhook"}, 2}, 91 } 92 93 for i, testCase := range testCases { 94 testCase.rules.Add(testCase.pattern, testCase.targetID) 95 result := len(testCase.rules) 96 97 if result != testCase.expectedResult { 98 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 99 } 100 } 101 } 102 103 func TestRulesMatch(t *testing.T) { 104 rulesCase1 := make(Rules) 105 106 rulesCase2 := make(Rules) 107 rulesCase2.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 108 109 rulesCase3 := make(Rules) 110 rulesCase3.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 111 rulesCase3.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 112 113 rulesCase4 := make(Rules) 114 rulesCase4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 115 116 testCases := []struct { 117 rules Rules 118 objectName string 119 expectedResult TargetIDSet 120 }{ 121 {rulesCase1, "photos.jpg", NewTargetIDSet()}, 122 {rulesCase2, "photos.jpg", NewTargetIDSet(TargetID{"1", "webhook"})}, 123 {rulesCase3, "2010/photos.jpg", NewTargetIDSet(TargetID{"1", "webhook"})}, 124 {rulesCase4, "2000/photos.jpg", NewTargetIDSet()}, 125 } 126 127 for i, testCase := range testCases { 128 result := testCase.rules.Match(testCase.objectName) 129 130 if !reflect.DeepEqual(testCase.expectedResult, result) { 131 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 132 } 133 } 134 } 135 136 func TestRulesClone(t *testing.T) { 137 rulesCase1 := make(Rules) 138 139 rulesCase2 := make(Rules) 140 rulesCase2.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 141 142 rulesCase3 := make(Rules) 143 rulesCase3.Add(NewPattern("", "*.jpg"), TargetID{"1", "webhook"}) 144 145 testCases := []struct { 146 rules Rules 147 prefix string 148 targetID TargetID 149 }{ 150 {rulesCase1, "2010*", TargetID{"1", "webhook"}}, 151 {rulesCase2, "2000*", TargetID{"2", "amqp"}}, 152 {rulesCase3, "2010*", TargetID{"1", "webhook"}}, 153 } 154 155 for i, testCase := range testCases { 156 result := testCase.rules.Clone() 157 158 if !reflect.DeepEqual(result, testCase.rules) { 159 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.rules, result) 160 } 161 162 result.Add(NewPattern(testCase.prefix, ""), testCase.targetID) 163 if reflect.DeepEqual(result, testCase.rules) { 164 t.Fatalf("test %v: result: expected: not equal, got: equal", i+1) 165 } 166 } 167 } 168 169 func TestRulesUnion(t *testing.T) { 170 rulesCase1 := make(Rules) 171 rules2Case1 := make(Rules) 172 expectedResultCase1 := make(Rules) 173 174 rulesCase2 := make(Rules) 175 rules2Case2 := make(Rules) 176 rules2Case2.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 177 expectedResultCase2 := make(Rules) 178 expectedResultCase2.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 179 180 rulesCase3 := make(Rules) 181 rulesCase3.Add(NewPattern("", "*"), TargetID{"1", "webhook"}) 182 rules2Case3 := make(Rules) 183 expectedResultCase3 := make(Rules) 184 expectedResultCase3.Add(NewPattern("", "*"), TargetID{"1", "webhook"}) 185 186 rulesCase4 := make(Rules) 187 rulesCase4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 188 rules2Case4 := make(Rules) 189 rules2Case4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 190 expectedResultCase4 := make(Rules) 191 expectedResultCase4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 192 193 rulesCase5 := make(Rules) 194 rulesCase5.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 195 rulesCase5.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 196 rules2Case5 := make(Rules) 197 rules2Case5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 198 expectedResultCase5 := make(Rules) 199 expectedResultCase5.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 200 expectedResultCase5.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 201 expectedResultCase5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 202 203 testCases := []struct { 204 rules Rules 205 rules2 Rules 206 expectedResult Rules 207 }{ 208 {rulesCase1, rules2Case1, expectedResultCase1}, 209 {rulesCase2, rules2Case2, expectedResultCase2}, 210 {rulesCase3, rules2Case3, expectedResultCase3}, 211 {rulesCase4, rules2Case4, expectedResultCase4}, 212 {rulesCase5, rules2Case5, expectedResultCase5}, 213 } 214 215 for i, testCase := range testCases { 216 result := testCase.rules.Union(testCase.rules2) 217 218 if !reflect.DeepEqual(testCase.expectedResult, result) { 219 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 220 } 221 } 222 } 223 224 func TestRulesDifference(t *testing.T) { 225 rulesCase1 := make(Rules) 226 rules2Case1 := make(Rules) 227 expectedResultCase1 := make(Rules) 228 229 rulesCase2 := make(Rules) 230 rules2Case2 := make(Rules) 231 rules2Case2.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 232 expectedResultCase2 := make(Rules) 233 234 rulesCase3 := make(Rules) 235 rulesCase3.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 236 rules2Case3 := make(Rules) 237 expectedResultCase3 := make(Rules) 238 expectedResultCase3.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 239 240 rulesCase4 := make(Rules) 241 rulesCase4.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 242 rules2Case4 := make(Rules) 243 rules2Case4.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 244 rules2Case4.Add(NewPattern("", "*.png"), TargetID{"2", "amqp"}) 245 expectedResultCase4 := make(Rules) 246 expectedResultCase4.Add(NewPattern("*", "*"), TargetID{"1", "webhook"}) 247 248 rulesCase5 := make(Rules) 249 rulesCase5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 250 rulesCase5.Add(NewPattern("", "*"), TargetID{"2", "amqp"}) 251 rules2Case5 := make(Rules) 252 rules2Case5.Add(NewPattern("2010*", ""), TargetID{"1", "webhook"}) 253 rules2Case5.Add(NewPattern("", "*"), TargetID{"2", "amqp"}) 254 expectedResultCase5 := make(Rules) 255 expectedResultCase5.Add(NewPattern("*", ""), TargetID{"1", "webhook"}) 256 257 testCases := []struct { 258 rules Rules 259 rules2 Rules 260 expectedResult Rules 261 }{ 262 {rulesCase1, rules2Case1, expectedResultCase1}, 263 {rulesCase2, rules2Case2, expectedResultCase2}, 264 {rulesCase3, rules2Case3, expectedResultCase3}, 265 {rulesCase4, rules2Case4, expectedResultCase4}, 266 {rulesCase5, rules2Case5, expectedResultCase5}, 267 } 268 269 for i, testCase := range testCases { 270 result := testCase.rules.Difference(testCase.rules2) 271 272 if !reflect.DeepEqual(testCase.expectedResult, result) { 273 t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result) 274 } 275 } 276 }