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  }