-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Expand file tree
/
Copy pathfuzz_config_test.go
More file actions
98 lines (81 loc) · 2.15 KB
/
fuzz_config_test.go
File metadata and controls
98 lines (81 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package viper
import (
"bytes"
"strings"
"testing"
)
func runConfigFuzz(tb testing.TB, data []byte, configType string) {
if len(data) > 1<<20 {
return
}
v := New()
v.SetConfigType(configType)
if err := v.ReadConfig(bytes.NewReader(data)); err != nil {
return
}
allKeys := v.AllKeys()
for _, key := range allKeys {
// Exercise various getters to maximize code coverage
_ = v.Get(key)
_ = v.GetString(key)
_ = v.GetInt(key)
_ = v.GetBool(key)
_ = v.GetStringSlice(key)
_ = v.IsSet(key)
}
v.AllSettings()
_ = v.Unmarshal(&map[string]any{})
}
func FuzzConfigYAML(f *testing.F) {
f.Add([]byte(`key: value`))
f.Add([]byte(`nested: { key: value }`))
f.Add([]byte(`key: null`))
f.Add([]byte(strings.Repeat("a: b\n", 100)))
f.Add([]byte(``))
f.Add([]byte(`---`))
f.Add([]byte(`~`))
f.Fuzz(func(t *testing.T, data []byte) {
runConfigFuzz(t, data, "yaml")
})
}
func FuzzConfigJSON(f *testing.F) {
f.Add([]byte(`{"key": "value"}`))
f.Add([]byte(`{}`))
f.Fuzz(func(t *testing.T, data []byte) {
runConfigFuzz(t, data, "json")
})
}
func FuzzConfigTOML(f *testing.F) {
f.Add([]byte(`key = "value"`))
f.Add([]byte(``))
f.Fuzz(func(t *testing.T, data []byte) {
runConfigFuzz(t, data, "toml")
})
}
func FuzzConfigPriority(f *testing.F) {
f.Add([]byte(`target_key: "file_val"`), "env_val", "def_val")
f.Fuzz(func(t *testing.T, data []byte, envVal string, defaultVal string) {
if strings.ContainsAny(envVal, "=\n\r\x00") {
return
}
const envKey = "VIPER_FUZZ_ENV_KEY"
t.Setenv(envKey, envVal)
v := New()
v.SetConfigType("yaml")
v.SetDefault("target_key", defaultVal)
if err := v.BindEnv("target_key", envKey); err != nil {
t.Fatal(err)
}
_ = v.ReadConfig(bytes.NewReader(data))
// Verify priority: Environment variables should override config and defaults
got := v.GetString("target_key")
if envVal != "" {
if got != envVal {
t.Errorf("Priority error: Env should win. got %q, want %q", got, envVal)
}
}
_ = v.GetInt("target_key")
_ = v.GetBool("target_key")
_ = v.GetStringSlice("target_key")
})
}