Package fflag provides a simple feature flag system. Feature names are lowercase and can only contain letters, numbers, undercores and dots. good: "foo", "foo_bar", "foo.bar" bad: "Foo", "foo-bar" A feature flag can be enabled by the user with an environment variable or by adding it to {ConfigDir}/feature.yaml I.e. CROWDSEC_FEATURE_FOO_BAR=true or in feature.yaml: ``` --- - foo_bar ``` If the variable is set to false, the feature can still be enabled in feature.yaml. Features cannot be disabled in the file. A feature flag can be deprecated or retired. A deprecated feature flag is still accepted but a warning is logged. A retired feature flag is ignored and an error is logged. A specific deprecation message is used to inform the user of the behavior that has been decided when the flag is/was finally retired.
100 lines
1.9 KiB
Go
100 lines
1.9 KiB
Go
package cstest
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"text/template"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
logtest "github.com/sirupsen/logrus/hooks/test"
|
|
)
|
|
|
|
func AssertErrorContains(t *testing.T, err error, expectedErr string) {
|
|
t.Helper()
|
|
|
|
if expectedErr != "" {
|
|
assert.ErrorContains(t, err, expectedErr)
|
|
return
|
|
}
|
|
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func AssertErrorMessage(t *testing.T, err error, expectedErr string) {
|
|
t.Helper()
|
|
|
|
if expectedErr != "" {
|
|
errmsg := ""
|
|
if err != nil {
|
|
errmsg = err.Error()
|
|
}
|
|
assert.Equal(t, expectedErr, errmsg)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func RequireErrorContains(t *testing.T, err error, expectedErr string) {
|
|
t.Helper()
|
|
|
|
if expectedErr != "" {
|
|
require.ErrorContains(t, err, expectedErr)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func RequireErrorMessage(t *testing.T, err error, expectedErr string) {
|
|
t.Helper()
|
|
|
|
if expectedErr != "" {
|
|
errmsg := ""
|
|
if err != nil {
|
|
errmsg = err.Error()
|
|
}
|
|
require.Equal(t, expectedErr, errmsg)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func RequireLogContains(t *testing.T, hook *logtest.Hook, expected string) {
|
|
t.Helper()
|
|
|
|
// look for a log entry that matches the expected message
|
|
for _, entry := range hook.AllEntries() {
|
|
if strings.Contains(entry.Message, expected) {
|
|
return
|
|
}
|
|
}
|
|
|
|
// show all hook entries, in case the test fails we'll need them
|
|
for _, entry := range hook.AllEntries() {
|
|
t.Logf("log entry: %s", entry.Message)
|
|
}
|
|
|
|
require.Fail(t, "no log entry found with message", expected)
|
|
}
|
|
|
|
// Interpolate fills a string template with the given values, can be map or struct.
|
|
// example: Interpolate("{{.Name}}", map[string]string{"Name": "JohnDoe"})
|
|
func Interpolate(s string, data interface{}) (string, error) {
|
|
tmpl, err := template.New("").Parse(s)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var b strings.Builder
|
|
err = tmpl.Execute(&b, data)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return b.String(), nil
|
|
}
|