| 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) | |
| } | |
| } |