Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/config/features/features_test.go
4095 views
1
package features
2
3
import (
4
"flag"
5
"fmt"
6
"strings"
7
"testing"
8
9
"github.com/stretchr/testify/require"
10
)
11
12
func Example() {
13
var (
14
testFeature = Feature("test-feature")
15
16
// Set of flags which require a specific feature to be enabled.
17
dependencies = []Dependency{
18
{Flag: "protected", Feature: testFeature},
19
}
20
)
21
22
fs := flag.NewFlagSet("feature-flags", flag.PanicOnError)
23
fs.String("protected", "", `Requires "test-feature" to be enabled to set.`)
24
Register(fs, []Feature{testFeature})
25
26
if err := fs.Parse([]string{"--protected", "foo"}); err != nil {
27
fmt.Println(err)
28
}
29
30
err := Validate(fs, dependencies)
31
if err != nil {
32
fmt.Println(err)
33
} else {
34
fmt.Println("Everything is valid!")
35
}
36
// Output: flag "protected" requires feature "test-feature" to be provided in --enable-features
37
}
38
39
var (
40
exampleFeature = Feature("test-feature")
41
exampleFeatures = []Feature{exampleFeature}
42
)
43
44
func TestFeatures_Flag(t *testing.T) {
45
fs := flag.NewFlagSet(t.Name(), flag.PanicOnError)
46
Register(fs, exampleFeatures)
47
48
f := fs.Lookup(setFlagName)
49
require.Equal(t,
50
"Comma-delimited list of features to enable. Valid values: test-feature",
51
f.Usage,
52
)
53
54
t.Run("Exact match", func(t *testing.T) {
55
err := f.Value.Set(string(exampleFeature))
56
require.NoError(t, err)
57
require.True(t, Enabled(fs, exampleFeature))
58
})
59
60
t.Run("Case insensitive", func(t *testing.T) {
61
err := f.Value.Set(strings.ToUpper(string(exampleFeature)))
62
require.NoError(t, err)
63
require.True(t, Enabled(fs, exampleFeature))
64
})
65
66
t.Run("Feature does not exist", func(t *testing.T) {
67
err := f.Value.Set(fmt.Sprintf("%s,bad-feature", exampleFeature))
68
require.EqualError(t, err, `unknown feature "bad-feature". possible options: test-feature`)
69
})
70
}
71
72
func TestValidate(t *testing.T) {
73
tt := []struct {
74
name string
75
input []string
76
enabled bool
77
expect error
78
}{
79
{
80
name: "Not enabled and not provided",
81
input: []string{},
82
enabled: false,
83
expect: nil,
84
},
85
{
86
name: "Not enabled but provided",
87
input: []string{"--example-value", "foo"},
88
enabled: false,
89
expect: fmt.Errorf(`flag "example-value" requires feature "test-feature" to be provided in --enable-features`),
90
},
91
{
92
name: "Enabled and provided",
93
input: []string{
94
"--enable-features=test-feature",
95
"--example-value", "foo",
96
},
97
enabled: true,
98
expect: nil,
99
},
100
{
101
name: "Enabled and not provided",
102
input: []string{
103
"--enable-features=test-feature",
104
},
105
enabled: true,
106
expect: nil,
107
},
108
}
109
110
for _, tc := range tt {
111
t.Run(tc.name, func(t *testing.T) {
112
var exampleValue string
113
114
fs := flag.NewFlagSet(t.Name(), flag.PanicOnError)
115
fs.StringVar(&exampleValue, "example-value", "", "")
116
Register(fs, exampleFeatures)
117
118
err := fs.Parse(tc.input)
119
require.NoError(t, err)
120
require.Equal(t, tc.enabled, Enabled(fs, exampleFeature))
121
122
err = Validate(fs, []Dependency{{
123
Flag: "example-value",
124
Feature: exampleFeature,
125
}})
126
if tc.expect == nil {
127
require.NoError(t, err)
128
} else {
129
require.EqualError(t, err, tc.expect.Error())
130
}
131
})
132
}
133
}
134
135