Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions e2e/tests/up/provider_docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,50 @@ var _ = ginkgo.Describe(
gomega.Expect(customImage).To(gomega.Equal("alpine:latest"))
}, ginkgo.SpecTimeout(framework.GetTimeout()))

ginkgo.It("variable substitution with defaults", func(ctx context.Context) {
tempDir, err := dtc.setupAndUp(
ctx, "tests/up/testdata/docker-variables-defaults",
)
framework.ExpectNoError(err)

workspace, err := dtc.f.FindWorkspace(ctx, tempDir)
framework.ExpectNoError(err)

ids, err := dtc.findWorkspaceContainer(ctx, workspace)
framework.ExpectNoError(err)
gomega.Expect(ids).To(gomega.HaveLen(1))

// Unset var uses simple default
withDefault, err := dtc.execSSHCapture(
ctx, workspace.ID,
"cat $HOME/with-default.out",
)
framework.ExpectNoError(err)
gomega.Expect(withDefault).To(
gomega.Equal("my_default_value"),
)

// Unset var uses default containing colons
colonDefault, err := dtc.execSSHCapture(
ctx, workspace.ID,
"cat $HOME/colon-default.out",
)
framework.ExpectNoError(err)
gomega.Expect(colonDefault).To(
gomega.Equal("http://proxy:8080"),
)

// Set var ignores default
setVar, err := dtc.execSSHCapture(
ctx, workspace.ID,
"cat $HOME/set-var.out",
)
framework.ExpectNoError(err)
gomega.Expect(setVar).To(
gomega.Equal(os.Getenv("HOME")),
)
}, ginkgo.SpecTimeout(framework.GetTimeout()))

ginkgo.It("mounts", func(ctx context.Context) {
tempDir, err := dtc.setupAndUp(ctx, "tests/up/testdata/docker-mounts", "--debug")
framework.ExpectNoError(err)
Expand Down
14 changes: 14 additions & 0 deletions e2e/tests/up/testdata/docker-variables-defaults/.devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "variable-defaults-test",
"image": "ghcr.io/devsy-org/test-images/go:1",
"remoteEnv": {
"WITH_DEFAULT": "${localEnv:VARSUB_NONEXISTENT:my_default_value}",
"COLON_DEFAULT": "${localEnv:VARSUB_NONEXISTENT2:http://proxy:8080}",
"SET_VAR_IGNORES_DEFAULT": "${localEnv:HOME:fallback}"
},
"postCreateCommand": [
"sh",
"-c",
"echo -n $WITH_DEFAULT > $HOME/with-default.out && echo -n $COLON_DEFAULT > $HOME/colon-default.out && echo -n $SET_VAR_IGNORES_DEFAULT > $HOME/set-var.out"
]
}
2 changes: 1 addition & 1 deletion pkg/devcontainer/config/substitute.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ func lookupValue(isWindows bool, env map[string]string, args []string, match str
}

if len(args) > 1 {
defaultValue := args[1]
defaultValue := strings.Join(args[1:], ":")
return defaultValue
}

Expand Down
77 changes: 77 additions & 0 deletions pkg/devcontainer/config/substitute_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package config

import "testing"

func TestLookupValue(t *testing.T) {
tests := []struct {
name string
env map[string]string
args []string
want string
}{
{
name: "var set no default",
env: map[string]string{"HOME": "/root"},
args: []string{"HOME"},
want: "/root",
},
{
name: "var unset no default",
env: map[string]string{},
args: []string{"MISSING"},
want: "",
},
{
name: "var unset simple default",
env: map[string]string{},
args: []string{"MISSING", "fallback"},
want: "fallback",
},
{
name: "var unset default with colons",
env: map[string]string{},
args: []string{
"MISSING", "http",
"//proxy.example.com", "8080",
},
want: "http://proxy.example.com:8080",
},
{
name: "var set default ignored",
env: map[string]string{"VAR": "real"},
args: []string{"VAR", "default"},
want: "real",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := lookupValue(
false, tt.env, tt.args, "${match}",
)
if got != tt.want {
t.Errorf(
"lookupValue() = %q, want %q",
got, tt.want,
)
}
})
}
}

func TestResolveStringDefaultWithColons(t *testing.T) {
replace := func(_, variable string, args []string) string {
env := map[string]string{}
return lookupValue(false, env, args, "${"+variable+"}")
}

got := ResolveString(
"${localEnv:MISSING:http://x:8080}", replace,
)
want := "http://x:8080"
if got != want {
t.Errorf(
"ResolveString() = %q, want %q", got, want,
)
}
}
Loading