diff --git a/swarm_transport.go b/swarm_transport.go index c96a079d9eb0a7de521fa0c81bebd452854f5fb0..04314887770bee5793fd00908702415172adfdb4 100644 --- a/swarm_transport.go +++ b/swarm_transport.go @@ -70,6 +70,10 @@ func (s *Swarm) TransportForListening(a ma.Multiaddr) transport.Transport { func (s *Swarm) AddTransport(t transport.Transport) error { protocols := t.Protocols() + if len(protocols) == 0 { + return fmt.Errorf("useless transport handles no protocols: %T", t) + } + s.transports.Lock() defer s.transports.Unlock() var registered []string diff --git a/transport_test.go b/transport_test.go new file mode 100644 index 0000000000000000000000000000000000000000..018775b261f9e5102bc76d4af84b30daf77de05e --- /dev/null +++ b/transport_test.go @@ -0,0 +1,47 @@ +package swarm_test + +import ( + "context" + "testing" + + swarmt "github.com/libp2p/go-libp2p-swarm/testing" + + peer "github.com/libp2p/go-libp2p-peer" + transport "github.com/libp2p/go-libp2p-transport" + ma "github.com/multiformats/go-multiaddr" +) + +type dummyTransport struct { + protocols []int + proxy bool +} + +func (dt *dummyTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (transport.Conn, error) { + panic("unimplemented") +} + +func (dt *dummyTransport) CanDial(addr ma.Multiaddr) bool { + panic("unimplemented") +} + +func (dt *dummyTransport) Listen(laddr ma.Multiaddr) (transport.Listener, error) { + panic("unimplemented") +} + +func (dt *dummyTransport) Proxy() bool { + return dt.proxy +} + +func (dt *dummyTransport) Protocols() []int { + return dt.protocols +} + +func TestUselessTransport(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + swarm := swarmt.GenSwarm(t, ctx) + err := swarm.AddTransport(new(dummyTransport)) + if err == nil { + t.Fatal("adding a transport that supports no protocols should have failed") + } +}