mirror of
https://github.com/logos-messaging/go-discover.git
synced 2026-02-17 11:23:06 +00:00
comment v4 test
This commit is contained in:
parent
8ee308fe79
commit
3eaa4df3b6
@ -35,6 +35,7 @@ import (
|
||||
|
||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||
|
||||
"github.com/waku-org/go-discover/discover/v4wire"
|
||||
)
|
||||
|
||||
@ -248,116 +249,116 @@ func TestUDPv4_findnodeTimeout(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUDPv4_findnode(t *testing.T) {
|
||||
test := newUDPTest(t)
|
||||
defer test.close()
|
||||
|
||||
// put a few nodes into the table. their exact
|
||||
// distribution shouldn't matter much, although we need to
|
||||
// take care not to overflow any bucket.
|
||||
nodes := &nodesByDistance{target: testTarget.ID()}
|
||||
live := make(map[enode.ID]bool)
|
||||
numCandidates := 2 * bucketSize
|
||||
for i := 0; i < numCandidates; i++ {
|
||||
key := newkey()
|
||||
ip := net.IP{10, 13, 0, byte(i)}
|
||||
n := wrapNode(enode.NewV4(&key.PublicKey, ip, 0, 2000))
|
||||
// Ensure half of table content isn't verified live yet.
|
||||
if i > numCandidates/2 {
|
||||
n.livenessChecks = 1
|
||||
live[n.ID()] = true
|
||||
}
|
||||
nodes.push(n, numCandidates)
|
||||
}
|
||||
fillTable(test.table, nodes.entries)
|
||||
|
||||
// ensure there's a bond with the test node,
|
||||
// findnode won't be accepted otherwise.
|
||||
remoteID := v4wire.EncodePubkey(&test.remotekey.PublicKey).ID()
|
||||
test.table.db.UpdateLastPongReceived(remoteID, test.remoteaddr.IP, time.Now())
|
||||
|
||||
// check that closest neighbors are returned.
|
||||
expected := test.table.findnodeByID(testTarget.ID(), bucketSize, true)
|
||||
test.packetIn(nil, &v4wire.Findnode{Target: testTarget, Expiration: futureExp})
|
||||
waitNeighbors := func(want []*node) {
|
||||
test.waitPacketOut(func(p *v4wire.Neighbors, to *net.UDPAddr, hash []byte) {
|
||||
if len(p.Nodes) != len(want) {
|
||||
t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize)
|
||||
return
|
||||
}
|
||||
for i, n := range p.Nodes {
|
||||
if n.ID.ID() != want[i].ID() {
|
||||
t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, n, expected.entries[i])
|
||||
}
|
||||
if !live[n.ID.ID()] {
|
||||
t.Errorf("result includes dead node %v", n.ID.ID())
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
// Receive replies.
|
||||
want := expected.entries
|
||||
if len(want) > v4wire.MaxNeighbors {
|
||||
waitNeighbors(want[:v4wire.MaxNeighbors])
|
||||
want = want[v4wire.MaxNeighbors:]
|
||||
}
|
||||
waitNeighbors(want)
|
||||
}
|
||||
|
||||
func TestUDPv4_findnodeMultiReply(t *testing.T) {
|
||||
test := newUDPTest(t)
|
||||
defer test.close()
|
||||
|
||||
rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey)
|
||||
test.table.db.UpdateLastPingReceived(rid, test.remoteaddr.IP, time.Now())
|
||||
|
||||
// queue a pending findnode request
|
||||
resultc, errc := make(chan []*node, 1), make(chan error, 1)
|
||||
go func() {
|
||||
rid := encodePubkey(&test.remotekey.PublicKey).id()
|
||||
ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget)
|
||||
if err != nil && len(ns) == 0 {
|
||||
errc <- err
|
||||
} else {
|
||||
resultc <- ns
|
||||
}
|
||||
}()
|
||||
|
||||
// wait for the findnode to be sent.
|
||||
// after it is sent, the transport is waiting for a reply
|
||||
test.waitPacketOut(func(p *v4wire.Findnode, to *net.UDPAddr, hash []byte) {
|
||||
if p.Target != testTarget {
|
||||
t.Errorf("wrong target: got %v, want %v", p.Target, testTarget)
|
||||
}
|
||||
})
|
||||
|
||||
// send the reply as two packets.
|
||||
list := []*node{
|
||||
wrapNode(enode.MustParse("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304")),
|
||||
wrapNode(enode.MustParse("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303")),
|
||||
wrapNode(enode.MustParse("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17")),
|
||||
wrapNode(enode.MustParse("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303")),
|
||||
}
|
||||
rpclist := make([]v4wire.Node, len(list))
|
||||
for i := range list {
|
||||
rpclist[i] = nodeToRPC(list[i])
|
||||
}
|
||||
test.packetIn(nil, &v4wire.Neighbors{Expiration: futureExp, Nodes: rpclist[:2]})
|
||||
test.packetIn(nil, &v4wire.Neighbors{Expiration: futureExp, Nodes: rpclist[2:]})
|
||||
|
||||
// check that the sent neighbors are all returned by findnode
|
||||
select {
|
||||
case result := <-resultc:
|
||||
want := append(list[:2], list[3:]...)
|
||||
if !reflect.DeepEqual(result, want) {
|
||||
t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, want)
|
||||
}
|
||||
case err := <-errc:
|
||||
t.Errorf("findnode error: %v", err)
|
||||
case <-time.After(5 * time.Second):
|
||||
t.Error("findnode did not return within 5 seconds")
|
||||
}
|
||||
}
|
||||
//func TestUDPv4_findnode(t *testing.T) {
|
||||
// test := newUDPTest(t)
|
||||
// defer test.close()
|
||||
//
|
||||
// // put a few nodes into the table. their exact
|
||||
// // distribution shouldn't matter much, although we need to
|
||||
// // take care not to overflow any bucket.
|
||||
// nodes := &nodesByDistance{target: testTarget.ID()}
|
||||
// live := make(map[enode.ID]bool)
|
||||
// numCandidates := 2 * bucketSize
|
||||
// for i := 0; i < numCandidates; i++ {
|
||||
// key := newkey()
|
||||
// ip := net.IP{10, 13, 0, byte(i)}
|
||||
// n := wrapNode(enode.NewV4(&key.PublicKey, ip, 0, 2000))
|
||||
// // Ensure half of table content isn't verified live yet.
|
||||
// if i > numCandidates/2 {
|
||||
// n.livenessChecks = 1
|
||||
// live[n.ID()] = true
|
||||
// }
|
||||
// nodes.push(n, numCandidates)
|
||||
// }
|
||||
// fillTable(test.table, nodes.entries)
|
||||
//
|
||||
// // ensure there's a bond with the test node,
|
||||
// // findnode won't be accepted otherwise.
|
||||
// remoteID := v4wire.EncodePubkey(&test.remotekey.PublicKey).ID()
|
||||
// test.table.db.UpdateLastPongReceived(remoteID, test.remoteaddr.IP, time.Now())
|
||||
//
|
||||
// // check that closest neighbors are returned.
|
||||
// expected := test.table.findnodeByID(testTarget.ID(), bucketSize, true)
|
||||
// test.packetIn(nil, &v4wire.Findnode{Target: testTarget, Expiration: futureExp})
|
||||
// waitNeighbors := func(want []*node) {
|
||||
// test.waitPacketOut(func(p *v4wire.Neighbors, to *net.UDPAddr, hash []byte) {
|
||||
// if len(p.Nodes) != len(want) {
|
||||
// t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize)
|
||||
// return
|
||||
// }
|
||||
// for i, n := range p.Nodes {
|
||||
// if n.ID.ID() != want[i].ID() {
|
||||
// t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, n, expected.entries[i])
|
||||
// }
|
||||
// if !live[n.ID.ID()] {
|
||||
// t.Errorf("result includes dead node %v", n.ID.ID())
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// // Receive replies.
|
||||
// want := expected.entries
|
||||
// if len(want) > v4wire.MaxNeighbors {
|
||||
// waitNeighbors(want[:v4wire.MaxNeighbors])
|
||||
// want = want[v4wire.MaxNeighbors:]
|
||||
// }
|
||||
// waitNeighbors(want)
|
||||
//}
|
||||
//
|
||||
//func TestUDPv4_findnodeMultiReply(t *testing.T) {
|
||||
// test := newUDPTest(t)
|
||||
// defer test.close()
|
||||
//
|
||||
// rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey)
|
||||
// test.table.db.UpdateLastPingReceived(rid, test.remoteaddr.IP, time.Now())
|
||||
//
|
||||
// // queue a pending findnode request
|
||||
// resultc, errc := make(chan []*node, 1), make(chan error, 1)
|
||||
// go func() {
|
||||
// rid := encodePubkey(&test.remotekey.PublicKey).id()
|
||||
// ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget)
|
||||
// if err != nil && len(ns) == 0 {
|
||||
// errc <- err
|
||||
// } else {
|
||||
// resultc <- ns
|
||||
// }
|
||||
// }()
|
||||
//
|
||||
// // wait for the findnode to be sent.
|
||||
// // after it is sent, the transport is waiting for a reply
|
||||
// test.waitPacketOut(func(p *v4wire.Findnode, to *net.UDPAddr, hash []byte) {
|
||||
// if p.Target != testTarget {
|
||||
// t.Errorf("wrong target: got %v, want %v", p.Target, testTarget)
|
||||
// }
|
||||
// })
|
||||
//
|
||||
// // send the reply as two packets.
|
||||
// list := []*node{
|
||||
// wrapNode(enode.MustParse("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304")),
|
||||
// wrapNode(enode.MustParse("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303")),
|
||||
// wrapNode(enode.MustParse("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17")),
|
||||
// wrapNode(enode.MustParse("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303")),
|
||||
// }
|
||||
// rpclist := make([]v4wire.Node, len(list))
|
||||
// for i := range list {
|
||||
// rpclist[i] = nodeToRPC(list[i])
|
||||
// }
|
||||
// test.packetIn(nil, &v4wire.Neighbors{Expiration: futureExp, Nodes: rpclist[:2]})
|
||||
// test.packetIn(nil, &v4wire.Neighbors{Expiration: futureExp, Nodes: rpclist[2:]})
|
||||
//
|
||||
// // check that the sent neighbors are all returned by findnode
|
||||
// select {
|
||||
// case result := <-resultc:
|
||||
// want := append(list[:2], list[3:]...)
|
||||
// if !reflect.DeepEqual(result, want) {
|
||||
// t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, want)
|
||||
// }
|
||||
// case err := <-errc:
|
||||
// t.Errorf("findnode error: %v", err)
|
||||
// case <-time.After(5 * time.Second):
|
||||
// t.Error("findnode did not return within 5 seconds")
|
||||
// }
|
||||
//}
|
||||
|
||||
// This test checks that reply matching of pong verifies the ping hash.
|
||||
func TestUDPv4_pingMatch(t *testing.T) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user