You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

121 lines
3.0 KiB

package p2p_test
import (
"context"
"io"
"testing"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/libs/log"
"github.com/tendermint/tendermint/p2p"
)
func TestMemoryTransport(t *testing.T) {
ctx := context.Background()
network := p2p.NewMemoryNetwork(log.TestingLogger())
a := network.GenerateTransport()
b := network.GenerateTransport()
c := network.GenerateTransport()
// Dialing a missing endpoint should fail.
_, err := a.Dial(ctx, p2p.Endpoint{
Protocol: p2p.MemoryProtocol,
PeerID: p2p.NodeID("foo"),
Path: "foo",
})
require.Error(t, err)
// Dialing and accepting a→b and a→c should work.
aToB, bToA, err := a.DialAccept(ctx, b)
require.NoError(t, err)
defer aToB.Close()
defer bToA.Close()
aToC, cToA, err := a.DialAccept(ctx, c)
require.NoError(t, err)
defer aToC.Close()
defer cToA.Close()
// Send and receive a message both ways a→b and b→a
sent, err := aToB.SendMessage(1, []byte("hi!"))
require.NoError(t, err)
require.True(t, sent)
ch, msg, err := bToA.ReceiveMessage()
require.NoError(t, err)
require.EqualValues(t, 1, ch)
require.EqualValues(t, "hi!", msg)
sent, err = bToA.SendMessage(1, []byte("hello"))
require.NoError(t, err)
require.True(t, sent)
ch, msg, err = aToB.ReceiveMessage()
require.NoError(t, err)
require.EqualValues(t, 1, ch)
require.EqualValues(t, "hello", msg)
// Send and receive a message both ways a→c and c→a
sent, err = aToC.SendMessage(1, []byte("foo"))
require.NoError(t, err)
require.True(t, sent)
ch, msg, err = cToA.ReceiveMessage()
require.NoError(t, err)
require.EqualValues(t, 1, ch)
require.EqualValues(t, "foo", msg)
sent, err = cToA.SendMessage(1, []byte("bar"))
require.NoError(t, err)
require.True(t, sent)
ch, msg, err = aToC.ReceiveMessage()
require.NoError(t, err)
require.EqualValues(t, 1, ch)
require.EqualValues(t, "bar", msg)
// If we close aToB, sending and receiving on either end will error.
err = aToB.Close()
require.NoError(t, err)
_, err = aToB.SendMessage(1, []byte("foo"))
require.Equal(t, io.EOF, err)
_, _, err = aToB.ReceiveMessage()
require.Equal(t, io.EOF, err)
_, err = bToA.SendMessage(1, []byte("foo"))
require.Equal(t, io.EOF, err)
_, _, err = bToA.ReceiveMessage()
require.Equal(t, io.EOF, err)
// We can still send aToC.
sent, err = aToC.SendMessage(1, []byte("foo"))
require.NoError(t, err)
require.True(t, sent)
ch, msg, err = cToA.ReceiveMessage()
require.NoError(t, err)
require.EqualValues(t, 1, ch)
require.EqualValues(t, "foo", msg)
// If we close the c transport, it will no longer accept connections,
// but we can still use the open connection.
endpoint := c.Endpoints()[0]
err = c.Close()
require.NoError(t, err)
require.Empty(t, c.Endpoints())
_, err = a.Dial(ctx, endpoint)
require.Error(t, err)
sent, err = aToC.SendMessage(1, []byte("bar"))
require.NoError(t, err)
require.True(t, sent)
ch, msg, err = cToA.ReceiveMessage()
require.NoError(t, err)
require.EqualValues(t, 1, ch)
require.EqualValues(t, "bar", msg)
}