env_test.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package container // import "github.com/docker/docker/container"
  2. import (
  3. "crypto/rand"
  4. "testing"
  5. "gotest.tools/v3/assert"
  6. )
  7. func TestReplaceAndAppendEnvVars(t *testing.T) {
  8. var (
  9. d = []string{"HOME=/", "FOO=foo_default"}
  10. // remove FOO from env
  11. // remove BAR from env (nop)
  12. o = []string{"HOME=/root", "TERM=xterm", "FOO", "BAR"}
  13. )
  14. env := ReplaceOrAppendEnvValues(d, o)
  15. t.Logf("default=%v, override=%v, result=%v", d, o, env)
  16. if len(env) != 2 {
  17. t.Fatalf("expected len of 2 got %d", len(env))
  18. }
  19. if env[0] != "HOME=/root" {
  20. t.Fatalf("expected HOME=/root got '%s'", env[0])
  21. }
  22. if env[1] != "TERM=xterm" {
  23. t.Fatalf("expected TERM=xterm got '%s'", env[1])
  24. }
  25. }
  26. func BenchmarkReplaceOrAppendEnvValues(b *testing.B) {
  27. b.Run("0", func(b *testing.B) {
  28. benchmarkReplaceOrAppendEnvValues(b, 0)
  29. })
  30. b.Run("100", func(b *testing.B) {
  31. benchmarkReplaceOrAppendEnvValues(b, 100)
  32. })
  33. b.Run("1000", func(b *testing.B) {
  34. benchmarkReplaceOrAppendEnvValues(b, 1000)
  35. })
  36. b.Run("10000", func(b *testing.B) {
  37. benchmarkReplaceOrAppendEnvValues(b, 10000)
  38. })
  39. }
  40. func benchmarkReplaceOrAppendEnvValues(b *testing.B, extraEnv int) {
  41. b.StopTimer()
  42. // remove FOO from env
  43. // remove BAR from env (nop)
  44. o := []string{"HOME=/root", "TERM=xterm", "FOO", "BAR"}
  45. if extraEnv > 0 {
  46. buf := make([]byte, 5)
  47. for i := 0; i < extraEnv; i++ {
  48. n, err := rand.Read(buf)
  49. assert.NilError(b, err)
  50. key := string(buf[:n])
  51. n, err = rand.Read(buf)
  52. assert.NilError(b, err)
  53. val := string(buf[:n])
  54. o = append(o, key+"="+val)
  55. }
  56. }
  57. d := make([]string, 0, len(o)+2)
  58. d = append(d, []string{"HOME=/", "FOO=foo_default"}...)
  59. b.StartTimer()
  60. for i := 0; i < b.N; i++ {
  61. _ = ReplaceOrAppendEnvValues(d, o)
  62. }
  63. }