client_test.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package client
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "os"
  9. "strings"
  10. "testing"
  11. _ "github.com/docker/docker/libnetwork/testutils"
  12. )
  13. // nopCloser is used to provide a dummy CallFunc for Cmd()
  14. type nopCloser struct {
  15. io.Reader
  16. }
  17. func (nopCloser) Close() error { return nil }
  18. func TestMain(m *testing.M) {
  19. setupMockHTTPCallback()
  20. os.Exit(m.Run())
  21. }
  22. var callbackFunc func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, http.Header, int, error)
  23. var mockNwJSON, mockNwListJSON, mockServiceJSON, mockServiceListJSON, mockSbJSON, mockSbListJSON []byte
  24. var mockNwName = "test"
  25. var mockNwID = "2a3456789"
  26. var mockServiceName = "testSrv"
  27. var mockServiceID = "2a3456789"
  28. var mockContainerID = "2a3456789"
  29. var mockSandboxID = "2b3456789"
  30. func setupMockHTTPCallback() {
  31. var list []networkResource
  32. nw := networkResource{Name: mockNwName, ID: mockNwID}
  33. mockNwJSON, _ = json.Marshal(nw)
  34. list = append(list, nw)
  35. mockNwListJSON, _ = json.Marshal(list)
  36. var srvList []serviceResource
  37. ep := serviceResource{Name: mockServiceName, ID: mockServiceID, Network: mockNwName}
  38. mockServiceJSON, _ = json.Marshal(ep)
  39. srvList = append(srvList, ep)
  40. mockServiceListJSON, _ = json.Marshal(srvList)
  41. var sbxList []SandboxResource
  42. sb := SandboxResource{ID: mockSandboxID, ContainerID: mockContainerID}
  43. mockSbJSON, _ = json.Marshal(sb)
  44. sbxList = append(sbxList, sb)
  45. mockSbListJSON, _ = json.Marshal(sbxList)
  46. dummyHTTPHdr := http.Header{}
  47. callbackFunc = func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, http.Header, int, error) {
  48. var rsp string
  49. switch method {
  50. case "GET":
  51. if strings.Contains(path, fmt.Sprintf("networks?name=%s", mockNwName)) {
  52. rsp = string(mockNwListJSON)
  53. } else if strings.Contains(path, "networks?name=") {
  54. rsp = "[]"
  55. } else if strings.Contains(path, fmt.Sprintf("networks?partial-id=%s", mockNwID)) {
  56. rsp = string(mockNwListJSON)
  57. } else if strings.Contains(path, "networks?partial-id=") {
  58. rsp = "[]"
  59. } else if strings.HasSuffix(path, "networks") {
  60. rsp = string(mockNwListJSON)
  61. } else if strings.HasSuffix(path, "networks/"+mockNwID) {
  62. rsp = string(mockNwJSON)
  63. } else if strings.Contains(path, fmt.Sprintf("services?name=%s", mockServiceName)) {
  64. rsp = string(mockServiceListJSON)
  65. } else if strings.Contains(path, "services?name=") {
  66. rsp = "[]"
  67. } else if strings.Contains(path, fmt.Sprintf("services?partial-id=%s", mockServiceID)) {
  68. rsp = string(mockServiceListJSON)
  69. } else if strings.Contains(path, "services?partial-id=") {
  70. rsp = "[]"
  71. } else if strings.HasSuffix(path, "services") {
  72. rsp = string(mockServiceListJSON)
  73. } else if strings.HasSuffix(path, "services/"+mockServiceID) {
  74. rsp = string(mockServiceJSON)
  75. } else if strings.Contains(path, "containers") {
  76. return nopCloser{bytes.NewBufferString("")}, dummyHTTPHdr, 400, fmt.Errorf("Bad Request")
  77. } else if strings.Contains(path, fmt.Sprintf("sandboxes?container-id=%s", mockContainerID)) {
  78. rsp = string(mockSbListJSON)
  79. } else if strings.Contains(path, fmt.Sprintf("sandboxes?partial-container-id=%s", mockContainerID)) {
  80. rsp = string(mockSbListJSON)
  81. }
  82. case "POST":
  83. var data []byte
  84. if strings.HasSuffix(path, "networks") {
  85. data, _ = json.Marshal(mockNwID)
  86. } else if strings.HasSuffix(path, "services") {
  87. data, _ = json.Marshal(mockServiceID)
  88. } else if strings.HasSuffix(path, "backend") {
  89. data, _ = json.Marshal(mockSandboxID)
  90. }
  91. rsp = string(data)
  92. case "PUT":
  93. case "DELETE":
  94. rsp = ""
  95. }
  96. return nopCloser{bytes.NewBufferString(rsp)}, dummyHTTPHdr, 200, nil
  97. }
  98. }
  99. func TestClientDummyCommand(t *testing.T) {
  100. var out, errOut bytes.Buffer
  101. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  102. err := cli.Cmd("docker", "dummy")
  103. if err == nil {
  104. t.Fatal("Incorrect Command must fail")
  105. }
  106. }
  107. func TestClientNetworkInvalidCommand(t *testing.T) {
  108. var out, errOut bytes.Buffer
  109. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  110. err := cli.Cmd("docker", "network", "invalid")
  111. if err == nil {
  112. t.Fatal("Passing invalid commands must fail")
  113. }
  114. }
  115. func TestClientNetworkCreate(t *testing.T) {
  116. var out, errOut bytes.Buffer
  117. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  118. err := cli.Cmd("docker", "network", "create", mockNwName)
  119. if err != nil {
  120. t.Fatal(err.Error())
  121. }
  122. }
  123. func TestClientNetworkCreateWithDriver(t *testing.T) {
  124. var out, errOut bytes.Buffer
  125. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  126. err := cli.Cmd("docker", "network", "create", "-f=dummy", mockNwName)
  127. if err == nil {
  128. t.Fatal("Passing incorrect flags to the create command must fail")
  129. }
  130. err = cli.Cmd("docker", "network", "create", "-d=dummy", mockNwName)
  131. if err != nil {
  132. t.Fatalf(err.Error())
  133. }
  134. }
  135. func TestClientNetworkRm(t *testing.T) {
  136. var out, errOut bytes.Buffer
  137. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  138. err := cli.Cmd("docker", "network", "rm", mockNwName)
  139. if err != nil {
  140. t.Fatal(err.Error())
  141. }
  142. }
  143. func TestClientNetworkLs(t *testing.T) {
  144. var out, errOut bytes.Buffer
  145. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  146. err := cli.Cmd("docker", "network", "ls")
  147. if err != nil {
  148. t.Fatal(err.Error())
  149. }
  150. }
  151. func TestClientNetworkInfo(t *testing.T) {
  152. var out, errOut bytes.Buffer
  153. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  154. err := cli.Cmd("docker", "network", "info", mockNwName)
  155. if err != nil {
  156. t.Fatal(err.Error())
  157. }
  158. }
  159. func TestClientNetworkInfoById(t *testing.T) {
  160. var out, errOut bytes.Buffer
  161. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  162. err := cli.Cmd("docker", "network", "info", mockNwID)
  163. if err != nil {
  164. t.Fatal(err.Error())
  165. }
  166. }
  167. // Docker Flag processing in flag.go uses os.Exit() frequently, even for --help
  168. // TODO : Handle the --help test-case in the IT when CLI is available
  169. /*
  170. func TestClientNetworkServiceCreateHelp(t *testing.T) {
  171. var out, errOut bytes.Buffer
  172. cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
  173. return nil, 0, nil
  174. }
  175. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  176. err := cli.Cmd("docker", "network", "create", "--help")
  177. if err != nil {
  178. t.Fatalf(err.Error())
  179. }
  180. }
  181. */
  182. // Docker flag processing in flag.go uses os.Exit(1) for incorrect parameter case.
  183. // TODO : Handle the missing argument case in the IT when CLI is available
  184. /*
  185. func TestClientNetworkServiceCreateMissingArgument(t *testing.T) {
  186. var out, errOut bytes.Buffer
  187. cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) {
  188. return nil, 0, nil
  189. }
  190. cli := NewNetworkCli(&out, &errOut, callbackFunc)
  191. err := cli.Cmd("docker", "network", "create")
  192. if err != nil {
  193. t.Fatal(err.Error())
  194. }
  195. }
  196. */