// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package vespa import ( "io" "os" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/vespa-engine/vespa/client/go/internal/admin/trace" ) func setup(t *testing.T, contents string) string { td := t.TempDir() tmp := td + "/load_env_test.tmp" vdir := tmp + "/vespa" bdir := vdir + "/bin" cdir := vdir + "/conf/vespa" envf := cdir + "/default-env.txt" err := os.MkdirAll(cdir, 0755) assert.Nil(t, err) t.Setenv("VESPA_HOME", vdir) err = os.MkdirAll(bdir, 0755) assert.Nil(t, err) err = os.WriteFile(envf, []byte(contents), 0644) assert.Nil(t, err) return tmp } func TestLoadEnvSimple(t *testing.T) { trace.AdjustVerbosity(0) t.Setenv("VESPA_FOO", "was foo") t.Setenv("VESPA_BAR", "was bar") t.Setenv("VESPA_FOOBAR", "foobar") os.Unsetenv("VESPA_QUUX") setup(t, ` # vespa env vars file override VESPA_FOO "new foo" fallback VESPA_BAR "new bar" fallback VESPA_QUUX "new quux" fallback VESPA_QUUX "bad quux" unset VESPA_FOOBAR `) // run it err := LoadDefaultEnv() assert.Nil(t, err) // check results assert.Equal(t, os.Getenv("VESPA_FOO"), "new foo") assert.Equal(t, os.Getenv("VESPA_BAR"), "was bar") assert.Equal(t, os.Getenv("VESPA_FOOBAR"), "") assert.Equal(t, os.Getenv("VESPA_QUUX"), "new quux") _, present := os.LookupEnv("VESPA_FOOBAR") assert.Equal(t, present, false) } func TestLoadEnvWhiteSpace(t *testing.T) { // note trailing whitespace below! setup(t, ` # vespa env vars file override VESPA_V1 v1 override VESPA_V2 v2 override VESPA_V3 spaced v3 v3 override VESPA_V4 " quoted spaced " override VESPA_V5 v5 `) // run it err := LoadDefaultEnv() assert.Nil(t, err) // check results assert.Equal(t, os.Getenv("VESPA_V1"), "v1") assert.Equal(t, os.Getenv("VESPA_V2"), "v2") assert.Equal(t, os.Getenv("VESPA_V3"), "spaced v3 v3") assert.Equal(t, os.Getenv("VESPA_V4"), " quoted spaced ") assert.Equal(t, os.Getenv("VESPA_V5"), "v5") } func TestLoadEnvBadAction(t *testing.T) { setup(t, ` # vespa env vars file override VESPA_V1 v1 some junk here override VESPA_V2 v2 `) // run it err := LoadDefaultEnv() // check results assert.Equal(t, os.Getenv("VESPA_V1"), "v1") assert.Equal(t, os.Getenv("VESPA_V2"), "v2") assert.NotNil(t, err) assert.Equal(t, err.Error(), "unknown action 'some'") } func TestLoadEnvBadVar(t *testing.T) { setup(t, ` # vespa env vars file override VESPA_V1 v1 override .A foobar override VESPA_V2 v2 `) // run it err := LoadDefaultEnv() // check results assert.Equal(t, os.Getenv("VESPA_V1"), "v1") assert.Equal(t, os.Getenv("VESPA_V2"), "v2") assert.NotNil(t, err) assert.Equal(t, err.Error(), "Not a valid environment variable name: '.A'") } func TestFindUser(t *testing.T) { u := FindVespaUser() if u == "" { t.Log("WARNING: empty result from FindVespaUser()") } else { t.Log("INFO: result from FindVespaUser() is", u) assert.Equal(t, u, os.Getenv("VESPA_USER")) } setup(t, ` override VESPA_USER unprivuser `) LoadDefaultEnv() u = FindVespaUser() assert.Equal(t, "unprivuser", u) } func TestExportEnv(t *testing.T) { t.Setenv("VESPA_FOO", "was foo") t.Setenv("VESPA_BAR", "was bar") t.Setenv("VESPA_FOOBAR", "foobar") t.Setenv("VESPA_ALREADY", "already") t.Setenv("VESPA_BARFOO", "was barfoo") os.Unsetenv("VESPA_QUUX") setup(t, ` # vespa env vars file override VESPA_FOO "newFoo1" fallback VESPA_FOO "bad foo" fallback VESPA_BAR "new bar" fallback VESPA_QUUX "new quux" fallback VESPA_QUUX "bad quux" fallback VESPA_ALREADY "already" unset VESPA_FOOBAR unset VESPA_BARFOO fallback VESPA_BARFOO new'br'foo override XYZ xyz unset XYZ `) holder := newShellEnvExporter() err := loadDefaultEnvTo(holder) assert.Nil(t, err) // new values: assert.Equal(t, "newFoo1", holder.exportVars["VESPA_FOO"]) assert.Equal(t, "", holder.exportVars["VESPA_BAR"]) assert.Equal(t, "'new quux'", holder.exportVars["VESPA_QUUX"]) assert.Equal(t, `'new'\''br'\''foo'`, holder.exportVars["VESPA_BARFOO"]) assert.Equal(t, "already", holder.exportVars["VESPA_ALREADY"]) // unsets: assert.Equal(t, "", holder.exportVars["VESPA_FOOBAR"]) assert.Equal(t, "unset", holder.unsetVars["VESPA_FOOBAR"]) assert.Equal(t, "", holder.exportVars["XYZ"]) assert.Equal(t, "unset", holder.unsetVars["XYZ"]) // nothing extra allowed: assert.Equal(t, 4, len(holder.exportVars)) assert.Equal(t, 2, len(holder.unsetVars)) // run it w := io.Discard if testing.Verbose() { w = os.Stdout } err = ExportDefaultEnvTo(w) assert.Nil(t, err) } func TestLoadEnvNop(t *testing.T) { td := setup(t, "") t.Setenv("PATH", td) err := LoadDefaultEnv() assert.Nil(t, err) // check results path := os.Getenv("PATH") t.Log("got path:", path) assert.True(t, strings.Contains(path, td+"/vespa/bin:")) assert.True(t, strings.Contains(path, ":"+td)) }