1package config
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "github.com/spf13/viper"
9 "github.com/stretchr/testify/require"
10)
11
12func TestCheckLegacyFormat_OldSectionsNoEngine_ReturnsError(t *testing.T) {
13 m := &Manager{viper: viper.New()}
14 m.viper.Set("rendering.mode", "gpu")
15
16 err := m.checkLegacyFormat()
17
18 require.Error(t, err)
19 require.Contains(t, err.Error(), "dumber config migrate")
20}
21
22func TestCheckLegacyFormat_OldSectionsWithEngine_ReturnsError(t *testing.T) {
23 m := &Manager{viper: viper.New()}
24 m.viper.Set("rendering.mode", "gpu")
25 m.viper.Set("engine.type", "webkit")
26
27 err := m.checkLegacyFormat()
28
29 require.Error(t, err)
30 require.Contains(t, err.Error(), "dumber config migrate")
31}
32func TestCheckLegacyFormat_MixedEngineSectionReturnsMixedConfigError(t *testing.T) {
33 dir := t.TempDir()
34 configPath := filepath.Join(dir, "config.toml")
35 require.NoError(t, os.WriteFile(configPath, []byte("[engine]\nprofile = \"balanced\"\n\n[rendering]\ngsk_renderer = \"auto\"\n"), 0o600))
36
37 m := &Manager{viper: viper.New()}
38 m.viper.SetConfigFile(configPath)
39 m.viper.SetConfigType("toml")
40 require.NoError(t, m.viper.ReadInConfig())
41
42 err := m.checkLegacyFormat()
43
44 require.Error(t, err)
45 require.Contains(t, err.Error(), "mixed old/new config")
46 require.NotContains(t, err.Error(), "dumber config migrate")
47}
48
49func TestCheckLegacyFormat_FreshConfig_ReturnsNoError(t *testing.T) {
50 m := &Manager{viper: viper.New()}
51
52 err := m.checkLegacyFormat()
53
54 require.NoError(t, err)
55}
56
57func TestCheckLegacyFormat_DisableDmabuf_ReturnsError(t *testing.T) {
58 m := &Manager{viper: viper.New()}
59 m.viper.Set("rendering.disable_dmabuf_renderer", true)
60
61 err := m.checkLegacyFormat()
62
63 require.Error(t, err)
64 require.Contains(t, err.Error(), "dumber config migrate")
65}
66
67func TestCheckLegacyFormat_PerformanceProfile_ReturnsError(t *testing.T) {
68 m := &Manager{viper: viper.New()}
69 m.viper.Set("performance.profile", "lite")
70
71 err := m.checkLegacyFormat()
72
73 require.Error(t, err)
74 require.Contains(t, err.Error(), "dumber config migrate")
75}
76
77func TestCheckLegacyFormat_PrivacyCookiePolicy_ReturnsError(t *testing.T) {
78 m := &Manager{viper: viper.New()}
79 m.viper.Set("privacy.cookie_policy", "always")
80
81 err := m.checkLegacyFormat()
82
83 require.Error(t, err)
84 require.Contains(t, err.Error(), "dumber config migrate")
85}
86
87func TestCheckLegacyFormat_RuntimePrefix_ReturnsError(t *testing.T) {
88 m := &Manager{viper: viper.New()}
89 m.viper.Set("runtime.prefix", "/usr")
90
91 err := m.checkLegacyFormat()
92
93 require.Error(t, err)
94 require.Contains(t, err.Error(), "dumber config migrate")
95}
96
97func TestCheckLegacyFormat_MetadataBackedAliasesReturnError(t *testing.T) {
98 for _, alias := range legacyEngineAliases {
99 key := alias.legacyKey()
100 t.Run(key, func(t *testing.T) {
101 m := &Manager{viper: viper.New()}
102 m.viper.Set(key, sampleLegacyAliasValue(alias))
103
104 err := m.checkLegacyFormat()
105
106 require.Error(t, err)
107 require.Contains(t, err.Error(), "dumber config migrate")
108 })
109 }
110}
111
112func sampleLegacyAliasValue(alias legacyEngineAlias) any {
113 switch alias.legacyKey() {
114 case "performance.profile":
115 return "balanced"
116 case "privacy.cookie_policy":
117 return "always"
118 case "rendering.mode":
119 return "gpu"
120 case "rendering.gsk_renderer", "media.gl_rendering_mode":
121 return "auto"
122 case "runtime.prefix":
123 return "/usr"
124 }
125
126 switch alias.legacyField {
127 case "zoom_cache_size", "webview_pool_prewarm_count",
128 "skia_cpu_painting_threads", "skia_gpu_painting_threads",
129 "web_process_memory_limit_mb", "network_process_memory_limit_mb",
130 "gstreamer_debug_level":
131 return 1
132 case "web_process_memory_poll_interval_sec", "network_process_memory_poll_interval_sec",
133 "web_process_memory_conservative_threshold", "web_process_memory_strict_threshold",
134 "network_process_memory_conservative_threshold", "network_process_memory_strict_threshold":
135 return 0.5
136 default:
137 return true
138 }
139}
140
141func TestTransformLegacyConfig_DefaultAdaptiveDoesNotBlockLegacyCEFMigration(t *testing.T) {
142 dir := t.TempDir()
143 configPath := filepath.Join(dir, "config.toml")
144 require.NoError(t, os.WriteFile(configPath, []byte("[engine.cef]\nwindowless_frame_rate = 60\n"), 0o600))
145
146 m := &Manager{viper: viper.New()}
147 m.viper.SetConfigFile(configPath)
148 m.viper.SetConfigType("toml")
149 m.setDefaults()
150 require.NoError(t, m.viper.ReadInConfig())
151
152 settings, err := m.transformedSettings()
153 require.NoError(t, err)
154
155 require.True(t, settings.GetBool("engine.cef.adaptive_windowless_frame_rate"))
156 require.Equal(t, 0, settings.GetInt("engine.cef.windowless_frame_rate"))
157 require.Equal(t, defaultCEFWindowlessFrameRateMax, settings.GetInt("engine.cef.windowless_frame_rate_max"))
158}
159
160func TestTransformLegacyConfig_ExplicitAdaptiveEnvOverrideBlocksLegacyCEFMigration(t *testing.T) {
161 dir := t.TempDir()
162 configPath := filepath.Join(dir, "config.toml")
163 require.NoError(t, os.WriteFile(configPath, []byte("[engine.cef]\nwindowless_frame_rate = 60\n"), 0o600))
164 t.Setenv("DUMBER_ENGINE_CEF_ADAPTIVE_WINDOWLESS_FRAME_RATE", "false")
165
166 m := &Manager{viper: viper.New()}
167 m.viper.SetConfigFile(configPath)
168 m.viper.SetConfigType("toml")
169 m.configureAutomaticEnv()
170 m.setDefaults()
171 require.NoError(t, m.viper.ReadInConfig())
172
173 settings, err := m.transformedSettings()
174 require.NoError(t, err)
175
176 require.False(t, settings.GetBool("engine.cef.adaptive_windowless_frame_rate"))
177 require.Equal(t, 60, settings.GetInt("engine.cef.windowless_frame_rate"))
178}
179
180func TestTransformLegacyConfig_UnconfiguredManagerIgnoresAmbientAdaptiveEnv(t *testing.T) {
181 dir := t.TempDir()
182 configPath := filepath.Join(dir, "config.toml")
183 require.NoError(t, os.WriteFile(configPath, []byte("[engine.cef]\nwindowless_frame_rate = 60\n"), 0o600))
184 t.Setenv("DUMBER_ENGINE_CEF_ADAPTIVE_WINDOWLESS_FRAME_RATE", "false")
185
186 m := &Manager{viper: viper.New()}
187 m.viper.SetConfigFile(configPath)
188 m.viper.SetConfigType("toml")
189 m.setDefaults()
190 require.NoError(t, m.viper.ReadInConfig())
191
192 settings, err := m.transformedSettings()
193 require.NoError(t, err)
194
195 require.True(t, settings.GetBool("engine.cef.adaptive_windowless_frame_rate"))
196 require.Equal(t, 0, settings.GetInt("engine.cef.windowless_frame_rate"))
197}
198
199func TestTransformLegacyConfig_ExplicitAdaptiveEnvTrueMigratesLegacyCEFDefault(t *testing.T) {
200 dir := t.TempDir()
201 configPath := filepath.Join(dir, "config.toml")
202 require.NoError(t, os.WriteFile(configPath, []byte("[engine.cef]\nwindowless_frame_rate = 60\n"), 0o600))
203 t.Setenv("DUMBER_ENGINE_CEF_ADAPTIVE_WINDOWLESS_FRAME_RATE", "true")
204
205 m := &Manager{viper: viper.New()}
206 m.viper.SetConfigFile(configPath)
207 m.viper.SetConfigType("toml")
208 m.configureAutomaticEnv()
209 m.setDefaults()
210 require.NoError(t, m.viper.ReadInConfig())
211
212 settings, err := m.transformedSettings()
213 require.NoError(t, err)
214
215 require.True(t, settings.GetBool("engine.cef.adaptive_windowless_frame_rate"))
216 require.Equal(t, 0, settings.GetInt("engine.cef.windowless_frame_rate"))
217 require.Equal(t, defaultCEFWindowlessFrameRateMax, settings.GetInt("engine.cef.windowless_frame_rate_max"))
218}