mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
package setting
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"math/rand"
 | 
						|
	"os"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
)
 | 
						|
 | 
						|
func TestExpandVar_EnvSuccessful(t *testing.T) {
 | 
						|
	const key = "GF_TEST_SETTING_EXPANDER_ENV"
 | 
						|
	const expected = "aurora borealis"
 | 
						|
	t.Setenv(key, expected)
 | 
						|
 | 
						|
	// expanded format
 | 
						|
	{
 | 
						|
		got, err := ExpandVar(fmt.Sprintf("$__env{%s}", key))
 | 
						|
		assert.NoError(t, err)
 | 
						|
		assert.Equal(t, expected, got)
 | 
						|
	}
 | 
						|
 | 
						|
	// short format
 | 
						|
	{
 | 
						|
		got, err := ExpandVar(fmt.Sprintf("${%s}", key))
 | 
						|
		assert.NoError(t, err)
 | 
						|
		assert.Equal(t, expected, got)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestExpandVar_FileSuccessful(t *testing.T) {
 | 
						|
	f, err := os.CreateTemp(os.TempDir(), "file expansion *")
 | 
						|
	require.NoError(t, err)
 | 
						|
	file := f.Name()
 | 
						|
 | 
						|
	defer func() {
 | 
						|
		err := os.Remove(file)
 | 
						|
		require.NoError(t, err)
 | 
						|
	}()
 | 
						|
 | 
						|
	_, err = f.WriteString("hello, world")
 | 
						|
	require.NoError(t, err)
 | 
						|
	err = f.Close()
 | 
						|
	require.NoError(t, err)
 | 
						|
 | 
						|
	got, err := ExpandVar(fmt.Sprintf("$__file{%s}", file))
 | 
						|
	assert.NoError(t, err)
 | 
						|
	assert.Equal(t, "hello, world", got)
 | 
						|
}
 | 
						|
 | 
						|
func TestExpandVar_FileDoesNotExist(t *testing.T) {
 | 
						|
	got, err := ExpandVar(
 | 
						|
		fmt.Sprintf("$__file{%s%sthisisnotarealfile_%d}",
 | 
						|
			os.TempDir(),
 | 
						|
			string(os.PathSeparator),
 | 
						|
			rand.Int63()),
 | 
						|
	)
 | 
						|
	assert.Error(t, err)
 | 
						|
	assert.True(t, errors.Is(err, os.ErrNotExist))
 | 
						|
	assert.Empty(t, got)
 | 
						|
}
 | 
						|
 | 
						|
func TestExpanderRegex(t *testing.T) {
 | 
						|
	tests := map[string][][]string{
 | 
						|
		// we should not expand variables where there are none
 | 
						|
		"smoketest":                          {},
 | 
						|
		"Pa$$word{0}":                        {},
 | 
						|
		"$_almost{but not quite a variable}": {},
 | 
						|
		// args are required
 | 
						|
		"$__file{}": {},
 | 
						|
 | 
						|
		// base cases
 | 
						|
		"${ENV}":             {{"", "ENV"}},
 | 
						|
		"$__env{ENV}":        {{"__env", "ENV"}},
 | 
						|
		"$__file{/dev/null}": {{"__file", "/dev/null"}},
 | 
						|
		"$__vault{item}":     {{"__vault", "item"}},
 | 
						|
		// contains a space in the argument
 | 
						|
		"$__file{C:\\Program Files\\grafana\\something}": {{"__file", "C:\\Program Files\\grafana\\something"}},
 | 
						|
 | 
						|
		// complex cases
 | 
						|
		"get variable from $__env{ENV}ironment":               {{"__env", "ENV"}},
 | 
						|
		"$__env{VAR1} $__file{/var/lib/grafana/secrets/var1}": {{"__env", "VAR1"}, {"__file", "/var/lib/grafana/secrets/var1"}},
 | 
						|
		"$__env{$__file{this is invalid}}":                    {{"__env", "$__file{this is invalid"}},
 | 
						|
	}
 | 
						|
 | 
						|
	for input, expected := range tests {
 | 
						|
		output := regex.FindAllStringSubmatch(input, -1)
 | 
						|
		require.Len(t, output, len(expected))
 | 
						|
		for i, variable := range output {
 | 
						|
			assert.Equal(t, expected[i], variable[1:])
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |