224 lines
6.7 KiB
Nim
224 lines
6.7 KiB
Nim
|
import
|
||
|
std/[unittest, tables, sequtils, sets],
|
||
|
../libp2p/crypto/crypto,
|
||
|
../libp2p/multiaddress,
|
||
|
../libp2p/peerid,
|
||
|
../libp2p/peerstore,
|
||
|
./helpers
|
||
|
|
||
|
suite "PeerStore":
|
||
|
# Testvars
|
||
|
let
|
||
|
# Peer 1
|
||
|
keyPair1 = KeyPair.random(ECDSA, rng[]).get()
|
||
|
peerId1 = PeerID.init(keyPair1.secKey).get()
|
||
|
multiaddrStr1 = "/ip4/127.0.0.1/udp/1234/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
|
||
|
multiaddr1 = MultiAddress.init(multiaddrStr1).get()
|
||
|
testcodec1 = "/nim/libp2p/test/0.0.1-beta1"
|
||
|
# Peer 2
|
||
|
keyPair2 = KeyPair.random(ECDSA, rng[]).get()
|
||
|
peerId2 = PeerID.init(keyPair2.secKey).get()
|
||
|
multiaddrStr2 = "/ip4/0.0.0.0/tcp/1234/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
|
||
|
multiaddr2 = MultiAddress.init(multiaddrStr2).get()
|
||
|
testcodec2 = "/nim/libp2p/test/0.0.2-beta1"
|
||
|
|
||
|
test "PeerStore API":
|
||
|
# Set up peer store
|
||
|
var
|
||
|
peerStore = PeerStore.new()
|
||
|
|
||
|
peerStore.addressBook.add(peerId1, multiaddr1)
|
||
|
peerStore.addressBook.add(peerId2, multiaddr2)
|
||
|
peerStore.protoBook.add(peerId1, testcodec1)
|
||
|
peerStore.protoBook.add(peerId2, testcodec2)
|
||
|
peerStore.keyBook.set(peerId1, keyPair1.pubKey)
|
||
|
peerStore.keyBook.set(peerId2, keyPair2.pubKey)
|
||
|
|
||
|
# Test PeerStore::get
|
||
|
let
|
||
|
peer1Stored = peerStore.get(peerId1)
|
||
|
peer2Stored = peerStore.get(peerId2)
|
||
|
check:
|
||
|
peer1Stored.peerId == peerId1
|
||
|
peer1Stored.addrs == toHashSet([multiaddr1])
|
||
|
peer1Stored.protos == toHashSet([testcodec1])
|
||
|
peer1Stored.publicKey == keyPair1.pubkey
|
||
|
peer2Stored.peerId == peerId2
|
||
|
peer2Stored.addrs == toHashSet([multiaddr2])
|
||
|
peer2Stored.protos == toHashSet([testcodec2])
|
||
|
peer2Stored.publicKey == keyPair2.pubkey
|
||
|
|
||
|
# Test PeerStore::peers
|
||
|
let peers = peerStore.peers()
|
||
|
check:
|
||
|
peers.len == 2
|
||
|
peers.anyIt(it.peerId == peerId1 and
|
||
|
it.addrs == toHashSet([multiaddr1]) and
|
||
|
it.protos == toHashSet([testcodec1]) and
|
||
|
it.publicKey == keyPair1.pubkey)
|
||
|
peers.anyIt(it.peerId == peerId2 and
|
||
|
it.addrs == toHashSet([multiaddr2]) and
|
||
|
it.protos == toHashSet([testcodec2]) and
|
||
|
it.publicKey == keyPair2.pubkey)
|
||
|
|
||
|
# Test PeerStore::delete
|
||
|
check:
|
||
|
# Delete existing peerId
|
||
|
peerStore.delete(peerId1) == true
|
||
|
peerStore.peers().anyIt(it.peerId == peerId1) == false
|
||
|
|
||
|
# Now try and delete it again
|
||
|
peerStore.delete(peerId1) == false
|
||
|
|
||
|
test "PeerStore listeners":
|
||
|
# Set up peer store with listener
|
||
|
var
|
||
|
peerStore = PeerStore.new()
|
||
|
addrChanged = false
|
||
|
protoChanged = false
|
||
|
keyChanged = false
|
||
|
|
||
|
proc addrChange(peerId: PeerID, addrs: HashSet[MultiAddress]) =
|
||
|
addrChanged = true
|
||
|
|
||
|
proc protoChange(peerId: PeerID, protos: HashSet[string]) =
|
||
|
protoChanged = true
|
||
|
|
||
|
proc keyChange(peerId: PeerID, publicKey: PublicKey) =
|
||
|
keyChanged = true
|
||
|
|
||
|
peerStore.addHandlers(addrChangeHandler = addrChange,
|
||
|
protoChangeHandler = protoChange,
|
||
|
keyChangeHandler = keyChange)
|
||
|
|
||
|
# Test listener triggered on adding multiaddr
|
||
|
peerStore.addressBook.add(peerId1, multiaddr1)
|
||
|
check:
|
||
|
addrChanged == true
|
||
|
|
||
|
# Test listener triggered on setting addresses
|
||
|
addrChanged = false
|
||
|
peerStore.addressBook.set(peerId2,
|
||
|
toHashSet([multiaddr1, multiaddr2]))
|
||
|
check:
|
||
|
addrChanged == true
|
||
|
|
||
|
# Test listener triggered on adding proto
|
||
|
peerStore.protoBook.add(peerId1, testcodec1)
|
||
|
check:
|
||
|
protoChanged == true
|
||
|
|
||
|
# Test listener triggered on setting protos
|
||
|
protoChanged = false
|
||
|
peerStore.protoBook.set(peerId2,
|
||
|
toHashSet([testcodec1, testcodec2]))
|
||
|
check:
|
||
|
protoChanged == true
|
||
|
|
||
|
# Test listener triggered on setting public key
|
||
|
peerStore.keyBook.set(peerId1,
|
||
|
keyPair1.pubkey)
|
||
|
check:
|
||
|
keyChanged == true
|
||
|
|
||
|
# Test listener triggered on changing public key
|
||
|
keyChanged = false
|
||
|
peerStore.keyBook.set(peerId1,
|
||
|
keyPair2.pubkey)
|
||
|
check:
|
||
|
keyChanged == true
|
||
|
|
||
|
test "AddressBook API":
|
||
|
# Set up address book
|
||
|
var
|
||
|
addressBook = PeerStore.new().addressBook
|
||
|
|
||
|
# Test AddressBook::add
|
||
|
addressBook.add(peerId1, multiaddr1)
|
||
|
|
||
|
check:
|
||
|
toSeq(keys(addressBook.book))[0] == peerId1
|
||
|
toSeq(values(addressBook.book))[0] == toHashSet([multiaddr1])
|
||
|
|
||
|
# Test AddressBook::get
|
||
|
check:
|
||
|
addressBook.get(peerId1) == toHashSet([multiaddr1])
|
||
|
|
||
|
# Test AddressBook::delete
|
||
|
check:
|
||
|
# Try to delete peerId that doesn't exist
|
||
|
addressBook.delete(peerId2) == false
|
||
|
|
||
|
# Delete existing peerId
|
||
|
addressBook.book.len == 1 # sanity
|
||
|
addressBook.delete(peerId1) == true
|
||
|
addressBook.book.len == 0
|
||
|
|
||
|
# Test AddressBook::set
|
||
|
# Set peerId2 with multiple multiaddrs
|
||
|
addressBook.set(peerId2,
|
||
|
toHashSet([multiaddr1, multiaddr2]))
|
||
|
check:
|
||
|
toSeq(keys(addressBook.book))[0] == peerId2
|
||
|
toSeq(values(addressBook.book))[0] == toHashSet([multiaddr1, multiaddr2])
|
||
|
|
||
|
test "ProtoBook API":
|
||
|
# Set up protocol book
|
||
|
var
|
||
|
protoBook = PeerStore.new().protoBook
|
||
|
|
||
|
# Test ProtoBook::add
|
||
|
protoBook.add(peerId1, testcodec1)
|
||
|
|
||
|
check:
|
||
|
toSeq(keys(protoBook.book))[0] == peerId1
|
||
|
toSeq(values(protoBook.book))[0] == toHashSet([testcodec1])
|
||
|
|
||
|
# Test ProtoBook::get
|
||
|
check:
|
||
|
protoBook.get(peerId1) == toHashSet([testcodec1])
|
||
|
|
||
|
# Test ProtoBook::delete
|
||
|
check:
|
||
|
# Try to delete peerId that doesn't exist
|
||
|
protoBook.delete(peerId2) == false
|
||
|
|
||
|
# Delete existing peerId
|
||
|
protoBook.book.len == 1 # sanity
|
||
|
protoBook.delete(peerId1) == true
|
||
|
protoBook.book.len == 0
|
||
|
|
||
|
# Test ProtoBook::set
|
||
|
# Set peerId2 with multiple protocols
|
||
|
protoBook.set(peerId2,
|
||
|
toHashSet([testcodec1, testcodec2]))
|
||
|
check:
|
||
|
toSeq(keys(protoBook.book))[0] == peerId2
|
||
|
toSeq(values(protoBook.book))[0] == toHashSet([testcodec1, testcodec2])
|
||
|
|
||
|
test "KeyBook API":
|
||
|
# Set up key book
|
||
|
var
|
||
|
keyBook = PeerStore.new().keyBook
|
||
|
|
||
|
# Test KeyBook::set
|
||
|
keyBook.set(peerId1,
|
||
|
keyPair1.pubkey)
|
||
|
check:
|
||
|
toSeq(keys(keyBook.book))[0] == peerId1
|
||
|
toSeq(values(keyBook.book))[0] == keyPair1.pubkey
|
||
|
|
||
|
# Test KeyBook::get
|
||
|
check:
|
||
|
keyBook.get(peerId1) == keyPair1.pubkey
|
||
|
|
||
|
# Test KeyBook::delete
|
||
|
check:
|
||
|
# Try to delete peerId that doesn't exist
|
||
|
keyBook.delete(peerId2) == false
|
||
|
|
||
|
# Delete existing peerId
|
||
|
keyBook.book.len == 1 # sanity
|
||
|
keyBook.delete(peerId1) == true
|
||
|
keyBook.book.len == 0
|