55 lines
1.2 KiB
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())
|
|
}
|