Added more node tests. Small refactoring of Netowkr and handler.

This commit is contained in:
Milos Gajdos
2019-09-11 00:23:37 +01:00
parent 16fcf1fbda
commit 2dfbe93d65
7 changed files with 145 additions and 159 deletions

View File

@@ -3,7 +3,6 @@ package network
import (
"container/list"
"errors"
"sort"
"sync"
"time"
@@ -96,10 +95,13 @@ func (n *node) Peers() []Node {
p := &node{
id: peer.id,
address: peer.address,
peers: make(map[string]*node),
network: peer.network,
}
// NOTE: we do not care about peer's peers
// we only collect the node's peers i.e. its adjacent nodes
// collect peer's peers aka pop (peer of peer)
for id, pop := range peer.peers {
p.peers[id] = pop
}
peers = append(peers, p)
}
n.RUnlock()
@@ -107,36 +109,31 @@ func (n *node) Peers() []Node {
return peers
}
// Topology returns a slice of all nodes in reachable by node up to given depth
func (n *node) Topology(depth uint) []Node {
// get all the nodes
nodes := n.Nodes()
// topology returns network topology up to MaxDepth
func (n *node) Topology(depth uint) *node {
n.RLock()
// sort the slice of nodes
sort.Slice(nodes, func(i, j int) bool { return nodes[i].Id() <= nodes[j].Id() })
// find the node with our id
i := sort.Search(len(nodes), func(j int) bool { return nodes[j].Id() >= n.id })
// make a copy of yourself
node := &node{
id: n.id,
address: n.address,
peers: make(map[string]*node),
network: n.network,
}
// TODO: finish implementing this
var topology []Node
// collect all the reachable nodes into slice
if i < len(nodes) && nodes[i].Id() == n.id {
for _, peer := range nodes[i].Peers() {
// don't return yourself
if peer.Id() == n.id {
continue
}
topNode := &node{
id: peer.Id(),
address: peer.Address(),
}
topology = append(topology, topNode)
}
// return if we reach requested depth or we have no more peers
if depth == 0 || len(n.peers) == 0 {
return node
}
depth--
for _, peer := range n.peers {
nodePeer := peer.Topology(depth)
node.peers[nodePeer.id] = nodePeer
}
n.RUnlock()
return topology
return node
}
// getProtoTopology returns node peers up to given depth encoded in protobufs