github.com/cs3org/reva/v2@v2.27.7/pkg/storagespace/storagespace_test.go (about) 1 // Copyright 2018-2021 CERN 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // In applying this license, CERN does not waive the privileges and immunities 16 // granted to it by virtue of its status as an Intergovernmental Organization 17 // or submit itself to any jurisdiction. 18 19 package storagespace 20 21 import ( 22 "errors" 23 "testing" 24 25 provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" 26 "github.com/cs3org/reva/v2/pkg/utils" 27 ) 28 29 func TestSplitStorageID(t *testing.T) { 30 tests := []struct { 31 input string 32 expected []string 33 }{ 34 { 35 "storageid" + _storageIDDelimiter + "spaceid", 36 []string{"storageid", "spaceid"}, 37 }, 38 { 39 "", 40 nil, 41 }, 42 { 43 "spaceid", 44 []string{"", "spaceid"}, 45 }, 46 } 47 48 for _, tt := range tests { 49 storageID, spaceID := SplitStorageID(tt.input) 50 switch { 51 case tt.expected == nil: 52 if spaceID != "" || storageID != "" { 53 t.Errorf("Expected unwrap to return nil, got '%s' '%s'", spaceID, storageID) 54 } 55 case len(tt.expected) != 2: 56 t.Error("testcase won't work with len(expected) != 2. Avoiding panic") 57 case storageID != tt.expected[0]: 58 t.Errorf("StorageID doesn't match, expected '%s' got '%s'", tt.expected[0], storageID) 59 case spaceID != tt.expected[1]: 60 t.Errorf("ProviderID doesn't match, expected '%s' got '%s'", tt.expected[1], spaceID) 61 } 62 } 63 64 } 65 66 func TestParseID(t *testing.T) { 67 tests := []struct { 68 input string 69 expected *provider.ResourceId 70 expectedErr error 71 }{ 72 { 73 "spaceid" + _idDelimiter + "opaqueid", 74 &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, 75 nil, 76 }, 77 { 78 "storageid" + _storageIDDelimiter + "spaceid" + _idDelimiter + "opaqueid", 79 &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, 80 nil, 81 }, 82 { 83 "", 84 &provider.ResourceId{}, 85 ErrInvalidSpaceID, 86 }, 87 { 88 "spaceid", 89 &provider.ResourceId{SpaceId: "spaceid"}, 90 nil, 91 }, 92 } 93 94 for _, tt := range tests { 95 rid, err := ParseID(tt.input) 96 switch { 97 case tt.expectedErr != nil: 98 if !errors.Is(err, tt.expectedErr) { 99 t.Errorf("Expected ParseID to return error %s, got %s", tt.expectedErr, err) 100 } 101 case rid.StorageId != tt.expected.StorageId: 102 t.Errorf("StorageIDs don't match. Expected %s, got %s", tt.expected.StorageId, rid.StorageId) 103 case rid.SpaceId != tt.expected.SpaceId: 104 t.Errorf("SpaceIDs don't match. Expected %s, got %s", tt.expected.SpaceId, rid.SpaceId) 105 case rid.OpaqueId != tt.expected.OpaqueId: 106 t.Errorf("OpaqueIDs don't match. Expected %s, got %s", tt.expected.OpaqueId, rid.OpaqueId) 107 } 108 } 109 110 } 111 112 func TestFormatResourceID(t *testing.T) { 113 expected := "spaceid" + _idDelimiter + "opaqueid" 114 wrapped := FormatResourceID(&provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}) 115 116 if wrapped != expected { 117 t.Errorf("wrapped id doesn't have the expected format: got %s expected %s", wrapped, expected) 118 } 119 } 120 121 func TestFormatStorageID(t *testing.T) { 122 expected := "storageid" + _storageIDDelimiter + "spaceid" 123 wrapped := FormatStorageID("storageid", "spaceid") 124 125 if wrapped != expected { 126 t.Errorf("wrapped id doesn't have the expected format: got %s expected %s", wrapped, expected) 127 } 128 } 129 130 func TestParseStorageSpaceReference(t *testing.T) { 131 tests := []struct { 132 sRef string 133 resourceID *provider.ResourceId 134 relPath string 135 expectedErr error 136 }{ 137 { 138 "1234$abcd!5678/f1/f2", 139 &provider.ResourceId{ 140 StorageId: "1234", 141 SpaceId: "abcd", 142 OpaqueId: "5678", 143 }, 144 "./f1/f2", 145 nil, 146 }, 147 { 148 "1234!abcd", 149 &provider.ResourceId{ 150 SpaceId: "1234", 151 OpaqueId: "abcd", 152 }, 153 ".", 154 nil, 155 }, 156 { 157 "01234$56789!abcd", 158 &provider.ResourceId{ 159 StorageId: "01234", 160 SpaceId: "56789", 161 OpaqueId: "abcd", 162 }, 163 ".", 164 nil, 165 }, 166 { 167 "", 168 nil, 169 "", 170 ErrInvalidSpaceID, 171 }, 172 { 173 "01234$abcd", 174 &provider.ResourceId{ 175 StorageId: "01234", 176 SpaceId: "abcd", 177 OpaqueId: "", 178 }, 179 ".", 180 nil, 181 }, 182 { 183 "01234$!5678", 184 &provider.ResourceId{ 185 StorageId: "01234", 186 SpaceId: "", 187 OpaqueId: "5678", 188 }, 189 ".", 190 nil, 191 }, 192 { 193 "/f1/f2", 194 nil, 195 "", 196 ErrInvalidSpaceID, 197 }, 198 } 199 for _, tt := range tests { 200 ref, err := ParseReference(tt.sRef) 201 202 if !errors.Is(err, tt.expectedErr) { 203 t.Errorf("Expected error %s got %s", tt.expectedErr, err) 204 } 205 if ref.ResourceId != nil && !utils.ResourceIDEqual(ref.ResourceId, tt.resourceID) { 206 t.Errorf("Expected ResourceID %s got %s", tt.resourceID, ref.ResourceId) 207 } 208 if ref.ResourceId == nil && tt.resourceID != nil { 209 t.Errorf("Expected ResourceID to be %s got %s", tt.resourceID, ref.ResourceId) 210 } 211 if ref.Path != tt.relPath { 212 t.Errorf("Expected path %s got %s", tt.relPath, ref.Path) 213 } 214 } 215 } 216 217 func TestFormatStorageSpaceReference(t *testing.T) { 218 tests := []struct { 219 ref *provider.Reference 220 expected string 221 expectedErr error 222 }{ 223 { 224 ref: &provider.Reference{}, 225 expected: "", 226 expectedErr: ErrInvalidSpaceReference, 227 }, 228 { 229 ref: &provider.Reference{ResourceId: &provider.ResourceId{}}, 230 expected: "!", 231 expectedErr: ErrInvalidSpaceReference, 232 }, 233 { 234 ref: &provider.Reference{ResourceId: &provider.ResourceId{OpaqueId: "opaqueid"}, Path: "path"}, 235 expectedErr: ErrInvalidSpaceReference, 236 }, 237 { 238 ref: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "path"}, 239 expected: "spaceid/path", 240 }, 241 { 242 ref: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "path"}, 243 expected: "spaceid!opaqueid/path", 244 }, 245 { 246 ref: &provider.Reference{ResourceId: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "path"}, 247 expected: "storageid$spaceid!opaqueid/path", 248 }, 249 { 250 ref: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "."}, 251 expected: "spaceid!opaqueid", 252 }, 253 { 254 ref: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "."}, 255 expected: "spaceid", 256 }, 257 { 258 ref: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}}, 259 expected: "spaceid", 260 }, 261 } 262 263 for _, tt := range tests { 264 result, err := FormatReference(tt.ref) 265 if err != nil && !errors.Is(err, tt.expectedErr) { 266 t.Errorf("FormateStorageSpaceRefence returned unexpected error: %v", err) 267 } 268 if err == nil && result != tt.expected { 269 t.Errorf("Reference %v got formatted to %s, expected %s", tt.ref, result, tt.expected) 270 } 271 } 272 } 273 274 func TestFormatAndParseReference(t *testing.T) { 275 tests := []struct { 276 orig *provider.Reference 277 expected *provider.Reference 278 }{ 279 { 280 orig: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "./path"}, 281 expected: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "./path"}, 282 }, 283 { 284 orig: &provider.Reference{ResourceId: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid"}, Path: "./path"}, 285 expected: &provider.Reference{ResourceId: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid"}, Path: "./path"}, 286 }, 287 { 288 orig: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "./path"}, 289 expected: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "./path"}, 290 }, 291 { 292 orig: &provider.Reference{ResourceId: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "./path"}, 293 expected: &provider.Reference{ResourceId: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "./path"}, 294 }, 295 { 296 orig: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "."}, 297 expected: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid", OpaqueId: "opaqueid"}, Path: "."}, 298 }, 299 { 300 orig: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "."}, 301 expected: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "."}, 302 }, 303 { 304 orig: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}}, 305 expected: &provider.Reference{ResourceId: &provider.ResourceId{SpaceId: "spaceid"}, Path: "."}, 306 }, 307 } 308 309 for _, tt := range tests { 310 formatted, _ := FormatReference(tt.orig) 311 parsed, err := ParseReference(formatted) 312 if err != nil { 313 t.Errorf("failed to parse space reference: %s error: %s", formatted, err) 314 } 315 if !(utils.ResourceIDEqual(parsed.ResourceId, tt.expected.ResourceId) && parsed.Path == tt.expected.Path) { 316 t.Errorf("Formatted then parsed references don't match the original got: %s expected %s", parsed.String(), tt.expected.String()) 317 } 318 } 319 } 320 321 func TestUpdateLegacyResourceID(t *testing.T) { 322 tests := []struct { 323 orig *provider.ResourceId 324 expected *provider.ResourceId 325 }{ 326 { 327 orig: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, 328 expected: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, 329 }, 330 { 331 orig: &provider.ResourceId{StorageId: "storageid$spaceid", SpaceId: "", OpaqueId: "opaqueid"}, 332 expected: &provider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}, 333 }, 334 } 335 336 for _, tt := range tests { 337 updated := UpdateLegacyResourceID(tt.orig) 338 if !(utils.ResourceIDEqual(updated, tt.expected)) { 339 t.Errorf("Updating resourceid failed, got: %v expected %v", updated, tt.expected) 340 } 341 } 342 }