exec_test.go 2.9 KB

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