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  }