discovery_test.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package test
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "net/http/httptest"
  7. "net/url"
  8. "strings"
  9. "sync"
  10. "testing"
  11. "time"
  12. "github.com/coreos/etcd/third_party/github.com/stretchr/testify/assert"
  13. "github.com/coreos/etcd/server"
  14. etcdtest "github.com/coreos/etcd/tests"
  15. goetcd "github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
  16. )
  17. type garbageHandler struct {
  18. t *testing.T
  19. success bool
  20. sync.Mutex
  21. }
  22. func (g *garbageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  23. fmt.Fprintln(w, "Hello, client")
  24. if r.URL.String() != "/v2/keys/_etcd/registry/1/node1" {
  25. g.t.Fatalf("Unexpected web request")
  26. }
  27. g.Lock()
  28. defer g.Unlock()
  29. g.success = true
  30. }
  31. // TestDiscoverySecondPeerFirstNoResponse ensures that if the first etcd
  32. // machine stops after heartbeating that the second machine fails too.
  33. func TestDiscoverySecondPeerFirstNoResponse(t *testing.T) {
  34. etcdtest.RunServer(func(s *server.Server) {
  35. v := url.Values{}
  36. v.Set("value", "started")
  37. resp, err := etcdtest.PutForm(fmt.Sprintf("%s%s", s.URL(), "/v2/keys/_etcd/registry/2/_state"), v)
  38. assert.Equal(t, resp.StatusCode, http.StatusCreated)
  39. v = url.Values{}
  40. v.Set("value", "http://127.0.0.1:49151")
  41. resp, err = etcdtest.PutForm(fmt.Sprintf("%s%s", s.URL(), "/v2/keys/_etcd/registry/2/ETCDTEST"), v)
  42. assert.Equal(t, resp.StatusCode, http.StatusCreated)
  43. proc, err := startServer([]string{"-retry-interval", "0.2", "-discovery", s.URL() + "/v2/keys/_etcd/registry/2"})
  44. if err != nil {
  45. t.Fatal(err.Error())
  46. }
  47. defer stopServer(proc)
  48. // TODO(bp): etcd will take 30 seconds to shutdown, figure this
  49. // out instead
  50. time.Sleep(1 * time.Second)
  51. client := http.Client{}
  52. _, err = client.Get("/")
  53. if err != nil && strings.Contains(err.Error(), "connection reset by peer") {
  54. t.Fatal(err.Error())
  55. }
  56. })
  57. }
  58. func assertServerNotUp(client http.Client, scheme string) error {
  59. path := fmt.Sprintf("%s://127.0.0.1:4001/v2/keys/foo", scheme)
  60. fields := url.Values(map[string][]string{"value": {"bar"}})
  61. for i := 0; i < 10; i++ {
  62. time.Sleep(1 * time.Second)
  63. _, err := client.PostForm(path, fields)
  64. if err == nil {
  65. return errors.New("Expected error during POST, got nil")
  66. } else {
  67. errString := err.Error()
  68. if strings.Contains(errString, "connection refused") {
  69. return nil
  70. } else {
  71. return err
  72. }
  73. }
  74. }
  75. return nil
  76. }