package grpc_test import ( "context" "fmt" "log" "net" "testing" "example.com/foo_proto" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) type fooerServer struct { } func newServer() *fooerServer { return &fooerServer{} } func (*fooerServer) RoundTripFoo(ctx context.Context, foo *foo_proto.Foo) (*foo_proto.Foo, error) { foo.Value += 1 return foo, nil } func TestRoundTripFoo(t *testing.T) { // Start the server. address := fmt.Sprintf("localhost:%d", 12345) lis, err := net.Listen("tcp", address) if err != nil { log.Fatalf("failed to listen on %s: %v", address, err) } grpcServer := grpc.NewServer() foo_proto.RegisterFooerServer(grpcServer, newServer()) go func() { grpcServer.Serve(lis) }() // Start the client. conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("fail to dial %s: %v", address, err) } defer conn.Close() client := foo_proto.NewFooerClient(conn) // Send a message and verify that it is returned correctly. msgIn := &foo_proto.Foo{ Value: 42, } msgOut, err := client.RoundTripFoo(context.TODO(), msgIn) if err != nil { log.Fatalf("failed to round-trip message: %v", err) } if msgOut.Value != 43 { log.Fatalf("message did not round-trip correctly: sent %v, got %v", msgIn, msgOut) } grpcServer.GracefulStop() }