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  }