transport_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package chord_test
  2. import (
  3. "bytes"
  4. "testing"
  5. "trial/chord"
  6. )
  7. type MockVnodeRPC struct {
  8. err error
  9. pred *chord.Vnode
  10. not_pred *chord.Vnode
  11. succ_list []*chord.Vnode
  12. key []byte
  13. succ []*chord.Vnode
  14. skip *chord.Vnode
  15. }
  16. func (mv *MockVnodeRPC) GetPredecessor() (*chord.Vnode, error) {
  17. return mv.pred, mv.err
  18. }
  19. func (mv *MockVnodeRPC) Notify(vn *chord.Vnode) ([]*chord.Vnode, error) {
  20. mv.not_pred = vn
  21. return mv.succ_list, mv.err
  22. }
  23. func (mv *MockVnodeRPC) FindSuccessors(n int, key []byte) ([]*chord.Vnode, error) {
  24. mv.key = key
  25. return mv.succ, mv.err
  26. }
  27. func (mv *MockVnodeRPC) ClearPredecessor(p *chord.Vnode) error {
  28. mv.pred = nil
  29. return nil
  30. }
  31. func (mv *MockVnodeRPC) SkipSuccessor(s *chord.Vnode) error {
  32. mv.skip = s
  33. return nil
  34. }
  35. func makeLocal() *chord.LocalTransport {
  36. return chord.InitLocalTransport(nil).(*chord.LocalTransport)
  37. }
  38. func TestInitLocalTransport(t *testing.T) {
  39. local := chord.InitLocalTransport(nil).(*chord.LocalTransport)
  40. if local.Remote == nil {
  41. t.Fatalf("bad remote")
  42. }
  43. if local.Local == nil {
  44. t.Fatalf("missing map")
  45. }
  46. }
  47. func TestLocalList(t *testing.T) {
  48. l := makeLocal()
  49. vn := &chord.Vnode{Id: []byte{1}, Host: "test"}
  50. mockVN := &MockVnodeRPC{}
  51. l.Register(vn, mockVN)
  52. list, err := l.ListVnodes("test")
  53. if err != nil {
  54. t.Fatalf("unexpected err. %s", err)
  55. }
  56. if len(list) != 1 || list[0] != vn {
  57. t.Fatal("local list failed", list)
  58. }
  59. }
  60. func TestLocalListRemote(t *testing.T) {
  61. l := makeLocal()
  62. vn := &chord.Vnode{Id: []byte{1}, Host: "test"}
  63. mockVN := &MockVnodeRPC{}
  64. l.Register(vn, mockVN)
  65. _, err := l.ListVnodes("remote")
  66. if err == nil {
  67. t.Fatalf("expected err!")
  68. }
  69. }
  70. func TestLocalPing(t *testing.T) {
  71. l := makeLocal()
  72. vn := &chord.Vnode{Id: []byte{1}}
  73. mockVN := &MockVnodeRPC{}
  74. l.Register(vn, mockVN)
  75. if res, err := l.Ping(vn); !res || err != nil {
  76. t.Fatalf("local ping failed")
  77. }
  78. }
  79. func TestLocalMissingPing(t *testing.T) {
  80. l := makeLocal()
  81. vn := &chord.Vnode{Id: []byte{2}}
  82. mockVN := &MockVnodeRPC{}
  83. l.Register(vn, mockVN)
  84. // Print some random node
  85. vn2 := &chord.Vnode{Id: []byte{3}}
  86. if res, _ := l.Ping(vn2); res {
  87. t.Fatalf("ping succeeded")
  88. }
  89. }
  90. func TestLocalGetPredecessor(t *testing.T) {
  91. l := makeLocal()
  92. pred := &chord.Vnode{Id: []byte{10}}
  93. vn := &chord.Vnode{Id: []byte{42}}
  94. mockVN := &MockVnodeRPC{pred: pred, err: nil}
  95. l.Register(vn, mockVN)
  96. vn2 := &chord.Vnode{Id: []byte{42}}
  97. res, err := l.GetPredecessor(vn2)
  98. if err != nil {
  99. t.Fatalf("local GetPredecessor failed")
  100. }
  101. if res != pred {
  102. t.Fatalf("got wrong predecessor")
  103. }
  104. unknown := &chord.Vnode{Id: []byte{1}}
  105. res, err = l.GetPredecessor(unknown)
  106. if err == nil {
  107. t.Fatalf("expected error!")
  108. }
  109. }
  110. func TestLocalNotify(t *testing.T) {
  111. l := makeLocal()
  112. suc1 := &chord.Vnode{Id: []byte{10}}
  113. suc2 := &chord.Vnode{Id: []byte{20}}
  114. suc3 := &chord.Vnode{Id: []byte{30}}
  115. succ_list := []*chord.Vnode{suc1, suc2, suc3}
  116. mockVN := &MockVnodeRPC{succ_list: succ_list, err: nil}
  117. vn := &chord.Vnode{Id: []byte{0}}
  118. l.Register(vn, mockVN)
  119. self := &chord.Vnode{Id: []byte{60}}
  120. res, err := l.Notify(vn, self)
  121. if err != nil {
  122. t.Fatalf("local notify failed")
  123. }
  124. if res == nil || res[0] != suc1 || res[1] != suc2 || res[2] != suc3 {
  125. t.Fatalf("got wrong successor list")
  126. }
  127. if mockVN.not_pred != self {
  128. t.Fatalf("didn't get notified correctly!")
  129. }
  130. unknown := &chord.Vnode{Id: []byte{1}}
  131. res, err = l.Notify(unknown, self)
  132. if err == nil {
  133. t.Fatalf("remote notify should fail")
  134. }
  135. }
  136. func TestLocalFindSucc(t *testing.T) {
  137. l := makeLocal()
  138. suc := []*chord.Vnode{{Id: []byte{40}}}
  139. mockVN := &MockVnodeRPC{succ: suc, err: nil}
  140. vn := &chord.Vnode{Id: []byte{12}}
  141. l.Register(vn, mockVN)
  142. key := []byte("test")
  143. res, err := l.FindSuccessors(vn, 1, key)
  144. if err != nil {
  145. t.Fatalf("local FindSuccessor failed")
  146. }
  147. if res[0] != suc[0] {
  148. t.Fatalf("got wrong successor")
  149. }
  150. if bytes.Compare(mockVN.key, key) != 0 {
  151. t.Fatalf("didn't get key correctly!")
  152. }
  153. unknown := &chord.Vnode{Id: []byte{1}}
  154. res, err = l.FindSuccessors(unknown, 1, key)
  155. if err == nil {
  156. t.Fatalf("remote find should fail")
  157. }
  158. }
  159. func TestLocalClearPred(t *testing.T) {
  160. l := makeLocal()
  161. pred := &chord.Vnode{Id: []byte{10}}
  162. mockVN := &MockVnodeRPC{pred: pred}
  163. vn := &chord.Vnode{Id: []byte{12}}
  164. l.Register(vn, mockVN)
  165. err := l.ClearPredecessor(vn, pred)
  166. if err != nil {
  167. t.Fatalf("local ClearPredecessor failed")
  168. }
  169. if mockVN.pred != nil {
  170. t.Fatalf("clear failed")
  171. }
  172. unknown := &chord.Vnode{Id: []byte{1}}
  173. err = l.ClearPredecessor(unknown, pred)
  174. if err == nil {
  175. t.Fatalf("remote clear should fail")
  176. }
  177. }
  178. func TestLocalSkipSucc(t *testing.T) {
  179. l := makeLocal()
  180. suc := []*chord.Vnode{{Id: []byte{40}}}
  181. mockVN := &MockVnodeRPC{succ: suc}
  182. vn := &chord.Vnode{Id: []byte{12}}
  183. l.Register(vn, mockVN)
  184. s := &chord.Vnode{Id: []byte{40}}
  185. err := l.SkipSuccessor(vn, s)
  186. if err != nil {
  187. t.Fatalf("local Skip failed")
  188. }
  189. if mockVN.skip != s {
  190. t.Fatalf("skip failed")
  191. }
  192. unknown := &chord.Vnode{Id: []byte{1}}
  193. err = l.SkipSuccessor(unknown, s)
  194. if err == nil {
  195. t.Fatalf("remote skip should fail")
  196. }
  197. }
  198. func TestLocalDeregister(t *testing.T) {
  199. l := makeLocal()
  200. vn := &chord.Vnode{Id: []byte{1}}
  201. mockVN := &MockVnodeRPC{}
  202. l.Register(vn, mockVN)
  203. if res, err := l.Ping(vn); !res || err != nil {
  204. t.Fatalf("local ping failed")
  205. }
  206. l.Deregister(vn)
  207. if res, _ := l.Ping(vn); res {
  208. t.Fatalf("local ping succeeded")
  209. }
  210. }
  211. func TestBHList(t *testing.T) {
  212. bh := chord.BlackholeTransport{}
  213. res, err := bh.ListVnodes("test")
  214. if res != nil || err == nil {
  215. t.Fatalf("expected fail")
  216. }
  217. }
  218. func TestBHPing(t *testing.T) {
  219. bh := chord.BlackholeTransport{}
  220. vn := &chord.Vnode{Id: []byte{12}}
  221. res, err := bh.Ping(vn)
  222. if res || err != nil {
  223. t.Fatalf("expected fail")
  224. }
  225. }
  226. func TestBHGetPred(t *testing.T) {
  227. bh := chord.BlackholeTransport{}
  228. vn := &chord.Vnode{Id: []byte{12}}
  229. _, err := bh.GetPredecessor(vn)
  230. if err.Error()[:18] != "Failed to connect!" {
  231. t.Fatalf("expected fail")
  232. }
  233. }
  234. func TestBHNotify(t *testing.T) {
  235. bh := chord.BlackholeTransport{}
  236. vn := &chord.Vnode{Id: []byte{12}}
  237. vn2 := &chord.Vnode{Id: []byte{42}}
  238. _, err := bh.Notify(vn, vn2)
  239. if err.Error()[:18] != "Failed to connect!" {
  240. t.Fatalf("expected fail")
  241. }
  242. }
  243. func TestBHFindSuccessors(t *testing.T) {
  244. bh := chord.BlackholeTransport{}
  245. vn := &chord.Vnode{Id: []byte{12}}
  246. _, err := bh.FindSuccessors(vn, 1, []byte("test"))
  247. if err.Error()[:18] != "Failed to connect!" {
  248. t.Fatalf("expected fail")
  249. }
  250. }
  251. func TestBHClearPred(t *testing.T) {
  252. bh := chord.BlackholeTransport{}
  253. vn := &chord.Vnode{Id: []byte{12}}
  254. s := &chord.Vnode{Id: []byte{50}}
  255. err := bh.ClearPredecessor(vn, s)
  256. if err.Error()[:18] != "Failed to connect!" {
  257. t.Fatalf("expected fail")
  258. }
  259. }
  260. func TestBHSkipSucc(t *testing.T) {
  261. bh := chord.BlackholeTransport{}
  262. vn := &chord.Vnode{Id: []byte{12}}
  263. s := &chord.Vnode{Id: []byte{50}}
  264. err := bh.SkipSuccessor(vn, s)
  265. if err.Error()[:18] != "Failed to connect!" {
  266. t.Fatalf("expected fail")
  267. }
  268. }