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.

198 lines
4.4 KiB

  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "go-dht/kademlia"
  7. "go-dht/node"
  8. "log"
  9. "net/rpc"
  10. "strconv"
  11. )
  12. // Utility to test the Node RPC methods
  13. func main() {
  14. // public rpc
  15. pingFlag := flag.Bool("ping", false, "test Ping")
  16. findnodeFlag := flag.Bool("findnode", false, "test FindNode")
  17. findvalueFlag := flag.Bool("findvalue", false, "test FindValue")
  18. storeFlag := flag.Bool("store", false, "test Store")
  19. // admin rpc
  20. findFlag := flag.Bool("find", false, "test Find")
  21. flag.Parse()
  22. if *pingFlag {
  23. testPing()
  24. }
  25. if *findnodeFlag {
  26. testFindNode()
  27. }
  28. if *findvalueFlag {
  29. testFindValue()
  30. }
  31. if *storeFlag {
  32. testStore()
  33. }
  34. if *findFlag {
  35. testFind()
  36. }
  37. }
  38. func testPing() {
  39. lns := prepareTestListedNodes()
  40. client, err := rpc.DialHTTP("tcp", "127.0.0.1:5000")
  41. if err != nil {
  42. log.Fatal("Connection error: ", err)
  43. }
  44. var reply kademlia.ListedNode
  45. for _, ln := range lns {
  46. err = client.Call("Node.Ping", ln, &reply)
  47. if err != nil {
  48. panic(err)
  49. }
  50. fmt.Println(reply)
  51. }
  52. }
  53. func testFindNode() {
  54. // existing node
  55. id, err := kademlia.IDFromString("1ff734fb9897600ca54a9c55ace2d22a51afb610")
  56. if err != nil {
  57. panic(err)
  58. }
  59. client, err := rpc.DialHTTP("tcp", "127.0.0.1:5000")
  60. if err != nil {
  61. log.Fatal("Connection error: ", err)
  62. }
  63. var reply []kademlia.ListedNode
  64. err = client.Call("Node.FindNode", id, &reply)
  65. if err != nil {
  66. panic(err)
  67. }
  68. fmt.Println(reply)
  69. // find non existing node, to get a closer one
  70. id, err = kademlia.IDFromString("1ff734fb9897600ca54a9c55ace2d22a51aaaaaa")
  71. if err != nil {
  72. panic(err)
  73. }
  74. var reply2 []kademlia.ListedNode
  75. err = client.Call("Node.FindNode", id, &reply2)
  76. if err != nil {
  77. panic(err)
  78. }
  79. fmt.Println(reply2)
  80. }
  81. func testFindValue() {
  82. client, err := rpc.DialHTTP("tcp", "127.0.0.1:5002")
  83. if err != nil {
  84. log.Fatal("Connection error: ", err)
  85. }
  86. // first store the value
  87. data := []byte("test data0")
  88. h := kademlia.HashData(data)
  89. fmt.Println(h)
  90. var reply bool
  91. err = client.Call("Node.Store", data, &reply)
  92. if err != nil {
  93. panic(err)
  94. }
  95. fmt.Println(reply)
  96. // now call FIND_VALUE
  97. id, err := kademlia.IDFromString("1ff734fb9897600ca54a9c55ace2d22a51afb610")
  98. if err != nil {
  99. panic(err)
  100. }
  101. var reply2 node.FindValueResp
  102. err = client.Call("Node.FindValue", id, &reply2)
  103. if err != nil {
  104. panic(err)
  105. }
  106. if len(reply2.Value) == 0 {
  107. panic(errors.New("expected value response on FIND_VALUE"))
  108. }
  109. fmt.Println("FIND_VALUE response:", string(reply2.Value))
  110. }
  111. func testStore() {
  112. client, err := rpc.DialHTTP("tcp", "127.0.0.1:5000")
  113. if err != nil {
  114. log.Fatal("Connection error: ", err)
  115. }
  116. var reply bool
  117. for i := 0; i < 10; i++ {
  118. err = client.Call("Node.Store", []byte("test data"+strconv.Itoa(i)), &reply)
  119. if err != nil {
  120. panic(err)
  121. }
  122. fmt.Println(reply)
  123. }
  124. }
  125. func prepareTestListedNodes() []kademlia.ListedNode {
  126. lnIDs := []string{
  127. "c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b",
  128. "420bfebd44fc62615253224328f40f29c9b225fa",
  129. "6272bb67b1661abfa07d1d32cd9b810e531d42cd",
  130. "07db608db033384895e48098a1bbe25266387463",
  131. "c19c3285ab9ada4b420050ae1a204640b2bed508",
  132. "f8971d5da24517c8cc5a316fb0658de8906c4155",
  133. "04122a5f2dec42284147b1847ec1bc41ecd78626",
  134. "407a90870d7b482a271446c85fda940ce78a4c7a",
  135. "5ebe4539e7a33721a8623f7ebfab62600aa503e7",
  136. "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
  137. "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
  138. "10c86f96ebaa1685a46a6417e6faa2ef34a68976",
  139. "243c81515196a5b0e2d4675e73f0da3eead12793",
  140. "0fd85ddddf15aeec2d5d8b01b013dbca030a18d7",
  141. "0fd85ddddf15aeec2d5d8b01b013dbca030a18d5",
  142. "0fd85ddddf15aeec2d5d8b01b013dbca030a18d0",
  143. "0fd85ddddf15aeec2d5d8b01b013dbca030a1800",
  144. "0750931c40a52a2facd220a02851f7d34f95e1fa",
  145. "ebfba615ac50bcd0f5c2420741d032e885abf576",
  146. }
  147. var lns []kademlia.ListedNode
  148. for i := 0; i < len(lnIDs); i++ {
  149. idI, err := kademlia.IDFromString(lnIDs[i])
  150. if err != nil {
  151. panic(err)
  152. }
  153. lnI := kademlia.ListedNode{
  154. ID: idI,
  155. Addr: "",
  156. }
  157. lns = append(lns, lnI)
  158. }
  159. return lns
  160. }
  161. // through admin rpc
  162. func testFind() {
  163. client, err := rpc.DialHTTP("tcp", "127.0.0.1:6000")
  164. if err != nil {
  165. log.Fatal("Connection error: ", err)
  166. }
  167. idStr := "c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b"
  168. // idStr := "1ff734fb9897600ca54a9c55ace2d22a51afb610"
  169. id, err := kademlia.IDFromString(idStr)
  170. if err != nil {
  171. panic(err)
  172. }
  173. var lns []kademlia.ListedNode
  174. err = client.Call("Admin.Find", id, &lns)
  175. if err != nil {
  176. panic(err)
  177. }
  178. fmt.Println(lns)
  179. }