arnaucube
arnaucube/go-dhtPublic Self-hosted repository
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}