container_exec_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "strings"
  10. "testing"
  11. "github.com/docker/docker/api/types"
  12. "github.com/docker/docker/errdefs"
  13. )
  14. func TestContainerExecCreateError(t *testing.T) {
  15. client := &Client{
  16. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  17. }
  18. _, err := client.ContainerExecCreate(context.Background(), "container_id", types.ExecConfig{})
  19. if err == nil || err.Error() != "Error response from daemon: Server error" {
  20. t.Fatalf("expected a Server Error, got %v", err)
  21. }
  22. if !errdefs.IsSystem(err) {
  23. t.Fatalf("expected a Server Error, got %T", err)
  24. }
  25. }
  26. func TestContainerExecCreate(t *testing.T) {
  27. expectedURL := "/containers/container_id/exec"
  28. client := &Client{
  29. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  30. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  31. return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL)
  32. }
  33. if req.Method != "POST" {
  34. return nil, fmt.Errorf("expected POST method, got %s", req.Method)
  35. }
  36. // FIXME validate the content is the given ExecConfig ?
  37. if err := req.ParseForm(); err != nil {
  38. return nil, err
  39. }
  40. execConfig := &types.ExecConfig{}
  41. if err := json.NewDecoder(req.Body).Decode(execConfig); err != nil {
  42. return nil, err
  43. }
  44. if execConfig.User != "user" {
  45. return nil, fmt.Errorf("expected an execConfig with User == 'user', got %v", execConfig)
  46. }
  47. b, err := json.Marshal(types.IDResponse{
  48. ID: "exec_id",
  49. })
  50. if err != nil {
  51. return nil, err
  52. }
  53. return &http.Response{
  54. StatusCode: http.StatusOK,
  55. Body: ioutil.NopCloser(bytes.NewReader(b)),
  56. }, nil
  57. }),
  58. }
  59. r, err := client.ContainerExecCreate(context.Background(), "container_id", types.ExecConfig{
  60. User: "user",
  61. })
  62. if err != nil {
  63. t.Fatal(err)
  64. }
  65. if r.ID != "exec_id" {
  66. t.Fatalf("expected `exec_id`, got %s", r.ID)
  67. }
  68. }
  69. func TestContainerExecStartError(t *testing.T) {
  70. client := &Client{
  71. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  72. }
  73. err := client.ContainerExecStart(context.Background(), "nothing", types.ExecStartCheck{})
  74. if err == nil || err.Error() != "Error response from daemon: Server error" {
  75. t.Fatalf("expected a Server Error, got %v", err)
  76. }
  77. if !errdefs.IsSystem(err) {
  78. t.Fatalf("expected a Server Error, got %T", err)
  79. }
  80. }
  81. func TestContainerExecStart(t *testing.T) {
  82. expectedURL := "/exec/exec_id/start"
  83. client := &Client{
  84. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  85. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  86. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  87. }
  88. if err := req.ParseForm(); err != nil {
  89. return nil, err
  90. }
  91. execStartCheck := &types.ExecStartCheck{}
  92. if err := json.NewDecoder(req.Body).Decode(execStartCheck); err != nil {
  93. return nil, err
  94. }
  95. if execStartCheck.Tty || !execStartCheck.Detach {
  96. return nil, fmt.Errorf("expected execStartCheck{Detach:true,Tty:false}, got %v", execStartCheck)
  97. }
  98. return &http.Response{
  99. StatusCode: http.StatusOK,
  100. Body: ioutil.NopCloser(bytes.NewReader([]byte(""))),
  101. }, nil
  102. }),
  103. }
  104. err := client.ContainerExecStart(context.Background(), "exec_id", types.ExecStartCheck{
  105. Detach: true,
  106. Tty: false,
  107. })
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. }
  112. func TestContainerExecInspectError(t *testing.T) {
  113. client := &Client{
  114. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  115. }
  116. _, err := client.ContainerExecInspect(context.Background(), "nothing")
  117. if err == nil || err.Error() != "Error response from daemon: Server error" {
  118. t.Fatalf("expected a Server Error, got %v", err)
  119. }
  120. if !errdefs.IsSystem(err) {
  121. t.Fatalf("expected a Server Error, got %T", err)
  122. }
  123. }
  124. func TestContainerExecInspect(t *testing.T) {
  125. expectedURL := "/exec/exec_id/json"
  126. client := &Client{
  127. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  128. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  129. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  130. }
  131. b, err := json.Marshal(types.ContainerExecInspect{
  132. ExecID: "exec_id",
  133. ContainerID: "container_id",
  134. })
  135. if err != nil {
  136. return nil, err
  137. }
  138. return &http.Response{
  139. StatusCode: http.StatusOK,
  140. Body: ioutil.NopCloser(bytes.NewReader(b)),
  141. }, nil
  142. }),
  143. }
  144. inspect, err := client.ContainerExecInspect(context.Background(), "exec_id")
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. if inspect.ExecID != "exec_id" {
  149. t.Fatalf("expected ExecID to be `exec_id`, got %s", inspect.ExecID)
  150. }
  151. if inspect.ContainerID != "container_id" {
  152. t.Fatalf("expected ContainerID `container_id`, got %s", inspect.ContainerID)
  153. }
  154. }