You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

storage_test.go 14KB

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