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 }