/ core / corehttp / metrics_test.go
metrics_test.go
 1  package corehttp
 2  
 3  import (
 4  	"context"
 5  	"testing"
 6  	"time"
 7  
 8  	"github.com/ipfs/kubo/core"
 9  
10  	inet "github.com/libp2p/go-libp2p/core/network"
11  	bhost "github.com/libp2p/go-libp2p/p2p/host/basic"
12  	swarmt "github.com/libp2p/go-libp2p/p2p/net/swarm/testing"
13  )
14  
15  // This test is based on go-libp2p/p2p/net/swarm.TestConnectednessCorrect
16  // It builds 4 nodes and connects them, one being the sole center.
17  // Then it checks that the center reports the correct number of peers.
18  func TestPeersTotal(t *testing.T) {
19  	ctx := context.Background()
20  
21  	hosts := make([]*bhost.BasicHost, 4)
22  	for i := range 4 {
23  		var err error
24  		hosts[i], err = bhost.NewHost(swarmt.GenSwarm(t), nil)
25  		if err != nil {
26  			t.Fatal(err)
27  		}
28  	}
29  
30  	dial := func(a, b inet.Network) {
31  		swarmt.DivulgeAddresses(b, a)
32  		if _, err := a.DialPeer(ctx, b.LocalPeer()); err != nil {
33  			t.Fatalf("Failed to dial: %s", err)
34  		}
35  	}
36  
37  	dial(hosts[0].Network(), hosts[1].Network())
38  	dial(hosts[0].Network(), hosts[2].Network())
39  	dial(hosts[0].Network(), hosts[3].Network())
40  
41  	// there's something wrong with dial, i think. it's not finishing
42  	// completely. there must be some async stuff.
43  	<-time.After(100 * time.Millisecond)
44  
45  	node := &core.IpfsNode{PeerHost: hosts[0]}
46  	collector := IpfsNodeCollector{Node: node}
47  	peersTransport := collector.PeersTotalValues()
48  	if len(peersTransport) > 2 {
49  		t.Fatalf("expected at most 2 peers transport (tcp and upd/quic), got %d, transport map %v",
50  			len(peersTransport), peersTransport)
51  	}
52  	totalPeers := peersTransport["/ip4/tcp"] + peersTransport["/ip4/udp/quic-v1"]
53  	if totalPeers != 3 {
54  		t.Fatalf("expected 3 peers in either tcp or upd/quic transport, got %f", totalPeers)
55  	}
56  }