client_test.go 2.0 KB

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