util_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package chord_test
  2. import (
  3. "errors"
  4. "testing"
  5. "time"
  6. "trial/go-chord"
  7. )
  8. func TestRandStabilize(t *testing.T) {
  9. min := time.Duration(10 * time.Second)
  10. max := time.Duration(30 * time.Second)
  11. conf := &chord.Config{
  12. StabilizeMin: min,
  13. StabilizeMax: max}
  14. var times []time.Duration
  15. for i := 0; i < 1000; i++ {
  16. after := chord.RandStabilize(conf)
  17. times = append(times, after)
  18. if after < min {
  19. t.Fatalf("after below min")
  20. }
  21. if after > max {
  22. t.Fatalf("after above max")
  23. }
  24. }
  25. collisions := 0
  26. for idx, val := range times {
  27. for i := 0; i < len(times); i++ {
  28. if idx != i && times[i] == val {
  29. collisions += 1
  30. }
  31. }
  32. }
  33. if collisions > 3 {
  34. t.Fatalf("too many collisions! %d", collisions)
  35. }
  36. }
  37. func TestBetween(t *testing.T) {
  38. t1 := []byte{0, 0, 0, 0}
  39. t2 := []byte{1, 0, 0, 0}
  40. k := []byte{0, 0, 5, 0}
  41. if !chord.Between(t1, t2, k) {
  42. t.Fatalf("expected k chord.Between!")
  43. }
  44. if chord.Between(t1, t2, t1) {
  45. t.Fatalf("dont expect t1 chord.Between!")
  46. }
  47. if chord.Between(t1, t2, t2) {
  48. t.Fatalf("dont expect t1 chord.Between!")
  49. }
  50. k = []byte{2, 0, 0, 0}
  51. if chord.Between(t1, t2, k) {
  52. t.Fatalf("dont expect k chord.Between!")
  53. }
  54. }
  55. func TestBetweenWrap(t *testing.T) {
  56. t1 := []byte{0xff, 0, 0, 0}
  57. t2 := []byte{1, 0, 0, 0}
  58. k := []byte{0, 0, 5, 0}
  59. if !chord.Between(t1, t2, k) {
  60. t.Fatalf("expected k chord.Between!")
  61. }
  62. k = []byte{0xff, 0xff, 0, 0}
  63. if !chord.Between(t1, t2, k) {
  64. t.Fatalf("expect k chord.Between!")
  65. }
  66. }
  67. func TestBetweenRightIncl(t *testing.T) {
  68. t1 := []byte{0, 0, 0, 0}
  69. t2 := []byte{1, 0, 0, 0}
  70. k := []byte{1, 0, 0, 0}
  71. if !chord.BetweenRightIncl(t1, t2, k) {
  72. t.Fatalf("expected k chord.Between!")
  73. }
  74. }
  75. func TestBetweenRightInclWrap(t *testing.T) {
  76. t1 := []byte{0xff, 0, 0, 0}
  77. t2 := []byte{1, 0, 0, 0}
  78. k := []byte{1, 0, 0, 0}
  79. if !chord.BetweenRightIncl(t1, t2, k) {
  80. t.Fatalf("expected k chord.Between!")
  81. }
  82. }
  83. func TestPowerOffset(t *testing.T) {
  84. id := []byte{0, 0, 0, 0}
  85. exp := 30
  86. mod := 32
  87. val := chord.PowerOffset(id, exp, mod)
  88. if val[0] != 64 {
  89. t.Fatalf("unexpected val! %v", val)
  90. }
  91. // 0-7, 8-15, 16-23, 24-31
  92. id = []byte{0, 0xff, 0xff, 0xff}
  93. exp = 23
  94. val = chord.PowerOffset(id, exp, mod)
  95. if val[0] != 1 || val[1] != 0x7f || val[2] != 0xff || val[3] != 0xff {
  96. t.Fatalf("unexpected val! %v", val)
  97. }
  98. }
  99. func TestMax(t *testing.T) {
  100. if chord.Max(-10, 10) != 10 {
  101. t.Fatalf("bad chord.Max")
  102. }
  103. if chord.Max(10, -10) != 10 {
  104. t.Fatalf("bad chord.Max")
  105. }
  106. }
  107. func TestMin(t *testing.T) {
  108. if chord.Min(-10, 10) != -10 {
  109. t.Fatalf("bad chord.Min")
  110. }
  111. if chord.Min(10, -10) != -10 {
  112. t.Fatalf("bad chord.Min")
  113. }
  114. }
  115. func TestNearestVnodesKey(t *testing.T) {
  116. Vnodes := make([]*chord.Vnode, 5)
  117. Vnodes[0] = &chord.Vnode{Id: []byte{2}}
  118. Vnodes[1] = &chord.Vnode{Id: []byte{4}}
  119. Vnodes[2] = &chord.Vnode{Id: []byte{7}}
  120. Vnodes[3] = &chord.Vnode{Id: []byte{10}}
  121. Vnodes[4] = &chord.Vnode{Id: []byte{14}}
  122. key := []byte{6}
  123. near := chord.NearestVnodeToKey(Vnodes, key)
  124. if near != Vnodes[1] {
  125. t.Fatalf("got wrong node back!")
  126. }
  127. key = []byte{0}
  128. near = chord.NearestVnodeToKey(Vnodes, key)
  129. if near != Vnodes[4] {
  130. t.Fatalf("got wrong node back!")
  131. }
  132. }
  133. func TestMergeErrors(t *testing.T) {
  134. e1 := errors.New("test1")
  135. e2 := errors.New("test2")
  136. if chord.MergeErrors(e1, nil) != e1 {
  137. t.Fatalf("bad merge")
  138. }
  139. if chord.MergeErrors(nil, e1) != e1 {
  140. t.Fatalf("bad merge")
  141. }
  142. if chord.MergeErrors(nil, nil) != nil {
  143. t.Fatalf("bad merge")
  144. }
  145. if chord.MergeErrors(e1, e2).Error() != "test1\ntest2" {
  146. t.Fatalf("bad merge")
  147. }
  148. }