discovery_test.go 2.3 KB

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