orchard/internal/echoserver/echoserver_test.go

55 lines
1.2 KiB
Go

package echoserver_test
import (
"context"
"crypto/rand"
"io"
"net"
"testing"
"github.com/cirruslabs/orchard/internal/echoserver"
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
)
func TestServer(t *testing.T) {
echoServer, err := echoserver.New()
require.NoError(t, err)
subCtx, subCtxCancel := context.WithCancel(t.Context())
group, ctx := errgroup.WithContext(subCtx)
group.Go(func() error {
return echoServer.Run(ctx)
})
netConn, err := net.Dial("tcp", echoServer.Addr())
require.NoError(t, err)
const bufSizeBytes = 64 * 1024
outgoingBuf := make([]byte, bufSizeBytes)
incomingBuf := make([]byte, bufSizeBytes)
// Prepare the outgoing buffer
n, err := rand.Read(outgoingBuf)
require.NoError(t, err)
require.Equal(t, len(outgoingBuf), n)
// Send the outgoing buffer
n, err = netConn.Write(outgoingBuf)
require.NoError(t, err)
require.Equal(t, len(outgoingBuf), n)
// Receive the incoming buffer
n, err = io.ReadFull(netConn, incomingBuf)
require.NoError(t, err)
require.Equal(t, len(incomingBuf), n)
// Compare outgoing and incoming buffers
require.Equal(t, outgoingBuf, incomingBuf)
// Ensure clean shutdown
require.NoError(t, netConn.Close())
subCtxCancel()
require.NoError(t, group.Wait())
}