You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
4.6 KiB

  1. package kademlia
  2. import (
  3. "fmt"
  4. "testing"
  5. log "github.com/sirupsen/logrus"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. var debug = false
  9. func init() {
  10. log.SetLevel(log.DebugLevel)
  11. }
  12. func TestCountZeros(t *testing.T) {
  13. zeroes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  14. assert.Equal(t, 0, kBucketByDistance(zeroes))
  15. b := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
  16. assert.Equal(t, 20, len(b))
  17. assert.Equal(t, 7, kBucketByDistance(b))
  18. b[19] = 0x00
  19. assert.Equal(t, 7, kBucketByDistance(b))
  20. b[0] = 0x0f
  21. assert.Equal(t, 7, kBucketByDistance(b))
  22. b[0] = 0x0c
  23. assert.Equal(t, 7, kBucketByDistance(b))
  24. b[0] = 0x00
  25. b[1] = 0x00
  26. b[2] = 0x0f
  27. assert.Equal(t, 7, kBucketByDistance(b))
  28. b[2] = 0x07
  29. assert.Equal(t, 7, kBucketByDistance(b))
  30. b[2] = 0x03
  31. assert.Equal(t, 7, kBucketByDistance(b))
  32. b = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  33. b[19] = 0x01
  34. assert.Equal(t, 2, kBucketByDistance(b))
  35. b[19] = 0x05
  36. assert.Equal(t, 2, kBucketByDistance(b))
  37. b[19] = 0x10
  38. assert.Equal(t, 1, kBucketByDistance(b))
  39. b[18] = 0x10
  40. assert.Equal(t, 3, kBucketByDistance(b))
  41. }
  42. func TestKBucket(t *testing.T) {
  43. idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
  44. assert.Nil(t, err)
  45. kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
  46. d := kademlia.KBucket(kademlia.N.ID)
  47. assert.Equal(t, 0, d) // same node should have distance 0
  48. idB, err := IDFromString("c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b")
  49. assert.Nil(t, err)
  50. d = kademlia.KBucket(idB)
  51. assert.Equal(t, 7, d)
  52. }
  53. func prepareTestListedNodes() []ListedNode {
  54. lnIDs := []string{
  55. "c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b",
  56. "420bfebd44fc62615253224328f40f29c9b225fa",
  57. "6272bb67b1661abfa07d1d32cd9b810e531d42cd",
  58. "07db608db033384895e48098a1bbe25266387463",
  59. "c19c3285ab9ada4b420050ae1a204640b2bed508",
  60. "f8971d5da24517c8cc5a316fb0658de8906c4155",
  61. "04122a5f2dec42284147b1847ec1bc41ecd78626",
  62. "407a90870d7b482a271446c85fda940ce78a4c7a",
  63. "5ebe4539e7a33721a8623f7ebfab62600aa503e7",
  64. "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
  65. "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
  66. "10c86f96ebaa1685a46a6417e6faa2ef34a68976",
  67. "243c81515196a5b0e2d4675e73f0da3eead12793",
  68. "0fd85ddddf15aeec2d5d8b01b013dbca030a18d7",
  69. "0fd85ddddf15aeec2d5d8b01b013dbca030a18d5",
  70. "0fd85ddddf15aeec2d5d8b01b013dbca030a18d0",
  71. "0fd85ddddf15aeec2d5d8b01b013dbca030a1800",
  72. "0750931c40a52a2facd220a02851f7d34f95e1fa",
  73. "ebfba615ac50bcd0f5c2420741d032e885abf576",
  74. }
  75. var lns []ListedNode
  76. for i := 0; i < len(lnIDs); i++ {
  77. idI, err := IDFromString(lnIDs[i])
  78. if err != nil {
  79. panic(err)
  80. }
  81. lnI := ListedNode{
  82. ID: idI,
  83. Addr: "",
  84. }
  85. lns = append(lns, lnI)
  86. }
  87. return lns
  88. }
  89. func TestMoveToBottom(t *testing.T) {
  90. lns := prepareTestListedNodes()
  91. movedElem := lns[3]
  92. assert.NotEqual(t, movedElem, lns[len(lns)-1])
  93. lns = moveToBottom(lns, 3)
  94. assert.Equal(t, movedElem, lns[len(lns)-1])
  95. }
  96. func TestUpdate(t *testing.T) {
  97. idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
  98. assert.Nil(t, err)
  99. kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
  100. lns := prepareTestListedNodes()
  101. for _, lnI := range lns {
  102. kademlia.Update(lnI)
  103. }
  104. if debug {
  105. fmt.Println(kademlia)
  106. }
  107. assert.Equal(t, 2, len(kademlia.KBuckets[0]))
  108. assert.Equal(t, 0, len(kademlia.KBuckets[1]))
  109. assert.Equal(t, 2, len(kademlia.KBuckets[2]))
  110. assert.Equal(t, 0, len(kademlia.KBuckets[3]))
  111. assert.Equal(t, 14, len(kademlia.KBuckets[7]))
  112. }
  113. func TestFindClosestKBucket(t *testing.T) {
  114. idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
  115. assert.Nil(t, err)
  116. kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
  117. lns := prepareTestListedNodes()
  118. for _, lnI := range lns {
  119. kademlia.Update(lnI)
  120. }
  121. if debug {
  122. fmt.Println(kademlia)
  123. }
  124. idB, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d5")
  125. assert.Nil(t, err)
  126. k, err := kademlia.GetClosestKBucket(idB)
  127. assert.Nil(t, err)
  128. assert.Equal(t, 2, k)
  129. idB, err = IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a1000")
  130. assert.Nil(t, err)
  131. // the theorical KBucket should be 3
  132. k = kademlia.KBucket(idB)
  133. assert.Equal(t, 3, k)
  134. // while the real KBucket (as the 3 is empty), should be 2
  135. k, err = kademlia.GetClosestKBucket(idB)
  136. assert.Nil(t, err)
  137. assert.Equal(t, 2, k)
  138. idB, err = IDFromString("0fd85ddddf15aeec2d5d8b01b013dbc000000000")
  139. assert.Nil(t, err)
  140. // the theorical KBucket should be 3
  141. k = kademlia.KBucket(idB)
  142. assert.Equal(t, 5, k)
  143. // while the real KBucket (as the 3 is empty), should be 2
  144. k, err = kademlia.GetClosestKBucket(idB)
  145. assert.Nil(t, err)
  146. assert.Equal(t, 7, k)
  147. }