exec_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package client
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "testing"
  6. "github.com/docker/docker/api/types"
  7. flag "github.com/docker/docker/pkg/mflag"
  8. )
  9. type arguments struct {
  10. args []string
  11. }
  12. func TestParseExec(t *testing.T) {
  13. invalids := map[*arguments]error{
  14. &arguments{[]string{"-unknown"}}: fmt.Errorf("flag provided but not defined: -unknown"),
  15. &arguments{[]string{"-u"}}: fmt.Errorf("flag needs an argument: -u"),
  16. &arguments{[]string{"--user"}}: fmt.Errorf("flag needs an argument: --user"),
  17. }
  18. valids := map[*arguments]*types.ExecConfig{
  19. &arguments{
  20. []string{"container", "command"},
  21. }: {
  22. Container: "container",
  23. Cmd: []string{"command"},
  24. AttachStdout: true,
  25. AttachStderr: true,
  26. },
  27. &arguments{
  28. []string{"container", "command1", "command2"},
  29. }: {
  30. Container: "container",
  31. Cmd: []string{"command1", "command2"},
  32. AttachStdout: true,
  33. AttachStderr: true,
  34. },
  35. &arguments{
  36. []string{"-i", "-t", "-u", "uid", "container", "command"},
  37. }: {
  38. User: "uid",
  39. AttachStdin: true,
  40. AttachStdout: true,
  41. AttachStderr: true,
  42. Tty: true,
  43. Container: "container",
  44. Cmd: []string{"command"},
  45. },
  46. &arguments{
  47. []string{"-d", "container", "command"},
  48. }: {
  49. AttachStdin: false,
  50. AttachStdout: false,
  51. AttachStderr: false,
  52. Detach: true,
  53. Container: "container",
  54. Cmd: []string{"command"},
  55. },
  56. &arguments{
  57. []string{"-t", "-i", "-d", "container", "command"},
  58. }: {
  59. AttachStdin: false,
  60. AttachStdout: false,
  61. AttachStderr: false,
  62. Detach: true,
  63. Tty: true,
  64. Container: "container",
  65. Cmd: []string{"command"},
  66. },
  67. }
  68. for invalid, expectedError := range invalids {
  69. cmd := flag.NewFlagSet("exec", flag.ContinueOnError)
  70. cmd.ShortUsage = func() {}
  71. cmd.SetOutput(ioutil.Discard)
  72. _, err := ParseExec(cmd, invalid.args)
  73. if err == nil || err.Error() != expectedError.Error() {
  74. t.Fatalf("Expected an error [%v] for %v, got %v", expectedError, invalid, err)
  75. }
  76. }
  77. for valid, expectedExecConfig := range valids {
  78. cmd := flag.NewFlagSet("exec", flag.ContinueOnError)
  79. cmd.ShortUsage = func() {}
  80. cmd.SetOutput(ioutil.Discard)
  81. execConfig, err := ParseExec(cmd, valid.args)
  82. if err != nil {
  83. t.Fatal(err)
  84. }
  85. if !compareExecConfig(expectedExecConfig, execConfig) {
  86. t.Fatalf("Expected [%v] for %v, got [%v]", expectedExecConfig, valid, execConfig)
  87. }
  88. }
  89. }
  90. func compareExecConfig(config1 *types.ExecConfig, config2 *types.ExecConfig) bool {
  91. if config1.AttachStderr != config2.AttachStderr {
  92. return false
  93. }
  94. if config1.AttachStdin != config2.AttachStdin {
  95. return false
  96. }
  97. if config1.AttachStdout != config2.AttachStdout {
  98. return false
  99. }
  100. if config1.Container != config2.Container {
  101. return false
  102. }
  103. if config1.Detach != config2.Detach {
  104. return false
  105. }
  106. if config1.Privileged != config2.Privileged {
  107. return false
  108. }
  109. if config1.Tty != config2.Tty {
  110. return false
  111. }
  112. if config1.User != config2.User {
  113. return false
  114. }
  115. if len(config1.Cmd) != len(config2.Cmd) {
  116. return false
  117. }
  118. for index, value := range config1.Cmd {
  119. if value != config2.Cmd[index] {
  120. return false
  121. }
  122. }
  123. return true
  124. }