Skip to content

Commit 71fb950

Browse files
committed
improve tests for extra_env
1 parent 3356f9f commit 71fb950

File tree

2 files changed

+139
-20
lines changed

2 files changed

+139
-20
lines changed

internal/provider/cached_image_resource_test.go

Lines changed: 108 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ func TestAccCachedImageResource(t *testing.T) {
2020
defer cancel()
2121

2222
for _, tc := range []struct {
23-
name string
24-
files map[string]string
23+
name string
24+
files map[string]string
25+
extraEnv map[string]string
26+
assertEnv func(t *testing.T, deps testDependencies) resource.TestCheckFunc
2527
}{
2628
{
2729
// This test case is the simplest possible case: a devcontainer.json.
@@ -31,6 +33,33 @@ func TestAccCachedImageResource(t *testing.T) {
3133
files: map[string]string{
3234
".devcontainer/devcontainer.json": `{"image": "localhost:5000/test-ubuntu:latest"}`,
3335
},
36+
extraEnv: map[string]string{
37+
"FOO": testEnvValue,
38+
"ENVBUILDER_GIT_URL": "https://not.the.real.git/url",
39+
"ENVBUILDER_CACHE_REPO": "not-the-real-cache-repo",
40+
},
41+
assertEnv: func(t *testing.T, deps testDependencies) resource.TestCheckFunc {
42+
return resource.ComposeAggregateTestCheckFunc(
43+
// Check that the environment variables are set correctly.
44+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%s", deps.CacheRepo)),
45+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH=%s", deps.Repo.Key)),
46+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_GIT_URL=%s", deps.Repo.URL)),
47+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.3", "ENVBUILDER_REMOTE_REPO_BUILD_MODE=true"),
48+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.4", "ENVBUILDER_VERBOSE=true"),
49+
// Check that the extra environment variables are set correctly.
50+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.5", "FOO=bar\nbaz"),
51+
// We should not have any other environment variables set.
52+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "env.6"),
53+
54+
// Check that the same values are set in env_map.
55+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_CACHE_REPO", deps.CacheRepo),
56+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH", deps.Repo.Key),
57+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_GIT_URL", deps.Repo.URL),
58+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_REMOTE_REPO_BUILD_MODE", "true"),
59+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_VERBOSE", "true"),
60+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.FOO", "bar\nbaz"),
61+
)
62+
},
3463
},
3564
{
3665
// This test case includes a Dockerfile in addition to the devcontainer.json.
@@ -42,14 +71,84 @@ func TestAccCachedImageResource(t *testing.T) {
4271
".devcontainer/Dockerfile": `FROM localhost:5000/test-ubuntu:latest
4372
RUN date > /date.txt`,
4473
},
74+
extraEnv: map[string]string{
75+
"FOO": testEnvValue,
76+
"ENVBUILDER_GIT_URL": "https://not.the.real.git/url",
77+
"ENVBUILDER_CACHE_REPO": "not-the-real-cache-repo",
78+
},
79+
assertEnv: func(t *testing.T, deps testDependencies) resource.TestCheckFunc {
80+
return resource.ComposeAggregateTestCheckFunc(
81+
// Check that the environment variables are set correctly.
82+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%s", deps.CacheRepo)),
83+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH=%s", deps.Repo.Key)),
84+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_GIT_URL=%s", deps.Repo.URL)),
85+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.3", "ENVBUILDER_REMOTE_REPO_BUILD_MODE=true"),
86+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.4", "ENVBUILDER_VERBOSE=true"),
87+
// Check that the extra environment variables are set correctly.
88+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.5", "FOO=bar\nbaz"),
89+
// We should not have any other environment variables set.
90+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "env.6"),
91+
92+
// Check that the same values are set in env_map.
93+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_CACHE_REPO", deps.CacheRepo),
94+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH", deps.Repo.Key),
95+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_GIT_URL", deps.Repo.URL),
96+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_REMOTE_REPO_BUILD_MODE", "true"),
97+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_VERBOSE", "true"),
98+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.FOO", "bar\nbaz"),
99+
)
100+
},
101+
},
102+
{
103+
// This test case ensures that parameters passed via extra_env are
104+
// handled correctly.
105+
name: "extra_env",
106+
files: map[string]string{
107+
"path/to/.devcontainer/devcontainer.json": `{"build": { "dockerfile": "Dockerfile" }}`,
108+
"path/to/.devcontainer/Dockerfile": `FROM localhost:5000/test-ubuntu:latest
109+
RUN date > /date.txt`,
110+
},
111+
extraEnv: map[string]string{
112+
"FOO": testEnvValue,
113+
"ENVBUILDER_GIT_URL": "https://not.the.real.git/url",
114+
"ENVBUILDER_CACHE_REPO": "not-the-real-cache-repo",
115+
"ENVBUILDER_DEVCONTAINER_DIR": "path/to/.devcontainer",
116+
"ENVBUILDER_DEVCONTAINER_JSON_PATH": "path/to/.devcontainer/devcontainer.json",
117+
"ENVBUILDER_DOCKERFILE_PATH": "path/to/.devcontainer/Dockerfile",
118+
},
119+
assertEnv: func(t *testing.T, deps testDependencies) resource.TestCheckFunc {
120+
return resource.ComposeAggregateTestCheckFunc(
121+
// Check that the environment variables are set correctly.
122+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%s", deps.CacheRepo)),
123+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_DEVCONTAINER_DIR=%s", deps.ExtraEnv["ENVBUILDER_DEVCONTAINER_DIR"])),
124+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_DEVCONTAINER_JSON_PATH=%s", deps.ExtraEnv["ENVBUILDER_DEVCONTAINER_JSON_PATH"])),
125+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.3", fmt.Sprintf("ENVBUILDER_DOCKERFILE_PATH=%s", deps.ExtraEnv["ENVBUILDER_DOCKERFILE_PATH"])),
126+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.4", fmt.Sprintf("ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH=%s", deps.Repo.Key)),
127+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.5", fmt.Sprintf("ENVBUILDER_GIT_URL=%s", deps.Repo.URL)),
128+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.6", "ENVBUILDER_REMOTE_REPO_BUILD_MODE=true"),
129+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.7", "ENVBUILDER_VERBOSE=true"),
130+
// Check that the extra environment variables are set correctly.
131+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.8", "FOO=bar\nbaz"),
132+
// We should not have any other environment variables set.
133+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "env.9"),
134+
135+
// Check that the same values are set in env_map.
136+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_CACHE_REPO", deps.CacheRepo),
137+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_DEVCONTAINER_DIR", deps.ExtraEnv["ENVBUILDER_DEVCONTAINER_DIR"]),
138+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_DEVCONTAINER_JSON_PATH", deps.ExtraEnv["ENVBUILDER_DEVCONTAINER_JSON_PATH"]),
139+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_DOCKERFILE_PATH", deps.ExtraEnv["ENVBUILDER_DOCKERFILE_PATH"]),
140+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH", deps.Repo.Key),
141+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_GIT_URL", deps.Repo.URL),
142+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_REMOTE_REPO_BUILD_MODE", "true"),
143+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.ENVBUILDER_VERBOSE", "true"),
144+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env_map.FOO", "bar\nbaz"),
145+
)
146+
},
45147
},
46148
} {
47149
t.Run(tc.name, func(t *testing.T) {
48150
//nolint: paralleltest
49-
deps := setup(ctx, t, tc.files)
50-
deps.ExtraEnv["FOO"] = testEnvValue
51-
deps.ExtraEnv["ENVBUILDER_GIT_URL"] = "https://not.the.real.git/url"
52-
deps.ExtraEnv["ENVBUILDER_CACHE_REPO"] = "not-the-real-cache-repo"
151+
deps := setup(ctx, t, tc.extraEnv, tc.files)
53152

54153
resource.Test(t, resource.TestCase{
55154
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
@@ -78,7 +177,7 @@ RUN date > /date.txt`,
78177
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_password"),
79178
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "cache_ttl_days"),
80179
// Environment variables
81-
assertEnv(t, deps),
180+
tc.assertEnv(t, deps),
82181
),
83182
ExpectNonEmptyPlan: true, // TODO: check the plan.
84183
},
@@ -100,7 +199,7 @@ RUN date > /date.txt`,
100199
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_password"),
101200
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "cache_ttl_days"),
102201
// Environment variables
103-
assertEnv(t, deps),
202+
tc.assertEnv(t, deps),
104203
),
105204
ExpectNonEmptyPlan: true, // TODO: check the plan.
106205
},
@@ -125,7 +224,7 @@ RUN date > /date.txt`,
125224
resource.TestCheckResourceAttrSet("envbuilder_cached_image.test", "image"),
126225
resource.TestCheckResourceAttrWith("envbuilder_cached_image.test", "image", quotedPrefix(deps.CacheRepo)),
127226
// Environment variables
128-
assertEnv(t, deps),
227+
tc.assertEnv(t, deps),
129228
),
130229
},
131230
// 5) Should produce an empty plan after apply

internal/provider/provider_test.go

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func quote(s string) string {
7171
return fmt.Sprintf("%q", s)
7272
}
7373

74-
func setup(ctx context.Context, t testing.TB, files map[string]string) testDependencies {
74+
func setup(ctx context.Context, t testing.TB, extraEnv, files map[string]string) testDependencies {
7575
t.Helper()
7676

7777
envbuilderImage := getEnvOrDefault("ENVBUILDER_IMAGE", "localhost:5000/envbuilder")
@@ -89,7 +89,7 @@ func setup(ctx context.Context, t testing.TB, files map[string]string) testDepen
8989
return testDependencies{
9090
BuilderImage: envbuilderImageRef,
9191
CacheRepo: reg + "/test",
92-
ExtraEnv: make(map[string]string),
92+
ExtraEnv: extraEnv,
9393
Repo: gitRepo,
9494
}
9595
}
@@ -106,18 +106,38 @@ func seedCache(ctx context.Context, t testing.TB, deps testDependencies) {
106106

107107
ensureImage(ctx, t, cli, deps.BuilderImage)
108108

109+
// Set up env for envbuilder
110+
seedEnv := map[string]string{
111+
"ENVBUILDER_CACHE_REPO": deps.CacheRepo,
112+
"ENVBUILDER_EXIT_ON_BUILD_FAILURE": "true",
113+
"ENVBUILDER_INIT_SCRIPT": "exit",
114+
"ENVBUILDER_PUSH_IMAGE": "true",
115+
"ENVBUILDER_VERBOSE": "true",
116+
"ENVBUILDER_GIT_URL": deps.Repo.URL,
117+
"ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH": "/id_ed25519",
118+
}
119+
120+
for k, v := range deps.ExtraEnv {
121+
if !strings.HasPrefix(k, "ENVBUILDER_") {
122+
continue
123+
}
124+
if _, ok := seedEnv[k]; ok {
125+
continue
126+
}
127+
seedEnv[k] = v
128+
}
129+
130+
seedDockerEnv := make([]string, 0)
131+
for k, v := range seedEnv {
132+
seedDockerEnv = append(seedDockerEnv, k+"="+v)
133+
}
134+
135+
t.Logf("running envbuilder to seed cache with args: %v", seedDockerEnv)
136+
109137
// Run envbuilder using this dir as a local layer cache
110138
ctr, err := cli.ContainerCreate(ctx, &container.Config{
111139
Image: deps.BuilderImage,
112-
Env: []string{
113-
"ENVBUILDER_CACHE_REPO=" + deps.CacheRepo,
114-
"ENVBUILDER_EXIT_ON_BUILD_FAILURE=true",
115-
"ENVBUILDER_INIT_SCRIPT=exit",
116-
"ENVBUILDER_PUSH_IMAGE=true",
117-
"ENVBUILDER_VERBOSE=true",
118-
"ENVBUILDER_GIT_URL=" + deps.Repo.URL,
119-
"ENVBUILDER_GIT_SSH_PRIVATE_KEY_PATH=/id_ed25519",
120-
},
140+
Env: seedDockerEnv,
121141
Labels: map[string]string{
122142
testContainerLabel: "true",
123143
},

0 commit comments

Comments
 (0)