grpc-demo/internal/greeter/server_test.go

126 lines
2.4 KiB
Go

package greeter_test
import (
"context"
"errors"
"io"
"net"
"testing"
"gitea.dwysokinski.me/Kichiyaki/grpc-demo/internal/greeter"
"gitea.dwysokinski.me/Kichiyaki/grpc-demo/proto"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/test/bufconn"
)
func TestServer_SayHello(t *testing.T) {
t.Parallel()
tests := []struct {
name string
expected string
}{
{
name: "James",
expected: "Hello James!",
},
{
name: "Robert",
expected: "Hello Robert!",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
conn := newServer(t)
reply, err := conn.SayHello(context.Background(), &proto.HelloRequest{Name: tt.name})
require.NoError(t, err)
assert.Equal(t, tt.expected, reply.GetMessage())
})
}
}
func TestServer_SayHelloBidirectionalStream(t *testing.T) {
t.Parallel()
names := make([]string, 20)
for i := range names {
names[i] = uuid.NewString()
}
client := newServer(t)
streamClient, err := client.SayHelloBidirectionalStream(context.Background())
require.NoError(t, err)
for _, n := range names {
err = streamClient.Send(&proto.HelloRequest{
Name: n,
})
assert.NoError(t, err)
}
assert.NoError(t, streamClient.CloseSend())
replies := make([]*proto.HelloReply, 0, len(names))
for {
reply, err := streamClient.Recv()
if errors.Is(err, io.EOF) {
break
}
assert.NoError(t, err)
replies = append(replies, reply)
}
require.Len(t, replies, len(names))
for _, n := range names {
found := false
for _, r := range replies {
if r.GetMessage() == "Hello "+n+"!" {
found = true
break
}
}
assert.True(t, found, "name="+n)
}
}
func newServer(t *testing.T) proto.GreeterClient {
t.Helper()
buffer := 101024 * 1024
lis := bufconn.Listen(buffer)
server := grpc.NewServer()
proto.RegisterGreeterServer(server, greeter.NewServer(zap.NewNop()))
go func() {
require.NoError(t, server.Serve(lis))
}()
t.Cleanup(func() {
server.GracefulStop()
})
conn, err := grpc.Dial(
"",
grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) {
return lis.Dial()
}),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, conn.Close())
})
return proto.NewGreeterClient(conn)
}