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 }