etcd_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package etcd
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/http/httptest"
  6. "net/url"
  7. "testing"
  8. "time"
  9. "github.com/coreos/etcd/config"
  10. )
  11. func TestMultipleNodes(t *testing.T) {
  12. tests := []int{1, 3, 5, 9, 11}
  13. for _, tt := range tests {
  14. es, hs := buildCluster(tt, false)
  15. waitCluster(t, es)
  16. for i := range es {
  17. es[len(es)-i-1].Stop()
  18. }
  19. for i := range hs {
  20. hs[len(hs)-i-1].Close()
  21. }
  22. }
  23. afterTest(t)
  24. }
  25. func TestMultipleTLSNodes(t *testing.T) {
  26. tests := []int{1, 3, 5}
  27. for _, tt := range tests {
  28. es, hs := buildCluster(tt, true)
  29. waitCluster(t, es)
  30. for i := range es {
  31. es[len(es)-i-1].Stop()
  32. }
  33. for i := range hs {
  34. hs[len(hs)-i-1].Close()
  35. }
  36. }
  37. afterTest(t)
  38. }
  39. func TestV2Redirect(t *testing.T) {
  40. es, hs := buildCluster(3, false)
  41. waitCluster(t, es)
  42. u := hs[1].URL
  43. ru := fmt.Sprintf("%s%s", hs[0].URL, "/v2/keys/foo")
  44. tc := NewTestClient()
  45. v := url.Values{}
  46. v.Set("value", "XXX")
  47. resp, _ := tc.PutForm(fmt.Sprintf("%s%s", u, "/v2/keys/foo"), v)
  48. if resp.StatusCode != http.StatusTemporaryRedirect {
  49. t.Errorf("status = %d, want %d", resp.StatusCode, http.StatusTemporaryRedirect)
  50. }
  51. location, err := resp.Location()
  52. if err != nil {
  53. t.Errorf("want err = %, want nil", err)
  54. }
  55. if location.String() != ru {
  56. t.Errorf("location = %v, want %v", location.String(), ru)
  57. }
  58. resp.Body.Close()
  59. for i := range es {
  60. es[len(es)-i-1].Stop()
  61. }
  62. for i := range hs {
  63. hs[len(hs)-i-1].Close()
  64. }
  65. afterTest(t)
  66. }
  67. func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) {
  68. bootstrapper := 0
  69. es := make([]*Server, number)
  70. hs := make([]*httptest.Server, number)
  71. var seed string
  72. for i := range es {
  73. c := config.New()
  74. c.Peers = []string{seed}
  75. es[i] = New(c, int64(i))
  76. es[i].SetTick(time.Millisecond * 5)
  77. m := http.NewServeMux()
  78. m.Handle("/", es[i])
  79. m.Handle("/raft", es[i].t)
  80. m.Handle("/raft/", es[i].t)
  81. if tls {
  82. hs[i] = httptest.NewTLSServer(m)
  83. } else {
  84. hs[i] = httptest.NewServer(m)
  85. }
  86. es[i].raftPubAddr = hs[i].URL
  87. es[i].pubAddr = hs[i].URL
  88. if i == bootstrapper {
  89. seed = hs[i].URL
  90. go es[i].Bootstrap()
  91. } else {
  92. // wait for the previous configuration change to be committed
  93. // or this configuration request might be dropped
  94. w, err := es[0].Watch(v2machineKVPrefix, true, false, uint64(i))
  95. if err != nil {
  96. panic(err)
  97. }
  98. <-w.EventChan
  99. go es[i].Join()
  100. }
  101. }
  102. return es, hs
  103. }
  104. func waitCluster(t *testing.T, es []*Server) {
  105. n := len(es)
  106. for i, e := range es {
  107. for k := 1; k < n+1; k++ {
  108. w, err := e.Watch(v2machineKVPrefix, true, false, uint64(k))
  109. if err != nil {
  110. panic(err)
  111. }
  112. v := <-w.EventChan
  113. ww := fmt.Sprintf("%s/%d", v2machineKVPrefix, k-1)
  114. if v.Node.Key != ww {
  115. t.Errorf("#%d path = %v, want %v", i, v.Node.Key, w)
  116. }
  117. }
  118. }
  119. }