mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 02:42:27 +00:00
p2p/discover: fix leveldb iterator crash in tests
This commit is contained in:
parent
28466e4cf2
commit
63d7b76041
2 changed files with 23 additions and 17 deletions
|
|
@ -50,8 +50,8 @@ func TestTable_pingReplace(t *testing.T) {
|
||||||
func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding bool) {
|
func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding bool) {
|
||||||
transport := newPingRecorder()
|
transport := newPingRecorder()
|
||||||
tab, db := newTestTable(transport)
|
tab, db := newTestTable(transport)
|
||||||
defer tab.Close()
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
defer tab.Close()
|
||||||
|
|
||||||
<-tab.initDone
|
<-tab.initDone
|
||||||
|
|
||||||
|
|
@ -137,8 +137,8 @@ func TestBucket_bumpNoDuplicates(t *testing.T) {
|
||||||
func TestTable_IPLimit(t *testing.T) {
|
func TestTable_IPLimit(t *testing.T) {
|
||||||
transport := newPingRecorder()
|
transport := newPingRecorder()
|
||||||
tab, db := newTestTable(transport)
|
tab, db := newTestTable(transport)
|
||||||
defer tab.Close()
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
defer tab.Close()
|
||||||
|
|
||||||
for i := 0; i < tableIPLimit+1; i++ {
|
for i := 0; i < tableIPLimit+1; i++ {
|
||||||
n := nodeAtDistance(tab.self().ID(), i, net.IP{172, 0, 1, byte(i)})
|
n := nodeAtDistance(tab.self().ID(), i, net.IP{172, 0, 1, byte(i)})
|
||||||
|
|
@ -153,8 +153,8 @@ func TestTable_IPLimit(t *testing.T) {
|
||||||
func TestTable_BucketIPLimit(t *testing.T) {
|
func TestTable_BucketIPLimit(t *testing.T) {
|
||||||
transport := newPingRecorder()
|
transport := newPingRecorder()
|
||||||
tab, db := newTestTable(transport)
|
tab, db := newTestTable(transport)
|
||||||
defer tab.Close()
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
defer tab.Close()
|
||||||
|
|
||||||
d := 3
|
d := 3
|
||||||
for i := 0; i < bucketIPLimit+1; i++ {
|
for i := 0; i < bucketIPLimit+1; i++ {
|
||||||
|
|
@ -173,8 +173,8 @@ func TestTable_closest(t *testing.T) {
|
||||||
// for any node table, Target and N
|
// for any node table, Target and N
|
||||||
transport := newPingRecorder()
|
transport := newPingRecorder()
|
||||||
tab, db := newTestTable(transport)
|
tab, db := newTestTable(transport)
|
||||||
defer tab.Close()
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
defer tab.Close()
|
||||||
fillTable(tab, test.All)
|
fillTable(tab, test.All)
|
||||||
|
|
||||||
// check that closest(Target, N) returns nodes
|
// check that closest(Target, N) returns nodes
|
||||||
|
|
@ -234,8 +234,8 @@ func TestTable_ReadRandomNodesGetAll(t *testing.T) {
|
||||||
test := func(buf []*enode.Node) bool {
|
test := func(buf []*enode.Node) bool {
|
||||||
transport := newPingRecorder()
|
transport := newPingRecorder()
|
||||||
tab, db := newTestTable(transport)
|
tab, db := newTestTable(transport)
|
||||||
defer tab.Close()
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
defer tab.Close()
|
||||||
<-tab.initDone
|
<-tab.initDone
|
||||||
|
|
||||||
for i := 0; i < len(buf); i++ {
|
for i := 0; i < len(buf); i++ {
|
||||||
|
|
@ -283,8 +283,8 @@ func (*closeTest) Generate(rand *rand.Rand, size int) reflect.Value {
|
||||||
|
|
||||||
func TestTable_Lookup(t *testing.T) {
|
func TestTable_Lookup(t *testing.T) {
|
||||||
tab, db := newTestTable(lookupTestnet)
|
tab, db := newTestTable(lookupTestnet)
|
||||||
defer tab.Close()
|
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
defer tab.Close()
|
||||||
|
|
||||||
// lookup on empty table returns no nodes
|
// lookup on empty table returns no nodes
|
||||||
if results := tab.lookup(lookupTestnet.target, false); len(results) > 0 {
|
if results := tab.lookup(lookupTestnet.target, false); len(results) > 0 {
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ type udpTest struct {
|
||||||
t *testing.T
|
t *testing.T
|
||||||
pipe *dgramPipe
|
pipe *dgramPipe
|
||||||
table *Table
|
table *Table
|
||||||
|
db *enode.DB
|
||||||
udp *udp
|
udp *udp
|
||||||
sent [][]byte
|
sent [][]byte
|
||||||
localkey, remotekey *ecdsa.PrivateKey
|
localkey, remotekey *ecdsa.PrivateKey
|
||||||
|
|
@ -72,14 +73,19 @@ func newUDPTest(t *testing.T) *udpTest {
|
||||||
remotekey: newkey(),
|
remotekey: newkey(),
|
||||||
remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303},
|
remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303},
|
||||||
}
|
}
|
||||||
db, _ := enode.OpenDB("")
|
test.db, _ = enode.OpenDB("")
|
||||||
ln := enode.NewLocalNode(db, test.localkey)
|
ln := enode.NewLocalNode(test.db, test.localkey)
|
||||||
test.table, test.udp, _ = newUDP(test.pipe, ln, Config{PrivateKey: test.localkey})
|
test.table, test.udp, _ = newUDP(test.pipe, ln, Config{PrivateKey: test.localkey})
|
||||||
// Wait for initial refresh so the table doesn't send unexpected findnode.
|
// Wait for initial refresh so the table doesn't send unexpected findnode.
|
||||||
<-test.table.initDone
|
<-test.table.initDone
|
||||||
return test
|
return test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (test *udpTest) close() {
|
||||||
|
test.table.Close()
|
||||||
|
test.db.Close()
|
||||||
|
}
|
||||||
|
|
||||||
// handles a packet as if it had been sent to the transport.
|
// handles a packet as if it had been sent to the transport.
|
||||||
func (test *udpTest) packetIn(wantError error, ptype byte, data packet) error {
|
func (test *udpTest) packetIn(wantError error, ptype byte, data packet) error {
|
||||||
return test.packetInFrom(wantError, test.remotekey, test.remoteaddr, ptype, data)
|
return test.packetInFrom(wantError, test.remotekey, test.remoteaddr, ptype, data)
|
||||||
|
|
@ -131,7 +137,7 @@ func (test *udpTest) errorf(format string, args ...interface{}) error {
|
||||||
|
|
||||||
func TestUDP_packetErrors(t *testing.T) {
|
func TestUDP_packetErrors(t *testing.T) {
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
test.packetIn(errExpired, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4})
|
test.packetIn(errExpired, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4})
|
||||||
test.packetIn(errUnsolicitedReply, pongPacket, &pong{ReplyTok: []byte{}, Expiration: futureExp})
|
test.packetIn(errUnsolicitedReply, pongPacket, &pong{ReplyTok: []byte{}, Expiration: futureExp})
|
||||||
|
|
@ -142,7 +148,7 @@ func TestUDP_packetErrors(t *testing.T) {
|
||||||
func TestUDP_pingTimeout(t *testing.T) {
|
func TestUDP_pingTimeout(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222}
|
toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222}
|
||||||
toid := enode.ID{1, 2, 3, 4}
|
toid := enode.ID{1, 2, 3, 4}
|
||||||
|
|
@ -154,7 +160,7 @@ func TestUDP_pingTimeout(t *testing.T) {
|
||||||
func TestUDP_responseTimeouts(t *testing.T) {
|
func TestUDP_responseTimeouts(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
randomDuration := func(max time.Duration) time.Duration {
|
randomDuration := func(max time.Duration) time.Duration {
|
||||||
|
|
@ -226,7 +232,7 @@ func TestUDP_responseTimeouts(t *testing.T) {
|
||||||
func TestUDP_findnodeTimeout(t *testing.T) {
|
func TestUDP_findnodeTimeout(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222}
|
toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222}
|
||||||
toid := enode.ID{1, 2, 3, 4}
|
toid := enode.ID{1, 2, 3, 4}
|
||||||
|
|
@ -242,7 +248,7 @@ func TestUDP_findnodeTimeout(t *testing.T) {
|
||||||
|
|
||||||
func TestUDP_findnode(t *testing.T) {
|
func TestUDP_findnode(t *testing.T) {
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
// put a few nodes into the table. their exact
|
// put a few nodes into the table. their exact
|
||||||
// distribution shouldn't matter much, although we need to
|
// distribution shouldn't matter much, although we need to
|
||||||
|
|
@ -297,7 +303,7 @@ func TestUDP_findnode(t *testing.T) {
|
||||||
|
|
||||||
func TestUDP_findnodeMultiReply(t *testing.T) {
|
func TestUDP_findnodeMultiReply(t *testing.T) {
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey)
|
rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey)
|
||||||
test.table.db.UpdateLastPingReceived(rid, test.remoteaddr.IP, time.Now())
|
test.table.db.UpdateLastPingReceived(rid, test.remoteaddr.IP, time.Now())
|
||||||
|
|
@ -352,7 +358,7 @@ func TestUDP_findnodeMultiReply(t *testing.T) {
|
||||||
|
|
||||||
func TestUDP_pingMatch(t *testing.T) {
|
func TestUDP_pingMatch(t *testing.T) {
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
randToken := make([]byte, 32)
|
randToken := make([]byte, 32)
|
||||||
crand.Read(randToken)
|
crand.Read(randToken)
|
||||||
|
|
@ -365,7 +371,7 @@ func TestUDP_pingMatch(t *testing.T) {
|
||||||
|
|
||||||
func TestUDP_pingMatchIP(t *testing.T) {
|
func TestUDP_pingMatchIP(t *testing.T) {
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp})
|
test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp})
|
||||||
test.waitPacketOut(func(*pong) error { return nil })
|
test.waitPacketOut(func(*pong) error { return nil })
|
||||||
|
|
@ -383,7 +389,7 @@ func TestUDP_successfulPing(t *testing.T) {
|
||||||
test := newUDPTest(t)
|
test := newUDPTest(t)
|
||||||
added := make(chan *node, 1)
|
added := make(chan *node, 1)
|
||||||
test.table.nodeAddedHook = func(n *node) { added <- n }
|
test.table.nodeAddedHook = func(n *node) { added <- n }
|
||||||
defer test.table.Close()
|
defer test.close()
|
||||||
|
|
||||||
// The remote side sends a ping packet to initiate the exchange.
|
// The remote side sends a ping packet to initiate the exchange.
|
||||||
go test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp})
|
go test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp})
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue