etcd_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package etcd
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/http/httptest"
  6. "testing"
  7. "time"
  8. "github.com/coreos/etcd/config"
  9. )
  10. func TestMultipleNodes(t *testing.T) {
  11. tests := []int{1, 3, 5, 9, 11}
  12. for _, tt := range tests {
  13. es, hs := buildCluster(tt, false)
  14. waitCluster(t, es)
  15. for i := range es {
  16. es[len(es)-i-1].Stop()
  17. }
  18. for i := range hs {
  19. hs[len(hs)-i-1].Close()
  20. }
  21. }
  22. afterTest(t)
  23. }
  24. func TestMultipleTLSNodes(t *testing.T) {
  25. tests := []int{1, 3, 5}
  26. for _, tt := range tests {
  27. es, hs := buildCluster(tt, true)
  28. waitCluster(t, es)
  29. for i := range es {
  30. es[len(es)-i-1].Stop()
  31. }
  32. for i := range hs {
  33. hs[len(hs)-i-1].Close()
  34. }
  35. }
  36. afterTest(t)
  37. }
  38. func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) {
  39. bootstrapper := 0
  40. es := make([]*Server, number)
  41. hs := make([]*httptest.Server, number)
  42. var seed string
  43. for i := range es {
  44. c := config.New()
  45. c.Peers = []string{seed}
  46. es[i] = New(c, int64(i))
  47. es[i].SetTick(time.Millisecond * 5)
  48. m := http.NewServeMux()
  49. m.Handle("/", es[i])
  50. m.Handle("/raft", es[i].t)
  51. m.Handle("/raft/", es[i].t)
  52. if tls {
  53. hs[i] = httptest.NewTLSServer(m)
  54. } else {
  55. hs[i] = httptest.NewServer(m)
  56. }
  57. es[i].raftPubAddr = hs[i].URL
  58. es[i].pubAddr = hs[i].URL
  59. if i == bootstrapper {
  60. seed = hs[i].URL
  61. go es[i].Bootstrap()
  62. } else {
  63. // wait for the previous configuration change to be committed
  64. // or this configuration request might be dropped
  65. w, err := es[0].Watch(v2machineKVPrefix, true, false, uint64(i))
  66. if err != nil {
  67. panic(err)
  68. }
  69. <-w.EventChan
  70. go es[i].Join()
  71. }
  72. }
  73. return es, hs
  74. }
  75. func waitCluster(t *testing.T, es []*Server) {
  76. n := len(es)
  77. for i, e := range es {
  78. for k := 1; k < n+1; k++ {
  79. w, err := e.Watch(v2machineKVPrefix, true, false, uint64(k))
  80. if err != nil {
  81. panic(err)
  82. }
  83. v := <-w.EventChan
  84. ww := fmt.Sprintf("%s/%d", v2machineKVPrefix, k-1)
  85. if v.Node.Key != ww {
  86. t.Errorf("#%d path = %v, want %v", i, v.Node.Key, w)
  87. }
  88. }
  89. }
  90. }