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.

config_env_test.go 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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.Equal(t, "", section)
  25. assert.Equal(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.Equal(t, "", section)
  33. assert.Equal(t, "", key)
  34. assert.False(t, file)
  35. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC")
  36. assert.False(t, ok)
  37. assert.Equal(t, "", section)
  38. assert.Equal(t, "", key)
  39. assert.False(t, file)
  40. ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA____KEY")
  41. assert.True(t, ok)
  42. assert.Equal(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.Equal(t, "", section)
  55. assert.Equal(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. }
  63. func TestEnvironmentToConfig(t *testing.T) {
  64. cfg, _ := NewConfigProviderFromData("")
  65. changed := EnvironmentToConfig(cfg, nil)
  66. assert.False(t, changed)
  67. cfg, err := NewConfigProviderFromData(`
  68. [sec]
  69. key = old
  70. `)
  71. assert.NoError(t, err)
  72. changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
  73. assert.True(t, changed)
  74. assert.Equal(t, "new", cfg.Section("sec").Key("key").String())
  75. changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
  76. assert.False(t, changed)
  77. tmpFile := t.TempDir() + "/the-file"
  78. _ = os.WriteFile(tmpFile, []byte("value-from-file"), 0o644)
  79. changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  80. assert.True(t, changed)
  81. assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
  82. cfg, _ = NewConfigProviderFromData("")
  83. _ = os.WriteFile(tmpFile, []byte("value-from-file\n"), 0o644)
  84. EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  85. assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
  86. cfg, _ = NewConfigProviderFromData("")
  87. _ = os.WriteFile(tmpFile, []byte("value-from-file\r\n"), 0o644)
  88. EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  89. assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
  90. cfg, _ = NewConfigProviderFromData("")
  91. _ = os.WriteFile(tmpFile, []byte("value-from-file\n\n"), 0o644)
  92. EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
  93. assert.Equal(t, "value-from-file\n", cfg.Section("sec").Key("key").String())
  94. }
  95. func TestEnvironmentToConfigSubSecKey(t *testing.T) {
  96. // the INI package has a quirk: by default, the keys are inherited.
  97. // when maintaining the keys, the newly added sub key should not be affected by the parent key.
  98. cfg, err := NewConfigProviderFromData(`
  99. [sec]
  100. key = some
  101. `)
  102. assert.NoError(t, err)
  103. changed := EnvironmentToConfig(cfg, []string{"GITEA__sec_0X2E_sub__key=some"})
  104. assert.True(t, changed)
  105. tmpFile := t.TempDir() + "/test-sub-sec-key.ini"
  106. defer os.Remove(tmpFile)
  107. err = cfg.SaveTo(tmpFile)
  108. assert.NoError(t, err)
  109. bs, err := os.ReadFile(tmpFile)
  110. assert.NoError(t, err)
  111. assert.Equal(t, `[sec]
  112. key = some
  113. [sec.sub]
  114. key = some
  115. `, string(bs))
  116. }