gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/network/node_test.go (about) 1 package network 2 3 import ( 4 "testing" 5 "time" 6 7 pb "gitee.com/liuxuezhan/go-micro-v1.18.0/network/proto" 8 ) 9 10 var ( 11 testNodeId = "testNode" 12 testNodeAddress = "testAddress" 13 testNodeNetName = "testNetwork" 14 testNodePeerIds = []string{"peer1", "peer2", "peer3"} 15 testPeerOfPeerIds = []string{"peer11", "peer12"} 16 ) 17 18 func testSetup() *node { 19 testNode := &node{ 20 id: testNodeId, 21 address: testNodeAddress, 22 peers: make(map[string]*node), 23 network: newNetwork(Name(testNodeNetName)), 24 } 25 26 // add some peers to the node 27 for _, id := range testNodePeerIds { 28 testNode.peers[id] = &node{ 29 id: id, 30 address: testNode.address + "-" + id, 31 peers: make(map[string]*node), 32 network: testNode.network, 33 } 34 } 35 36 // add peers to peer1 37 // NOTE: these are peers of peers! 38 for _, id := range testPeerOfPeerIds { 39 testNode.peers["peer1"].peers[id] = &node{ 40 id: id, 41 address: testNode.address + "-" + id, 42 peers: make(map[string]*node), 43 network: testNode.network, 44 } 45 } 46 47 // connect peer1 with peer2 48 testNode.peers["peer1"].peers["peer2"] = testNode.peers["peer2"] 49 // connect peer2 with peer3 50 testNode.peers["peer2"].peers["peer3"] = testNode.peers["peer3"] 51 52 return testNode 53 } 54 55 func TestNodeId(t *testing.T) { 56 node := testSetup() 57 if node.Id() != testNodeId { 58 t.Errorf("Expected id: %s, found: %s", testNodeId, node.Id()) 59 } 60 } 61 62 func TestNodeAddress(t *testing.T) { 63 node := testSetup() 64 if node.Address() != testNodeAddress { 65 t.Errorf("Expected address: %s, found: %s", testNodeAddress, node.Address()) 66 } 67 } 68 func TestNodeNetwork(t *testing.T) { 69 node := testSetup() 70 if node.Network().Name() != testNodeNetName { 71 t.Errorf("Expected network: %s, found: %s", testNodeNetName, node.Network().Name()) 72 } 73 } 74 75 func TestNodes(t *testing.T) { 76 // single node 77 single := &node{ 78 id: testNodeId, 79 address: testNodeAddress, 80 peers: make(map[string]*node), 81 network: newNetwork(Name(testNodeNetName)), 82 } 83 // get all the nodes including yourself 84 nodes := single.Nodes() 85 nodeCount := 1 86 87 if len(nodes) != nodeCount { 88 t.Errorf("Expected to find %d nodes, found: %d", nodeCount, len(nodes)) 89 } 90 91 // complicated node graph 92 node := testSetup() 93 // get all the nodes including yourself 94 nodes = node.Nodes() 95 96 // compile a list of ids of all nodes in the network into map for easy indexing 97 nodeIds := make(map[string]bool) 98 // add yourself 99 nodeIds[node.id] = true 100 // add peer Ids 101 for _, id := range testNodePeerIds { 102 nodeIds[id] = true 103 } 104 // add peer1 peers i.e. peers of peer 105 for _, id := range testPeerOfPeerIds { 106 nodeIds[id] = true 107 } 108 109 // we should return the correct number of nodes 110 if len(nodes) != len(nodeIds) { 111 t.Errorf("Expected %d nodes, found: %d", len(nodeIds), len(nodes)) 112 } 113 114 // iterate through the list of nodes and makes sure all have been returned 115 for _, node := range nodes { 116 if _, ok := nodeIds[node.Id()]; !ok { 117 t.Errorf("Expected to find %s node", node.Id()) 118 } 119 } 120 121 // this is a leaf node 122 id := "peer11" 123 if nodePeer := node.GetPeerNode(id); nodePeer == nil { 124 t.Errorf("Expected to find %s node", id) 125 } 126 } 127 128 func collectPeerIds(peer Node, ids map[string]bool) map[string]bool { 129 if len(peer.Peers()) == 0 { 130 return ids 131 } 132 133 // iterate through the whole graph 134 for _, peer := range peer.Peers() { 135 ids = collectPeerIds(peer, ids) 136 if _, ok := ids[peer.Id()]; !ok { 137 ids[peer.Id()] = true 138 } 139 } 140 141 return ids 142 } 143 144 func TestPeers(t *testing.T) { 145 // single node 146 single := &node{ 147 id: testNodeId, 148 address: testNodeAddress, 149 peers: make(map[string]*node), 150 network: newNetwork(Name(testNodeNetName)), 151 } 152 // get node peers 153 peers := single.Peers() 154 // there should be no peers 155 peerCount := 0 156 157 if len(peers) != peerCount { 158 t.Errorf("Expected to find %d nodes, found: %d", peerCount, len(peers)) 159 } 160 161 // complicated node graph 162 node := testSetup() 163 // list of ids of nodes of MaxDepth 164 peerIds := make(map[string]bool) 165 // add peer Ids 166 for _, id := range testNodePeerIds { 167 peerIds[id] = true 168 } 169 // add peers of peers to peerIds 170 for _, id := range testPeerOfPeerIds { 171 peerIds[id] = true 172 } 173 // get node peers 174 peers = node.Peers() 175 176 // we will collect all returned Peer Ids into this map 177 resPeerIds := make(map[string]bool) 178 for _, peer := range peers { 179 resPeerIds[peer.Id()] = true 180 resPeerIds = collectPeerIds(peer, resPeerIds) 181 } 182 183 // if correct, we must collect all peerIds 184 if len(resPeerIds) != len(peerIds) { 185 t.Errorf("Expected to find %d peers, found: %d", len(peerIds), len(resPeerIds)) 186 } 187 188 for id := range resPeerIds { 189 if _, ok := peerIds[id]; !ok { 190 t.Errorf("Expected to find %s peer", id) 191 } 192 } 193 } 194 195 func TestDeletePeerNode(t *testing.T) { 196 // complicated node graph 197 node := testSetup() 198 199 nodeCount := len(node.Nodes()) 200 201 // should not find non-existent peer node 202 if err := node.DeletePeerNode("foobar"); err != ErrPeerNotFound { 203 t.Errorf("Expected: %v, got: %v", ErrPeerNotFound, err) 204 } 205 206 // lets pick one of the peer1 peers 207 if err := node.DeletePeerNode(testPeerOfPeerIds[0]); err != nil { 208 t.Errorf("Error deleting peer node: %v", err) 209 } 210 211 nodeDelCount := len(node.Nodes()) 212 213 if nodeDelCount != nodeCount-1 { 214 t.Errorf("Expected node count: %d, got: %d", nodeCount-1, nodeDelCount) 215 } 216 } 217 218 func TestPruneStalePeerNodes(t *testing.T) { 219 // complicated node graph 220 node := testSetup() 221 222 nodes := node.Nodes() 223 224 pruneTime := 10 * time.Millisecond 225 time.Sleep(pruneTime) 226 227 // should delete all nodes besides node 228 pruned := node.PruneStalePeers(pruneTime) 229 230 if len(pruned) != len(nodes)-1 { 231 t.Errorf("Expected pruned node count: %d, got: %d", len(nodes)-1, len(pruned)) 232 } 233 } 234 235 func TestUnpackPeerTopology(t *testing.T) { 236 pbPeer := &pb.Peer{ 237 Node: &pb.Node{ 238 Id: "newPeer", 239 Address: "newPeerAddress", 240 }, 241 Peers: make([]*pb.Peer, 0), 242 } 243 // it should add pbPeer to the single node peers 244 peer := UnpackPeerTopology(pbPeer, time.Now(), 5) 245 if peer.id != pbPeer.Node.Id { 246 t.Errorf("Expected peer id %s, found: %s", pbPeer.Node.Id, peer.id) 247 } 248 249 node := testSetup() 250 // build a simple topology to update node peer1 251 peer1 := node.peers["peer1"] 252 pbPeer1Node := &pb.Node{ 253 Id: peer1.id, 254 Address: peer1.address, 255 } 256 257 pbPeer111 := &pb.Peer{ 258 Node: &pb.Node{ 259 Id: "peer111", 260 Address: "peer111Address", 261 }, 262 Peers: make([]*pb.Peer, 0), 263 } 264 265 pbPeer121 := &pb.Peer{ 266 Node: &pb.Node{ 267 Id: "peer121", 268 Address: "peer121Address", 269 }, 270 Peers: make([]*pb.Peer, 0), 271 } 272 // topology to update 273 pbPeer1 := &pb.Peer{ 274 Node: pbPeer1Node, 275 Peers: []*pb.Peer{pbPeer111, pbPeer121}, 276 } 277 // unpack peer1 topology 278 peer = UnpackPeerTopology(pbPeer1, time.Now(), 5) 279 // make sure peer1 topology has been correctly updated 280 newPeerIds := []string{pbPeer111.Node.Id, pbPeer121.Node.Id} 281 for _, id := range newPeerIds { 282 if _, ok := peer.peers[id]; !ok { 283 t.Errorf("Expected %s to be a peer of %s", id, "peer1") 284 } 285 } 286 } 287 288 func TestPeersToProto(t *testing.T) { 289 // single node 290 single := &node{ 291 id: testNodeId, 292 address: testNodeAddress, 293 peers: make(map[string]*node), 294 network: newNetwork(Name(testNodeNetName)), 295 } 296 topCount := 0 297 298 protoPeers := PeersToProto(single, 0) 299 300 if len(protoPeers.Peers) != topCount { 301 t.Errorf("Expected to find %d nodes, found: %d", topCount, len(protoPeers.Peers)) 302 } 303 304 // complicated node graph 305 node := testSetup() 306 topCount = 3 307 // list of ids of nodes of depth 1 i.e. node peers 308 peerIds := make(map[string]bool) 309 // add peer Ids 310 for _, id := range testNodePeerIds { 311 peerIds[id] = true 312 } 313 // depth 1 should give us immmediate neighbours only 314 protoPeers = PeersToProto(node, 1) 315 316 if len(protoPeers.Peers) != topCount { 317 t.Errorf("Expected to find %d nodes, found: %d", topCount, len(protoPeers.Peers)) 318 } 319 }