1package tcp
2
3import (
4	"github.com/libp2p/go-libp2p-core/crypto"
5	"github.com/libp2p/go-libp2p-core/peer"
6	"testing"
7
8	"github.com/libp2p/go-libp2p-core/sec/insecure"
9	mplex "github.com/libp2p/go-libp2p-mplex"
10	tptu "github.com/libp2p/go-libp2p-transport-upgrader"
11
12	ttransport "github.com/libp2p/go-libp2p-testing/suites/transport"
13
14	ma "github.com/multiformats/go-multiaddr"
15)
16
17func TestTcpTransport(t *testing.T) {
18	for i := 0; i < 2; i++ {
19		ia := makeInsecureTransport(t)
20		ib := makeInsecureTransport(t)
21
22		ta := NewTCPTransport(&tptu.Upgrader{
23			Secure: ia,
24			Muxer:  new(mplex.Transport),
25		})
26		tb := NewTCPTransport(&tptu.Upgrader{
27			Secure: ib,
28			Muxer:  new(mplex.Transport),
29		})
30
31		zero := "/ip4/127.0.0.1/tcp/0"
32		ttransport.SubtestTransport(t, ta, tb, zero, ia.LocalPeer())
33
34		envReuseportVal = false
35	}
36	envReuseportVal = true
37}
38
39func TestTcpTransportCantDialDNS(t *testing.T) {
40	for i := 0; i < 2; i++ {
41		dnsa, err := ma.NewMultiaddr("/dns4/example.com/tcp/1234")
42		if err != nil {
43			t.Fatal(err)
44		}
45
46		tpt := NewTCPTransport(&tptu.Upgrader{
47			Secure: makeInsecureTransport(t),
48			Muxer:  new(mplex.Transport),
49		})
50
51		if tpt.CanDial(dnsa) {
52			t.Fatal("shouldn't be able to dial dns")
53		}
54
55		envReuseportVal = false
56	}
57	envReuseportVal = true
58}
59
60func TestTcpTransportCantListenUtp(t *testing.T) {
61	for i := 0; i < 2; i++ {
62		utpa, err := ma.NewMultiaddr("/ip4/127.0.0.1/udp/0/utp")
63		if err != nil {
64			t.Fatal(err)
65		}
66
67		tpt := NewTCPTransport(&tptu.Upgrader{
68			Secure: makeInsecureTransport(t),
69			Muxer:  new(mplex.Transport),
70		})
71
72		_, err = tpt.Listen(utpa)
73		if err == nil {
74			t.Fatal("shouldnt be able to listen on utp addr with tcp transport")
75		}
76
77		envReuseportVal = false
78	}
79	envReuseportVal = true
80}
81
82func makeInsecureTransport(t *testing.T) *insecure.Transport {
83	priv, pub, err := crypto.GenerateKeyPair(crypto.Ed25519, 256)
84	if err != nil {
85		t.Fatal(err)
86	}
87	id, err := peer.IDFromPublicKey(pub)
88	if err != nil {
89		t.Fatal(err)
90	}
91	return insecure.NewWithIdentity(id, priv)
92}
93