gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package setting
  4. import (
  5. "os"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestDecodeEnvSectionKey(t *testing.T) {
  10. ok, section, key := decodeEnvSectionKey("SEC__KEY")
  11. assert.True(t, ok)
  12. assert.Equal(t, "sec", section)
  13. assert.Equal(t, "KEY", key)
  14. ok, section, key = decodeEnvSectionKey("sec__key")
  15. assert.True(t, ok)
  16. assert.Equal(t, "sec", section)
  17. assert.Equal(t, "key", key)
  18. ok, section, key = decodeEnvSectionKey("LOG_0x2E_CONSOLE__STDERR")
  19. assert.True(t, ok)
  20. assert.Equal(t, "log.console", section)
  21. assert.Equal(t, "STDERR", key)
  22. ok, section, key = decodeEnvSectionKey("SEC")
  23. assert.False(t, ok)
  24. assert.Empty(t, section)
  25. assert.Empty(t, key)
  26. }
  27. func TestDecodeEnvironmentKey(t *testing.T) {
  28. prefix := "GITEA__"
  29. suffix := "__FILE"
  30. ok, section, key, file := decodeEnvironmentKey(prefix, suffix, "SEC__KEY")
  31. assert.False(t, ok)
  32. assert.Empty(t, section)
  33. assert.Empty(t, key)
  34. assert.False(t, file)
  35. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC")
  36. assert.False(t, ok)
  37. assert.Empty(t, section)
  38. assert.Empty(t, key)
  39. assert.False(t, file)
  40. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA____KEY")
  41. assert.True(t, ok)
  42. assert.Empty(t, section)
  43. assert.Equal(t, "KEY", key)
  44. assert.False(t, file)
  45. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__KEY")
  46. assert.True(t, ok)
  47. assert.Equal(t, "sec", section)
  48. assert.Equal(t, "KEY", key)
  49. assert.False(t, file)
  50. // with "__FILE" suffix, it doesn't support to write "[sec].FILE" to config (no such key FILE is used in Gitea)
  51. // but it could be fixed in the future by adding a new suffix like "__VALUE" (no such key VALUE is used in Gitea either)
  52. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__FILE")
  53. assert.False(t, ok)
  54. assert.Empty(t, section)
  55. assert.Empty(t, key)
  56. assert.True(t, file)
  57. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__KEY__FILE")
  58. assert.True(t, ok)
  59. assert.Equal(t, "sec", section)
  60. assert.Equal(t, "KEY", key)
  61. assert.True(t, file)
  62. ok, _, _, _ = decodeEnvironmentKey("PREFIX__", "", "PREFIX__SEC__KEY")
  63. assert.True(t, ok)
  64. }
  65. func TestEnvironmentToConfig(t *testing.T) {
  66. cfg, _ := NewConfigProviderFromData("")
  67. changed := EnvironmentToConfig(cfg, nil)
  68. assert.False(t, changed)
  69. cfg, err := NewConfigProviderFromData(`
  70. [sec]
  71. key = old
  72. `)
  73. assert.NoError(t, err)
  74. changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
  75. assert.True(t, changed)
  76. assert.Equal(t, "new", cfg.Section("sec").Key("key").String())
  77. changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
  78. assert.False(t, changed)
  79. tmpFile := t.TempDir() + "/the-file"
  80. _ = os.WriteFile(tmpFile, []byte("value-from-file"), 0o644)
  81. changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  82. assert.True(t, changed)
  83. assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
  84. cfg, _ = NewConfigProviderFromData("")
  85. _ = os.WriteFile(tmpFile, []byte("value-from-file\n"), 0o644)
  86. EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  87. assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
  88. cfg, _ = NewConfigProviderFromData("")
  89. _ = os.WriteFile(tmpFile, []byte("value-from-file\r\n"), 0o644)
  90. EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  91. assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
  92. cfg, _ = NewConfigProviderFromData("")
  93. _ = os.WriteFile(tmpFile, []byte("value-from-file\n\n"), 0o644)
  94. EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  95. assert.Equal(t, "value-from-file\n", cfg.Section("sec").Key("key").String())
  96. }
  97. func TestEnvironmentToConfigSubSecKey(t *testing.T) {
  98. // the INI package has a quirk: by default, the keys are inherited.
  99. // when maintaining the keys, the newly added sub key should not be affected by the parent key.
  100. cfg, err := NewConfigProviderFromData(`
  101. [sec]
  102. key = some
  103. `)
  104. assert.NoError(t, err)
  105. changed := EnvironmentToConfig(cfg, []string{"GITEA__sec_0X2E_sub__key=some"})
  106. assert.True(t, changed)
  107. tmpFile := t.TempDir() + "/test-sub-sec-key.ini"
  108. defer os.Remove(tmpFile)
  109. err = cfg.SaveTo(tmpFile)
  110. assert.NoError(t, err)
  111. bs, err := os.ReadFile(tmpFile)
  112. assert.NoError(t, err)
  113. assert.Equal(t, `[sec]
  114. key = some
  115. [sec.sub]
  116. key = some
  117. `, string(bs))
  118. }