etcd_test.go 1.5 KB

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