From 651c32eeebcb7d4d8dcefb85c8a3aee2c89a44aa Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Tue, 18 Jun 2024 10:28:36 +0200 Subject: [PATCH] configuration: env vars with array values rendered as a single string --- internal/go-configmap/cli.go | 11 +++++++++++ internal/go-configmap/configuration_test.go | 19 ++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/internal/go-configmap/cli.go b/internal/go-configmap/cli.go index d467cfc9c32..23fb2e147d9 100644 --- a/internal/go-configmap/cli.go +++ b/internal/go-configmap/cli.go @@ -27,6 +27,17 @@ func (c *Map) SetFromCLIArgs(key string, args ...string) error { return nil } + // Some args might be coming from env vars that are specifying multiple values + // in a single string. We expand those cases by splitting every args with whitespace + // Example: args=["e1 e2", "e3"] -> args=["e1","e2","e3"] + argsExpantion := func(values []string) []string { + result := []string{} + for _, v := range values { + result = append(result, strings.Split(v, " ")...) + } + return result + } + args = argsExpantion(args) // in case of schemaless configuration, we don't know the type of the setting // we will save it as a string or array of strings if len(c.schema) == 0 { diff --git a/internal/go-configmap/configuration_test.go b/internal/go-configmap/configuration_test.go index c9c025cb3ce..899abfbb862 100644 --- a/internal/go-configmap/configuration_test.go +++ b/internal/go-configmap/configuration_test.go @@ -20,6 +20,7 @@ import ( "testing" "github.com/arduino/arduino-cli/internal/go-configmap" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/yaml.v3" ) @@ -79,10 +80,22 @@ func TestApplyEnvVars(t *testing.T) { c.Set("foo", "bar") c.Set("fooz.bar", "baz") c.Set("answer", 42) + c.Set("array", []string{}) c.InjectEnvVars([]string{"APP_FOO=app-bar", "APP_FOOZ_BAR=app-baz"}, "APP") - require.Equal(t, "app-bar", c.Get("foo")) - require.Equal(t, "app-baz", c.Get("fooz.bar")) - require.Equal(t, 42, c.Get("answer")) + assert.Equal(t, "app-bar", c.Get("foo")) + assert.Equal(t, "app-baz", c.Get("fooz.bar")) + assert.Equal(t, 42, c.Get("answer")) + + c.InjectEnvVars([]string{"APP_ARRAY=element1 element2 element3"}, "APP") + require.Equal(t, []string{"element1", "element2", "element3"}, c.GetStringSlice("array")) + + // Test env containing array values with typed schema + { + m := configmap.New() + m.SetKeyTypeSchema("array", []string{}) + m.InjectEnvVars([]string{"APP_ARRAY=e1 e2 e3"}, "APP") + require.Equal(t, []string{"e1", "e2", "e3"}, m.GetStringSlice("array")) + } } func TestMerge(t *testing.T) {