client_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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, 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. }
  54. func TestBackoff(t *testing.T) {
  55. cases := []struct {
  56. retries int
  57. expTimeOff time.Duration
  58. }{
  59. {0, time.Duration(1)},
  60. {1, time.Duration(2)},
  61. {2, time.Duration(4)},
  62. {4, time.Duration(16)},
  63. {6, time.Duration(30)},
  64. {10, time.Duration(30)},
  65. }
  66. for _, c := range cases {
  67. s := c.expTimeOff * time.Second
  68. if d := backoff(c.retries); d != s {
  69. t.Fatalf("Retry %v, expected %v, was %v\n", c.retries, s, d)
  70. }
  71. }
  72. }
  73. func TestAbortRetry(t *testing.T) {
  74. cases := []struct {
  75. timeOff time.Duration
  76. expAbort bool
  77. }{
  78. {time.Duration(1), false},
  79. {time.Duration(2), false},
  80. {time.Duration(10), false},
  81. {time.Duration(30), true},
  82. {time.Duration(40), true},
  83. }
  84. for _, c := range cases {
  85. s := c.timeOff * time.Second
  86. if a := abort(time.Now(), s); a != c.expAbort {
  87. t.Fatalf("Duration %v, expected %v, was %v\n", c.timeOff, s, a)
  88. }
  89. }
  90. }