package container // import "github.com/docker/docker/container" import ( "crypto/rand" "testing" "gotest.tools/v3/assert" ) func TestReplaceAndAppendEnvVars(t *testing.T) { var ( d = []string{"HOME=/", "FOO=foo_default"} // remove FOO from env // remove BAR from env (nop) o = []string{"HOME=/root", "TERM=xterm", "FOO", "BAR"} ) env := ReplaceOrAppendEnvValues(d, o) t.Logf("default=%v, override=%v, result=%v", d, o, env) if len(env) != 2 { t.Fatalf("expected len of 2 got %d", len(env)) } if env[0] != "HOME=/root" { t.Fatalf("expected HOME=/root got '%s'", env[0]) } if env[1] != "TERM=xterm" { t.Fatalf("expected TERM=xterm got '%s'", env[1]) } } func BenchmarkReplaceOrAppendEnvValues(b *testing.B) { b.Run("0", func(b *testing.B) { benchmarkReplaceOrAppendEnvValues(b, 0) }) b.Run("100", func(b *testing.B) { benchmarkReplaceOrAppendEnvValues(b, 100) }) b.Run("1000", func(b *testing.B) { benchmarkReplaceOrAppendEnvValues(b, 1000) }) b.Run("10000", func(b *testing.B) { benchmarkReplaceOrAppendEnvValues(b, 10000) }) } func benchmarkReplaceOrAppendEnvValues(b *testing.B, extraEnv int) { b.StopTimer() // remove FOO from env // remove BAR from env (nop) o := []string{"HOME=/root", "TERM=xterm", "FOO", "BAR"} if extraEnv > 0 { buf := make([]byte, 5) for i := 0; i < extraEnv; i++ { n, err := rand.Read(buf) assert.NilError(b, err) key := string(buf[:n]) n, err = rand.Read(buf) assert.NilError(b, err) val := string(buf[:n]) o = append(o, key+"="+val) } } d := make([]string, 0, len(o)+2) d = append(d, []string{"HOME=/", "FOO=foo_default"}...) b.StartTimer() for i := 0; i < b.N; i++ { _ = ReplaceOrAppendEnvValues(d, o) } }