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