client_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package plugins
  2. import (
  3. "io"
  4. "net/http"
  5. "net/http/httptest"
  6. "reflect"
  7. "testing"
  8. "time"
  9. "github.com/docker/docker/pkg/tlsconfig"
  10. )
  11. var (
  12. mux *http.ServeMux
  13. server *httptest.Server
  14. )
  15. func setupRemotePluginServer() string {
  16. mux = http.NewServeMux()
  17. server = httptest.NewServer(mux)
  18. return server.URL
  19. }
  20. func teardownRemotePluginServer() {
  21. if server != nil {
  22. server.Close()
  23. }
  24. }
  25. func TestFailedConnection(t *testing.T) {
  26. c, _ := NewClient("tcp://127.0.0.1:1", tlsconfig.Options{InsecureSkipVerify: true})
  27. _, err := c.callWithRetry("Service.Method", nil, false)
  28. if err == nil {
  29. t.Fatal("Unexpected successful connection")
  30. }
  31. }
  32. func TestEchoInputOutput(t *testing.T) {
  33. addr := setupRemotePluginServer()
  34. defer teardownRemotePluginServer()
  35. m := Manifest{[]string{"VolumeDriver", "NetworkDriver"}}
  36. mux.HandleFunc("/Test.Echo", func(w http.ResponseWriter, r *http.Request) {
  37. if r.Method != "POST" {
  38. t.Fatalf("Expected POST, got %s\n", r.Method)
  39. }
  40. header := w.Header()
  41. header.Set("Content-Type", versionMimetype)
  42. io.Copy(w, r.Body)
  43. })
  44. c, _ := NewClient(addr, tlsconfig.Options{InsecureSkipVerify: true})
  45. var output Manifest
  46. err := c.Call("Test.Echo", m, &output)
  47. if err != nil {
  48. t.Fatal(err)
  49. }
  50. if !reflect.DeepEqual(output, m) {
  51. t.Fatalf("Expected %v, was %v\n", m, output)
  52. }
  53. err = c.Call("Test.Echo", nil, nil)
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. }
  58. func TestBackoff(t *testing.T) {
  59. cases := []struct {
  60. retries int
  61. expTimeOff time.Duration
  62. }{
  63. {0, time.Duration(1)},
  64. {1, time.Duration(2)},
  65. {2, time.Duration(4)},
  66. {4, time.Duration(16)},
  67. {6, time.Duration(30)},
  68. {10, time.Duration(30)},
  69. }
  70. for _, c := range cases {
  71. s := c.expTimeOff * time.Second
  72. if d := backoff(c.retries); d != s {
  73. t.Fatalf("Retry %v, expected %v, was %v\n", c.retries, s, d)
  74. }
  75. }
  76. }
  77. func TestAbortRetry(t *testing.T) {
  78. cases := []struct {
  79. timeOff time.Duration
  80. expAbort bool
  81. }{
  82. {time.Duration(1), false},
  83. {time.Duration(2), false},
  84. {time.Duration(10), false},
  85. {time.Duration(30), true},
  86. {time.Duration(40), true},
  87. }
  88. for _, c := range cases {
  89. s := c.timeOff * time.Second
  90. if a := abort(time.Now(), s); a != c.expAbort {
  91. t.Fatalf("Duration %v, expected %v, was %v\n", c.timeOff, s, a)
  92. }
  93. }
  94. }
  95. func TestClientScheme(t *testing.T) {
  96. cases := map[string]string{
  97. "tcp://127.0.0.1:8080": "http",
  98. "unix:///usr/local/plugins/foo": "http",
  99. "http://127.0.0.1:8080": "http",
  100. "https://127.0.0.1:8080": "https",
  101. }
  102. for addr, scheme := range cases {
  103. c, _ := NewClient(addr, tlsconfig.Options{InsecureSkipVerify: true})
  104. if c.scheme != scheme {
  105. t.Fatalf("URL scheme mismatch, expected %s, got %s", scheme, c.scheme)
  106. }
  107. }
  108. }