ring_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package chord_test
  2. import (
  3. "bytes"
  4. "crypto/sha1"
  5. "fmt"
  6. "sort"
  7. "testing"
  8. "time"
  9. "trial/go-chord"
  10. )
  11. type MockDelegate struct {
  12. shutdown bool
  13. }
  14. func (m *MockDelegate) NewPredecessor(local, remoteNew, remotePrev *chord.Vnode) {
  15. }
  16. func (m *MockDelegate) Leaving(local, pred, succ *chord.Vnode) {
  17. }
  18. func (m *MockDelegate) PredecessorLeaving(local, remote *chord.Vnode) {
  19. }
  20. func (m *MockDelegate) SuccessorLeaving(local, remote *chord.Vnode) {
  21. }
  22. func (m *MockDelegate) Shutdown() {
  23. m.shutdown = true
  24. }
  25. func makeRing() *chord.Ring {
  26. conf := &chord.Config{
  27. NumVnodes: 5,
  28. NumSuccessors: 8,
  29. HashFunc: sha1.New,
  30. HashBits: 160,
  31. StabilizeMin: time.Second,
  32. StabilizeMax: 5 * time.Second,
  33. }
  34. ring := &chord.Ring{}
  35. ring.Init(conf, nil)
  36. return ring
  37. }
  38. func TestRingInit(t *testing.T) {
  39. // Create a ring
  40. ring := &chord.Ring{}
  41. conf := chord.DefaultConfig("test")
  42. ring.Init(conf, nil)
  43. // Test features
  44. if ring.Config != conf {
  45. t.Fatalf("wrong config")
  46. }
  47. if ring.Transport == nil {
  48. t.Fatalf("missing transport")
  49. }
  50. // Check the Vnodes
  51. for i := 0; i < conf.NumVnodes; i++ {
  52. fmt.Println(ring.Vnodes[i], ring.Vnodes[i].Host)
  53. if ring.Vnodes[i] == nil {
  54. t.Fatalf("missing vnode!")
  55. }
  56. if ring.Vnodes[i].Ring != ring {
  57. t.Fatalf("ring missing!")
  58. }
  59. if ring.Vnodes[i].Id == nil {
  60. t.Fatalf("ID not initialized!")
  61. }
  62. }
  63. }
  64. func TestRingLen(t *testing.T) {
  65. ring := makeRing()
  66. if ring.Len() != 5 {
  67. t.Fatalf("wrong len")
  68. }
  69. }
  70. func TestRingSort(t *testing.T) {
  71. ring := makeRing()
  72. sort.Sort(ring)
  73. if bytes.Compare(ring.Vnodes[0].Id, ring.Vnodes[1].Id) != -1 {
  74. t.Fatalf("bad sort")
  75. }
  76. if bytes.Compare(ring.Vnodes[1].Id, ring.Vnodes[2].Id) != -1 {
  77. t.Fatalf("bad sort")
  78. }
  79. if bytes.Compare(ring.Vnodes[2].Id, ring.Vnodes[3].Id) != -1 {
  80. t.Fatalf("bad sort")
  81. }
  82. if bytes.Compare(ring.Vnodes[3].Id, ring.Vnodes[4].Id) != -1 {
  83. t.Fatalf("bad sort")
  84. }
  85. for i := 0; i < len(ring.Vnodes); i++ {
  86. fmt.Println(ring.Vnodes[i])
  87. }
  88. }
  89. func TestRingNearest(t *testing.T) {
  90. ring := makeRing()
  91. ring.Vnodes[0].Id = []byte{2}
  92. ring.Vnodes[1].Id = []byte{4}
  93. ring.Vnodes[2].Id = []byte{7}
  94. ring.Vnodes[3].Id = []byte{10}
  95. ring.Vnodes[4].Id = []byte{14}
  96. key := []byte{6}
  97. near := ring.NearestVnode(key)
  98. if near != ring.Vnodes[1] {
  99. t.Fatalf("got wrong node back!")
  100. }
  101. key = []byte{0}
  102. near = ring.NearestVnode(key)
  103. if near != ring.Vnodes[4] {
  104. t.Fatalf("got wrong node back!")
  105. }
  106. }
  107. func TestRingSchedule(t *testing.T) {
  108. ring := makeRing()
  109. ring.SetLocalSuccessors()
  110. ring.Schedule()
  111. for i := 0; i < len(ring.Vnodes); i++ {
  112. if ring.Vnodes[i].Timer == nil {
  113. t.Fatalf("expected timer!")
  114. }
  115. }
  116. ring.StopVnodes()
  117. }
  118. func TestRingSetLocalSucc(t *testing.T) {
  119. ring := makeRing()
  120. ring.SetLocalSuccessors()
  121. for i := 0; i < len(ring.Vnodes); i++ {
  122. for j := 0; j < 4; j++ {
  123. if ring.Vnodes[i].Successors[j] == nil {
  124. t.Fatalf("expected successor!")
  125. }
  126. }
  127. if ring.Vnodes[i].Successors[4] != nil {
  128. t.Fatalf("should not have 5th successor!")
  129. }
  130. }
  131. // Verify the successor manually for node 3
  132. vn := ring.Vnodes[2]
  133. if vn.Successors[0] != &ring.Vnodes[3].Vnode {
  134. t.Fatalf("bad succ!")
  135. }
  136. if vn.Successors[1] != &ring.Vnodes[4].Vnode {
  137. t.Fatalf("bad succ!")
  138. }
  139. if vn.Successors[2] != &ring.Vnodes[0].Vnode {
  140. t.Fatalf("bad succ!")
  141. }
  142. if vn.Successors[3] != &ring.Vnodes[1].Vnode {
  143. t.Fatalf("bad succ!")
  144. }
  145. }
  146. func TestRingDelegate(t *testing.T) {
  147. d := &MockDelegate{}
  148. ring := makeRing()
  149. ring.SetLocalSuccessors()
  150. ring.Config.Delegate = d
  151. ring.Schedule()
  152. var b bool
  153. f := func() {
  154. println("run!")
  155. b = true
  156. }
  157. ch := ring.InvokeDelegate(f)
  158. if ch == nil {
  159. t.Fatalf("expected chan")
  160. }
  161. select {
  162. case <-ch:
  163. case <-time.After(time.Second):
  164. t.Fatalf("timeout")
  165. }
  166. if !b {
  167. t.Fatalf("b should be true")
  168. }
  169. ring.StopDelegate()
  170. if !d.shutdown {
  171. t.Fatalf("delegate did not get shutdown")
  172. }
  173. }