code.gitea.io/gitea@v1.22.3/modules/setting/storage_test.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func Test_getStorageMultipleName(t *testing.T) {
    14  	iniStr := `
    15  [lfs]
    16  MINIO_BUCKET = gitea-lfs
    17  
    18  [attachment]
    19  MINIO_BUCKET = gitea-attachment
    20  
    21  [storage]
    22  STORAGE_TYPE = minio
    23  MINIO_BUCKET = gitea-storage
    24  `
    25  	cfg, err := NewConfigProviderFromData(iniStr)
    26  	assert.NoError(t, err)
    27  
    28  	assert.NoError(t, loadAttachmentFrom(cfg))
    29  	assert.EqualValues(t, "gitea-attachment", Attachment.Storage.MinioConfig.Bucket)
    30  	assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath)
    31  
    32  	assert.NoError(t, loadLFSFrom(cfg))
    33  	assert.EqualValues(t, "gitea-lfs", LFS.Storage.MinioConfig.Bucket)
    34  	assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
    35  
    36  	assert.NoError(t, loadAvatarsFrom(cfg))
    37  	assert.EqualValues(t, "gitea-storage", Avatar.Storage.MinioConfig.Bucket)
    38  	assert.EqualValues(t, "avatars/", Avatar.Storage.MinioConfig.BasePath)
    39  }
    40  
    41  func Test_getStorageUseOtherNameAsType(t *testing.T) {
    42  	iniStr := `
    43  [attachment]
    44  STORAGE_TYPE = lfs
    45  
    46  [storage.lfs]
    47  STORAGE_TYPE = minio
    48  MINIO_BUCKET = gitea-storage
    49  `
    50  	cfg, err := NewConfigProviderFromData(iniStr)
    51  	assert.NoError(t, err)
    52  
    53  	assert.NoError(t, loadAttachmentFrom(cfg))
    54  	assert.EqualValues(t, "gitea-storage", Attachment.Storage.MinioConfig.Bucket)
    55  	assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath)
    56  
    57  	assert.NoError(t, loadLFSFrom(cfg))
    58  	assert.EqualValues(t, "gitea-storage", LFS.Storage.MinioConfig.Bucket)
    59  	assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath)
    60  }
    61  
    62  func Test_getStorageInheritStorageType(t *testing.T) {
    63  	iniStr := `
    64  [storage]
    65  STORAGE_TYPE = minio
    66  `
    67  	cfg, err := NewConfigProviderFromData(iniStr)
    68  	assert.NoError(t, err)
    69  
    70  	assert.NoError(t, loadPackagesFrom(cfg))
    71  	assert.EqualValues(t, "minio", Packages.Storage.Type)
    72  	assert.EqualValues(t, "gitea", Packages.Storage.MinioConfig.Bucket)
    73  	assert.EqualValues(t, "packages/", Packages.Storage.MinioConfig.BasePath)
    74  
    75  	assert.NoError(t, loadRepoArchiveFrom(cfg))
    76  	assert.EqualValues(t, "minio", RepoArchive.Storage.Type)
    77  	assert.EqualValues(t, "gitea", RepoArchive.Storage.MinioConfig.Bucket)
    78  	assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
    79  
    80  	assert.NoError(t, loadActionsFrom(cfg))
    81  	assert.EqualValues(t, "minio", Actions.LogStorage.Type)
    82  	assert.EqualValues(t, "gitea", Actions.LogStorage.MinioConfig.Bucket)
    83  	assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath)
    84  
    85  	assert.EqualValues(t, "minio", Actions.ArtifactStorage.Type)
    86  	assert.EqualValues(t, "gitea", Actions.ArtifactStorage.MinioConfig.Bucket)
    87  	assert.EqualValues(t, "actions_artifacts/", Actions.ArtifactStorage.MinioConfig.BasePath)
    88  
    89  	assert.NoError(t, loadAvatarsFrom(cfg))
    90  	assert.EqualValues(t, "minio", Avatar.Storage.Type)
    91  	assert.EqualValues(t, "gitea", Avatar.Storage.MinioConfig.Bucket)
    92  	assert.EqualValues(t, "avatars/", Avatar.Storage.MinioConfig.BasePath)
    93  
    94  	assert.NoError(t, loadRepoAvatarFrom(cfg))
    95  	assert.EqualValues(t, "minio", RepoAvatar.Storage.Type)
    96  	assert.EqualValues(t, "gitea", RepoAvatar.Storage.MinioConfig.Bucket)
    97  	assert.EqualValues(t, "repo-avatars/", RepoAvatar.Storage.MinioConfig.BasePath)
    98  }
    99  
   100  type testLocalStoragePathCase struct {
   101  	loader       func(rootCfg ConfigProvider) error
   102  	storagePtr   **Storage
   103  	expectedPath string
   104  }
   105  
   106  func testLocalStoragePath(t *testing.T, appDataPath, iniStr string, cases []testLocalStoragePathCase) {
   107  	cfg, err := NewConfigProviderFromData(iniStr)
   108  	assert.NoError(t, err)
   109  	AppDataPath = appDataPath
   110  	for _, c := range cases {
   111  		assert.NoError(t, c.loader(cfg))
   112  		storage := *c.storagePtr
   113  
   114  		assert.EqualValues(t, "local", storage.Type)
   115  		assert.True(t, filepath.IsAbs(storage.Path))
   116  		assert.EqualValues(t, filepath.Clean(c.expectedPath), filepath.Clean(storage.Path))
   117  	}
   118  }
   119  
   120  func Test_getStorageInheritStorageTypeLocal(t *testing.T) {
   121  	testLocalStoragePath(t, "/appdata", `
   122  [storage]
   123  STORAGE_TYPE = local
   124  `, []testLocalStoragePathCase{
   125  		{loadAttachmentFrom, &Attachment.Storage, "/appdata/attachments"},
   126  		{loadLFSFrom, &LFS.Storage, "/appdata/lfs"},
   127  		{loadActionsFrom, &Actions.ArtifactStorage, "/appdata/actions_artifacts"},
   128  		{loadPackagesFrom, &Packages.Storage, "/appdata/packages"},
   129  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/appdata/repo-archive"},
   130  		{loadActionsFrom, &Actions.LogStorage, "/appdata/actions_log"},
   131  		{loadAvatarsFrom, &Avatar.Storage, "/appdata/avatars"},
   132  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/appdata/repo-avatars"},
   133  	})
   134  }
   135  
   136  func Test_getStorageInheritStorageTypeLocalPath(t *testing.T) {
   137  	testLocalStoragePath(t, "/appdata", `
   138  [storage]
   139  STORAGE_TYPE = local
   140  PATH = /data/gitea
   141  `, []testLocalStoragePathCase{
   142  		{loadAttachmentFrom, &Attachment.Storage, "/data/gitea/attachments"},
   143  		{loadLFSFrom, &LFS.Storage, "/data/gitea/lfs"},
   144  		{loadActionsFrom, &Actions.ArtifactStorage, "/data/gitea/actions_artifacts"},
   145  		{loadPackagesFrom, &Packages.Storage, "/data/gitea/packages"},
   146  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/data/gitea/repo-archive"},
   147  		{loadActionsFrom, &Actions.LogStorage, "/data/gitea/actions_log"},
   148  		{loadAvatarsFrom, &Avatar.Storage, "/data/gitea/avatars"},
   149  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/data/gitea/repo-avatars"},
   150  	})
   151  }
   152  
   153  func Test_getStorageInheritStorageTypeLocalRelativePath(t *testing.T) {
   154  	testLocalStoragePath(t, "/appdata", `
   155  [storage]
   156  STORAGE_TYPE = local
   157  PATH = storages
   158  `, []testLocalStoragePathCase{
   159  		{loadAttachmentFrom, &Attachment.Storage, "/appdata/storages/attachments"},
   160  		{loadLFSFrom, &LFS.Storage, "/appdata/storages/lfs"},
   161  		{loadActionsFrom, &Actions.ArtifactStorage, "/appdata/storages/actions_artifacts"},
   162  		{loadPackagesFrom, &Packages.Storage, "/appdata/storages/packages"},
   163  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/appdata/storages/repo-archive"},
   164  		{loadActionsFrom, &Actions.LogStorage, "/appdata/storages/actions_log"},
   165  		{loadAvatarsFrom, &Avatar.Storage, "/appdata/storages/avatars"},
   166  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/appdata/storages/repo-avatars"},
   167  	})
   168  }
   169  
   170  func Test_getStorageInheritStorageTypeLocalPathOverride(t *testing.T) {
   171  	testLocalStoragePath(t, "/appdata", `
   172  [storage]
   173  STORAGE_TYPE = local
   174  PATH = /data/gitea
   175  
   176  [repo-archive]
   177  PATH = /data/gitea/the-archives-dir
   178  `, []testLocalStoragePathCase{
   179  		{loadAttachmentFrom, &Attachment.Storage, "/data/gitea/attachments"},
   180  		{loadLFSFrom, &LFS.Storage, "/data/gitea/lfs"},
   181  		{loadActionsFrom, &Actions.ArtifactStorage, "/data/gitea/actions_artifacts"},
   182  		{loadPackagesFrom, &Packages.Storage, "/data/gitea/packages"},
   183  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/data/gitea/the-archives-dir"},
   184  		{loadActionsFrom, &Actions.LogStorage, "/data/gitea/actions_log"},
   185  		{loadAvatarsFrom, &Avatar.Storage, "/data/gitea/avatars"},
   186  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/data/gitea/repo-avatars"},
   187  	})
   188  }
   189  
   190  func Test_getStorageInheritStorageTypeLocalPathOverrideEmpty(t *testing.T) {
   191  	testLocalStoragePath(t, "/appdata", `
   192  [storage]
   193  STORAGE_TYPE = local
   194  PATH = /data/gitea
   195  
   196  [repo-archive]
   197  `, []testLocalStoragePathCase{
   198  		{loadAttachmentFrom, &Attachment.Storage, "/data/gitea/attachments"},
   199  		{loadLFSFrom, &LFS.Storage, "/data/gitea/lfs"},
   200  		{loadActionsFrom, &Actions.ArtifactStorage, "/data/gitea/actions_artifacts"},
   201  		{loadPackagesFrom, &Packages.Storage, "/data/gitea/packages"},
   202  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/data/gitea/repo-archive"},
   203  		{loadActionsFrom, &Actions.LogStorage, "/data/gitea/actions_log"},
   204  		{loadAvatarsFrom, &Avatar.Storage, "/data/gitea/avatars"},
   205  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/data/gitea/repo-avatars"},
   206  	})
   207  }
   208  
   209  func Test_getStorageInheritStorageTypeLocalRelativePathOverride(t *testing.T) {
   210  	testLocalStoragePath(t, "/appdata", `
   211  [storage]
   212  STORAGE_TYPE = local
   213  PATH = /data/gitea
   214  
   215  [repo-archive]
   216  PATH = the-archives-dir
   217  `, []testLocalStoragePathCase{
   218  		{loadAttachmentFrom, &Attachment.Storage, "/data/gitea/attachments"},
   219  		{loadLFSFrom, &LFS.Storage, "/data/gitea/lfs"},
   220  		{loadActionsFrom, &Actions.ArtifactStorage, "/data/gitea/actions_artifacts"},
   221  		{loadPackagesFrom, &Packages.Storage, "/data/gitea/packages"},
   222  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/data/gitea/the-archives-dir"},
   223  		{loadActionsFrom, &Actions.LogStorage, "/data/gitea/actions_log"},
   224  		{loadAvatarsFrom, &Avatar.Storage, "/data/gitea/avatars"},
   225  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/data/gitea/repo-avatars"},
   226  	})
   227  }
   228  
   229  func Test_getStorageInheritStorageTypeLocalPathOverride3(t *testing.T) {
   230  	testLocalStoragePath(t, "/appdata", `
   231  [storage.repo-archive]
   232  STORAGE_TYPE = local
   233  PATH = /data/gitea/archives
   234  `, []testLocalStoragePathCase{
   235  		{loadAttachmentFrom, &Attachment.Storage, "/appdata/attachments"},
   236  		{loadLFSFrom, &LFS.Storage, "/appdata/lfs"},
   237  		{loadActionsFrom, &Actions.ArtifactStorage, "/appdata/actions_artifacts"},
   238  		{loadPackagesFrom, &Packages.Storage, "/appdata/packages"},
   239  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/data/gitea/archives"},
   240  		{loadActionsFrom, &Actions.LogStorage, "/appdata/actions_log"},
   241  		{loadAvatarsFrom, &Avatar.Storage, "/appdata/avatars"},
   242  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/appdata/repo-avatars"},
   243  	})
   244  }
   245  
   246  func Test_getStorageInheritStorageTypeLocalPathOverride3_5(t *testing.T) {
   247  	testLocalStoragePath(t, "/appdata", `
   248  [storage.repo-archive]
   249  STORAGE_TYPE = local
   250  PATH = a-relative-path
   251  `, []testLocalStoragePathCase{
   252  		{loadAttachmentFrom, &Attachment.Storage, "/appdata/attachments"},
   253  		{loadLFSFrom, &LFS.Storage, "/appdata/lfs"},
   254  		{loadActionsFrom, &Actions.ArtifactStorage, "/appdata/actions_artifacts"},
   255  		{loadPackagesFrom, &Packages.Storage, "/appdata/packages"},
   256  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/appdata/a-relative-path"},
   257  		{loadActionsFrom, &Actions.LogStorage, "/appdata/actions_log"},
   258  		{loadAvatarsFrom, &Avatar.Storage, "/appdata/avatars"},
   259  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/appdata/repo-avatars"},
   260  	})
   261  }
   262  
   263  func Test_getStorageInheritStorageTypeLocalPathOverride4(t *testing.T) {
   264  	testLocalStoragePath(t, "/appdata", `
   265  [storage.repo-archive]
   266  STORAGE_TYPE = local
   267  PATH = /data/gitea/archives
   268  
   269  [repo-archive]
   270  PATH = /tmp/gitea/archives
   271  `, []testLocalStoragePathCase{
   272  		{loadAttachmentFrom, &Attachment.Storage, "/appdata/attachments"},
   273  		{loadLFSFrom, &LFS.Storage, "/appdata/lfs"},
   274  		{loadActionsFrom, &Actions.ArtifactStorage, "/appdata/actions_artifacts"},
   275  		{loadPackagesFrom, &Packages.Storage, "/appdata/packages"},
   276  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/tmp/gitea/archives"},
   277  		{loadActionsFrom, &Actions.LogStorage, "/appdata/actions_log"},
   278  		{loadAvatarsFrom, &Avatar.Storage, "/appdata/avatars"},
   279  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/appdata/repo-avatars"},
   280  	})
   281  }
   282  
   283  func Test_getStorageInheritStorageTypeLocalPathOverride5(t *testing.T) {
   284  	testLocalStoragePath(t, "/appdata", `
   285  [storage.repo-archive]
   286  STORAGE_TYPE = local
   287  PATH = /data/gitea/archives
   288  
   289  [repo-archive]
   290  `, []testLocalStoragePathCase{
   291  		{loadAttachmentFrom, &Attachment.Storage, "/appdata/attachments"},
   292  		{loadLFSFrom, &LFS.Storage, "/appdata/lfs"},
   293  		{loadActionsFrom, &Actions.ArtifactStorage, "/appdata/actions_artifacts"},
   294  		{loadPackagesFrom, &Packages.Storage, "/appdata/packages"},
   295  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/data/gitea/archives"},
   296  		{loadActionsFrom, &Actions.LogStorage, "/appdata/actions_log"},
   297  		{loadAvatarsFrom, &Avatar.Storage, "/appdata/avatars"},
   298  		{loadRepoAvatarFrom, &RepoAvatar.Storage, "/appdata/repo-avatars"},
   299  	})
   300  }
   301  
   302  func Test_getStorageInheritStorageTypeLocalPathOverride72(t *testing.T) {
   303  	testLocalStoragePath(t, "/appdata", `
   304  [repo-archive]
   305  STORAGE_TYPE = local
   306  PATH = archives
   307  `, []testLocalStoragePathCase{
   308  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/appdata/archives"},
   309  	})
   310  }
   311  
   312  func Test_getStorageConfiguration20(t *testing.T) {
   313  	cfg, err := NewConfigProviderFromData(`
   314  [repo-archive]
   315  STORAGE_TYPE = my_storage
   316  PATH = archives
   317  `)
   318  	assert.NoError(t, err)
   319  
   320  	assert.Error(t, loadRepoArchiveFrom(cfg))
   321  }
   322  
   323  func Test_getStorageConfiguration21(t *testing.T) {
   324  	testLocalStoragePath(t, "/appdata", `
   325  [storage.repo-archive]
   326  `, []testLocalStoragePathCase{
   327  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/appdata/repo-archive"},
   328  	})
   329  }
   330  
   331  func Test_getStorageConfiguration22(t *testing.T) {
   332  	testLocalStoragePath(t, "/appdata", `
   333  [storage.repo-archive]
   334  PATH = archives
   335  `, []testLocalStoragePathCase{
   336  		{loadRepoArchiveFrom, &RepoArchive.Storage, "/appdata/archives"},
   337  	})
   338  }
   339  
   340  func Test_getStorageConfiguration23(t *testing.T) {
   341  	cfg, err := NewConfigProviderFromData(`
   342  [repo-archive]
   343  STORAGE_TYPE = minio
   344  MINIO_ACCESS_KEY_ID = my_access_key
   345  MINIO_SECRET_ACCESS_KEY = my_secret_key
   346  `)
   347  	assert.NoError(t, err)
   348  
   349  	_, err = getStorage(cfg, "", "", nil)
   350  	assert.Error(t, err)
   351  
   352  	assert.NoError(t, loadRepoArchiveFrom(cfg))
   353  	cp := RepoArchive.Storage.ToShadowCopy()
   354  	assert.EqualValues(t, "******", cp.MinioConfig.AccessKeyID)
   355  	assert.EqualValues(t, "******", cp.MinioConfig.SecretAccessKey)
   356  }
   357  
   358  func Test_getStorageConfiguration24(t *testing.T) {
   359  	cfg, err := NewConfigProviderFromData(`
   360  [repo-archive]
   361  STORAGE_TYPE = my_archive
   362  
   363  [storage.my_archive]
   364  ; unsupported, storage type should be defined explicitly
   365  PATH = archives
   366  `)
   367  	assert.NoError(t, err)
   368  	assert.Error(t, loadRepoArchiveFrom(cfg))
   369  }
   370  
   371  func Test_getStorageConfiguration25(t *testing.T) {
   372  	cfg, err := NewConfigProviderFromData(`
   373  [repo-archive]
   374  STORAGE_TYPE = my_archive
   375  
   376  [storage.my_archive]
   377  ; unsupported, storage type should be known type
   378  STORAGE_TYPE = unknown // should be local or minio
   379  PATH = archives
   380  `)
   381  	assert.NoError(t, err)
   382  	assert.Error(t, loadRepoArchiveFrom(cfg))
   383  }
   384  
   385  func Test_getStorageConfiguration26(t *testing.T) {
   386  	cfg, err := NewConfigProviderFromData(`
   387  [repo-archive]
   388  STORAGE_TYPE = minio
   389  MINIO_ACCESS_KEY_ID = my_access_key
   390  MINIO_SECRET_ACCESS_KEY = my_secret_key
   391  ; wrong configuration
   392  MINIO_USE_SSL = abc
   393  `)
   394  	assert.NoError(t, err)
   395  	// assert.Error(t, loadRepoArchiveFrom(cfg))
   396  	// FIXME: this should return error but now ini package's MapTo() doesn't check type
   397  	assert.NoError(t, loadRepoArchiveFrom(cfg))
   398  }
   399  
   400  func Test_getStorageConfiguration27(t *testing.T) {
   401  	cfg, err := NewConfigProviderFromData(`
   402  [storage.repo-archive]
   403  STORAGE_TYPE = minio
   404  MINIO_ACCESS_KEY_ID = my_access_key
   405  MINIO_SECRET_ACCESS_KEY = my_secret_key
   406  MINIO_USE_SSL = true
   407  `)
   408  	assert.NoError(t, err)
   409  	assert.NoError(t, loadRepoArchiveFrom(cfg))
   410  	assert.EqualValues(t, "my_access_key", RepoArchive.Storage.MinioConfig.AccessKeyID)
   411  	assert.EqualValues(t, "my_secret_key", RepoArchive.Storage.MinioConfig.SecretAccessKey)
   412  	assert.EqualValues(t, true, RepoArchive.Storage.MinioConfig.UseSSL)
   413  	assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
   414  }
   415  
   416  func Test_getStorageConfiguration28(t *testing.T) {
   417  	cfg, err := NewConfigProviderFromData(`
   418  [storage]
   419  STORAGE_TYPE = minio
   420  MINIO_ACCESS_KEY_ID = my_access_key
   421  MINIO_SECRET_ACCESS_KEY = my_secret_key
   422  MINIO_USE_SSL = true
   423  MINIO_BASE_PATH = /prefix
   424  `)
   425  	assert.NoError(t, err)
   426  	assert.NoError(t, loadRepoArchiveFrom(cfg))
   427  	assert.EqualValues(t, "my_access_key", RepoArchive.Storage.MinioConfig.AccessKeyID)
   428  	assert.EqualValues(t, "my_secret_key", RepoArchive.Storage.MinioConfig.SecretAccessKey)
   429  	assert.EqualValues(t, true, RepoArchive.Storage.MinioConfig.UseSSL)
   430  	assert.EqualValues(t, "/prefix/repo-archive/", RepoArchive.Storage.MinioConfig.BasePath)
   431  
   432  	cfg, err = NewConfigProviderFromData(`
   433  [storage]
   434  STORAGE_TYPE = minio
   435  MINIO_ACCESS_KEY_ID = my_access_key
   436  MINIO_SECRET_ACCESS_KEY = my_secret_key
   437  MINIO_USE_SSL = true
   438  MINIO_BASE_PATH = /prefix
   439  
   440  [lfs]
   441  MINIO_BASE_PATH = /lfs
   442  `)
   443  	assert.NoError(t, err)
   444  	assert.NoError(t, loadLFSFrom(cfg))
   445  	assert.EqualValues(t, "my_access_key", LFS.Storage.MinioConfig.AccessKeyID)
   446  	assert.EqualValues(t, "my_secret_key", LFS.Storage.MinioConfig.SecretAccessKey)
   447  	assert.EqualValues(t, true, LFS.Storage.MinioConfig.UseSSL)
   448  	assert.EqualValues(t, "/lfs", LFS.Storage.MinioConfig.BasePath)
   449  
   450  	cfg, err = NewConfigProviderFromData(`
   451  [storage]
   452  STORAGE_TYPE = minio
   453  MINIO_ACCESS_KEY_ID = my_access_key
   454  MINIO_SECRET_ACCESS_KEY = my_secret_key
   455  MINIO_USE_SSL = true
   456  MINIO_BASE_PATH = /prefix
   457  
   458  [storage.lfs]
   459  MINIO_BASE_PATH = /lfs
   460  `)
   461  	assert.NoError(t, err)
   462  	assert.NoError(t, loadLFSFrom(cfg))
   463  	assert.EqualValues(t, "my_access_key", LFS.Storage.MinioConfig.AccessKeyID)
   464  	assert.EqualValues(t, "my_secret_key", LFS.Storage.MinioConfig.SecretAccessKey)
   465  	assert.EqualValues(t, true, LFS.Storage.MinioConfig.UseSSL)
   466  	assert.EqualValues(t, "/lfs", LFS.Storage.MinioConfig.BasePath)
   467  }