|
@@ -0,0 +1,98 @@
|
|
|
|
+package csstring_test
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "fmt"
|
|
|
|
+ "testing"
|
|
|
|
+
|
|
|
|
+ "github.com/stretchr/testify/assert"
|
|
|
|
+
|
|
|
|
+ "github.com/crowdsecurity/crowdsec/pkg/csstring"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func TestStrictExpand(t *testing.T) {
|
|
|
|
+ t.Parallel()
|
|
|
|
+
|
|
|
|
+ testenv := func(key string) (string, bool) {
|
|
|
|
+ switch key {
|
|
|
|
+ case "USER":
|
|
|
|
+ return "testuser", true
|
|
|
|
+ case "HOME":
|
|
|
|
+ return "/home/testuser", true
|
|
|
|
+ case "empty":
|
|
|
|
+ return "", true
|
|
|
|
+ default:
|
|
|
|
+ return "", false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ home, _ := testenv("HOME")
|
|
|
|
+ user, _ := testenv("USER")
|
|
|
|
+
|
|
|
|
+ tests := []struct {
|
|
|
|
+ input string
|
|
|
|
+ expected string
|
|
|
|
+ }{
|
|
|
|
+ {
|
|
|
|
+ input: "$HOME",
|
|
|
|
+ expected: home,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "${USER}",
|
|
|
|
+ expected: user,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "Hello, $USER!",
|
|
|
|
+ expected: fmt.Sprintf("Hello, %s!", user),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "My home directory is ${HOME}",
|
|
|
|
+ expected: fmt.Sprintf("My home directory is %s", home),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "This is a $SINGLE_VAR string with ${HOME}",
|
|
|
|
+ expected: fmt.Sprintf("This is a $SINGLE_VAR string with %s", home),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "This is a $SINGLE_VAR string with $HOME",
|
|
|
|
+ expected: fmt.Sprintf("This is a $SINGLE_VAR string with %s", home),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "This variable does not exist: $NON_EXISTENT_VAR",
|
|
|
|
+ expected: "This variable does not exist: $NON_EXISTENT_VAR",
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "This is a $MULTI_VAR string with ${HOME} and ${USER}",
|
|
|
|
+ expected: fmt.Sprintf("This is a $MULTI_VAR string with %s and %s", home, user),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "This is a ${MULTI_VAR} string with $HOME and $USER",
|
|
|
|
+ expected: fmt.Sprintf("This is a ${MULTI_VAR} string with %s and %s", home, user),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "This is a plain string with no variables",
|
|
|
|
+ expected: "This is a plain string with no variables",
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "$empty",
|
|
|
|
+ expected: "",
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "",
|
|
|
|
+ expected: "",
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ input: "$USER:$empty:$HOME",
|
|
|
|
+ expected: fmt.Sprintf("%s::%s", user, home),
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, tc := range tests {
|
|
|
|
+ tc := tc
|
|
|
|
+ t.Run(tc.input, func(t *testing.T) {
|
|
|
|
+ t.Parallel()
|
|
|
|
+
|
|
|
|
+ output := csstring.StrictExpand(tc.input, testenv)
|
|
|
|
+ assert.Equal(t, tc.expected, output)
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+}
|