From c4848765ed6dcf6372e335342c90a8769cf0fda3 Mon Sep 17 00:00:00 2001 From: chansuke Date: Sat, 23 May 2026 17:53:05 +0900 Subject: [PATCH] generate: fix env cache keys Signed-off-by: chansuke --- generate/generate.go | 3 ++- generate/generate_test.go | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/generate/generate.go b/generate/generate.go index 816305f0..8328a447 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -322,7 +322,8 @@ func NewFromTemplate(r io.Reader) (Generator, error) { func createEnvCacheMap(env []string) map[string]int { envMap := make(map[string]int, len(env)) for i, val := range env { - envMap[val] = i + parts := strings.SplitN(val, "=", 2) + envMap[parts[0]] = i } return envMap } diff --git a/generate/generate_test.go b/generate/generate_test.go index b27dc3fc..d59a4d10 100644 --- a/generate/generate_test.go +++ b/generate/generate_test.go @@ -4,8 +4,10 @@ import ( "os" "path/filepath" "runtime" + "strings" "testing" + rspec "github.com/opencontainers/runtime-spec/specs-go" rfc2119 "github.com/opencontainers/runtime-tools/error" "github.com/opencontainers/runtime-tools/generate" "github.com/opencontainers/runtime-tools/specerror" @@ -126,6 +128,50 @@ func TestEnvCaching(t *testing.T) { assert.Equal(t, []string(nil), g.Config.Process.Env) } +func TestEnvCachingFromExistingSpec(t *testing.T) { + tests := []struct { + name string + new func(t *testing.T) generate.Generator + }{ + { + name: "from template", + new: func(t *testing.T) generate.Generator { + t.Helper() + + g, err := generate.NewFromTemplate(strings.NewReader(`{"process":{"env":["PATH=/bin","TERM=xterm"]}}`)) + if err != nil { + t.Fatal(err) + } + return g + }, + }, + { + name: "from spec", + new: func(t *testing.T) generate.Generator { + t.Helper() + + return generate.NewFromSpec(&rspec.Spec{ + Process: &rspec.Process{ + Env: []string{"PATH=/bin", "TERM=xterm"}, + }, + }) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + g := tt.new(t) + + g.AddProcessEnv("PATH", "/usr/bin") + g.AddMultipleProcessEnv([]string{"TERM=vt100"}) + + expected := []string{"PATH=/usr/bin", "TERM=vt100"} + assert.Equal(t, expected, g.Config.Process.Env) + }) + } +} + func TestMultipleEnvCaching(t *testing.T) { // Start with empty ENV and add a few g, err := generate.New("windows")