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