github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/event/name_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  	"encoding/json"
    22  	"encoding/xml"
    23  	"reflect"
    24  	"testing"
    25  )
    26  
    27  func TestNameExpand(t *testing.T) {
    28  	testCases := []struct {
    29  		name           Name
    30  		expectedResult []Name
    31  	}{
    32  		{BucketCreated, []Name{BucketCreated}},
    33  		{BucketRemoved, []Name{BucketRemoved}},
    34  		{ObjectAccessedAll, []Name{ObjectAccessedGet, ObjectAccessedHead, ObjectAccessedGetRetention, ObjectAccessedGetLegalHold, ObjectAccessedAttributes}},
    35  		{ObjectCreatedAll, []Name{
    36  			ObjectCreatedCompleteMultipartUpload, ObjectCreatedCopy, ObjectCreatedPost, ObjectCreatedPut,
    37  			ObjectCreatedPutRetention, ObjectCreatedPutLegalHold, ObjectCreatedPutTagging, ObjectCreatedDeleteTagging,
    38  		}},
    39  		{ObjectRemovedAll, []Name{ObjectRemovedDelete, ObjectRemovedDeleteMarkerCreated, ObjectRemovedNoOP, ObjectRemovedDeleteAllVersions}},
    40  		{ObjectAccessedHead, []Name{ObjectAccessedHead}},
    41  	}
    42  
    43  	for i, testCase := range testCases {
    44  		result := testCase.name.Expand()
    45  
    46  		if !reflect.DeepEqual(result, testCase.expectedResult) {
    47  			t.Errorf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result)
    48  		}
    49  	}
    50  }
    51  
    52  func TestNameString(t *testing.T) {
    53  	var blankName Name
    54  
    55  	testCases := []struct {
    56  		name           Name
    57  		expectedResult string
    58  	}{
    59  		{BucketCreated, "s3:BucketCreated:*"},
    60  		{BucketRemoved, "s3:BucketRemoved:*"},
    61  		{ObjectAccessedAll, "s3:ObjectAccessed:*"},
    62  		{ObjectAccessedGet, "s3:ObjectAccessed:Get"},
    63  		{ObjectAccessedHead, "s3:ObjectAccessed:Head"},
    64  		{ObjectCreatedAll, "s3:ObjectCreated:*"},
    65  		{ObjectCreatedCompleteMultipartUpload, "s3:ObjectCreated:CompleteMultipartUpload"},
    66  		{ObjectCreatedCopy, "s3:ObjectCreated:Copy"},
    67  		{ObjectCreatedPost, "s3:ObjectCreated:Post"},
    68  		{ObjectCreatedPut, "s3:ObjectCreated:Put"},
    69  		{ObjectRemovedAll, "s3:ObjectRemoved:*"},
    70  		{ObjectRemovedDelete, "s3:ObjectRemoved:Delete"},
    71  		{ObjectRemovedNoOP, "s3:ObjectRemoved:NoOP"},
    72  		{ObjectCreatedPutRetention, "s3:ObjectCreated:PutRetention"},
    73  		{ObjectCreatedPutLegalHold, "s3:ObjectCreated:PutLegalHold"},
    74  		{ObjectAccessedGetRetention, "s3:ObjectAccessed:GetRetention"},
    75  		{ObjectAccessedGetLegalHold, "s3:ObjectAccessed:GetLegalHold"},
    76  
    77  		{blankName, ""},
    78  	}
    79  
    80  	for i, testCase := range testCases {
    81  		result := testCase.name.String()
    82  
    83  		if result != testCase.expectedResult {
    84  			t.Fatalf("test %v: result: expected: %v, got: %v", i+1, testCase.expectedResult, result)
    85  		}
    86  	}
    87  }
    88  
    89  func TestNameMarshalXML(t *testing.T) {
    90  	var blankName Name
    91  
    92  	testCases := []struct {
    93  		name         Name
    94  		expectedData []byte
    95  		expectErr    bool
    96  	}{
    97  		{ObjectAccessedAll, []byte("<Name>s3:ObjectAccessed:*</Name>"), false},
    98  		{ObjectRemovedDelete, []byte("<Name>s3:ObjectRemoved:Delete</Name>"), false},
    99  		{ObjectRemovedNoOP, []byte("<Name>s3:ObjectRemoved:NoOP</Name>"), false},
   100  		{blankName, []byte("<Name></Name>"), false},
   101  	}
   102  
   103  	for i, testCase := range testCases {
   104  		data, err := xml.Marshal(testCase.name)
   105  		expectErr := (err != nil)
   106  
   107  		if expectErr != testCase.expectErr {
   108  			t.Fatalf("test %v: error: expected: %v, got: %v", i+1, testCase.expectErr, expectErr)
   109  		}
   110  
   111  		if !testCase.expectErr {
   112  			if !reflect.DeepEqual(data, testCase.expectedData) {
   113  				t.Fatalf("test %v: data: expected: %v, got: %v", i+1, string(testCase.expectedData), string(data))
   114  			}
   115  		}
   116  	}
   117  }
   118  
   119  func TestNameUnmarshalXML(t *testing.T) {
   120  	var blankName Name
   121  
   122  	testCases := []struct {
   123  		data         []byte
   124  		expectedName Name
   125  		expectErr    bool
   126  	}{
   127  		{[]byte("<Name>s3:ObjectAccessed:*</Name>"), ObjectAccessedAll, false},
   128  		{[]byte("<Name>s3:ObjectRemoved:Delete</Name>"), ObjectRemovedDelete, false},
   129  		{[]byte("<Name>s3:ObjectRemoved:NoOP</Name>"), ObjectRemovedNoOP, false},
   130  		{[]byte("<Name></Name>"), blankName, true},
   131  	}
   132  
   133  	for i, testCase := range testCases {
   134  		var name Name
   135  		err := xml.Unmarshal(testCase.data, &name)
   136  		expectErr := (err != nil)
   137  
   138  		if expectErr != testCase.expectErr {
   139  			t.Fatalf("test %v: error: expected: %v, got: %v", i+1, testCase.expectErr, expectErr)
   140  		}
   141  
   142  		if !testCase.expectErr {
   143  			if !reflect.DeepEqual(name, testCase.expectedName) {
   144  				t.Fatalf("test %v: data: expected: %v, got: %v", i+1, testCase.expectedName, name)
   145  			}
   146  		}
   147  	}
   148  }
   149  
   150  func TestNameMarshalJSON(t *testing.T) {
   151  	var blankName Name
   152  
   153  	testCases := []struct {
   154  		name         Name
   155  		expectedData []byte
   156  		expectErr    bool
   157  	}{
   158  		{ObjectAccessedAll, []byte(`"s3:ObjectAccessed:*"`), false},
   159  		{ObjectRemovedDelete, []byte(`"s3:ObjectRemoved:Delete"`), false},
   160  		{ObjectRemovedNoOP, []byte(`"s3:ObjectRemoved:NoOP"`), false},
   161  		{blankName, []byte(`""`), false},
   162  	}
   163  
   164  	for i, testCase := range testCases {
   165  		data, err := json.Marshal(testCase.name)
   166  		expectErr := (err != nil)
   167  
   168  		if expectErr != testCase.expectErr {
   169  			t.Fatalf("test %v: error: expected: %v, got: %v", i+1, testCase.expectErr, expectErr)
   170  		}
   171  
   172  		if !testCase.expectErr {
   173  			if !reflect.DeepEqual(data, testCase.expectedData) {
   174  				t.Fatalf("test %v: data: expected: %v, got: %v", i+1, string(testCase.expectedData), string(data))
   175  			}
   176  		}
   177  	}
   178  }
   179  
   180  func TestNameUnmarshalJSON(t *testing.T) {
   181  	var blankName Name
   182  
   183  	testCases := []struct {
   184  		data         []byte
   185  		expectedName Name
   186  		expectErr    bool
   187  	}{
   188  		{[]byte(`"s3:ObjectAccessed:*"`), ObjectAccessedAll, false},
   189  		{[]byte(`"s3:ObjectRemoved:Delete"`), ObjectRemovedDelete, false},
   190  		{[]byte(`"s3:ObjectRemoved:NoOP"`), ObjectRemovedNoOP, false},
   191  		{[]byte(`""`), blankName, true},
   192  	}
   193  
   194  	for i, testCase := range testCases {
   195  		var name Name
   196  		err := json.Unmarshal(testCase.data, &name)
   197  		expectErr := (err != nil)
   198  
   199  		if expectErr != testCase.expectErr {
   200  			t.Fatalf("test %v: error: expected: %v, got: %v", i+1, testCase.expectErr, expectErr)
   201  		}
   202  
   203  		if !testCase.expectErr {
   204  			if !reflect.DeepEqual(name, testCase.expectedName) {
   205  				t.Fatalf("test %v: data: expected: %v, got: %v", i+1, testCase.expectedName, name)
   206  			}
   207  		}
   208  	}
   209  }
   210  
   211  func TestParseName(t *testing.T) {
   212  	var blankName Name
   213  
   214  	testCases := []struct {
   215  		s            string
   216  		expectedName Name
   217  		expectErr    bool
   218  	}{
   219  		{"s3:ObjectAccessed:*", ObjectAccessedAll, false},
   220  		{"s3:ObjectRemoved:Delete", ObjectRemovedDelete, false},
   221  		{"s3:ObjectRemoved:NoOP", ObjectRemovedNoOP, false},
   222  		{"", blankName, true},
   223  	}
   224  
   225  	for i, testCase := range testCases {
   226  		name, err := ParseName(testCase.s)
   227  		expectErr := (err != nil)
   228  
   229  		if expectErr != testCase.expectErr {
   230  			t.Fatalf("test %v: error: expected: %v, got: %v", i+1, testCase.expectErr, expectErr)
   231  		}
   232  
   233  		if !testCase.expectErr {
   234  			if !reflect.DeepEqual(name, testCase.expectedName) {
   235  				t.Fatalf("test %v: data: expected: %v, got: %v", i+1, testCase.expectedName, name)
   236  			}
   237  		}
   238  	}
   239  }