ring_test.go 3.7 KB

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