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  }