client_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package zrpc
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "net"
  7. "testing"
  8. "time"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/tal-tech/go-zero/core/logx"
  11. "github.com/tal-tech/go-zero/zrpc/internal/mock"
  12. "google.golang.org/grpc"
  13. "google.golang.org/grpc/codes"
  14. "google.golang.org/grpc/status"
  15. "google.golang.org/grpc/test/bufconn"
  16. )
  17. func init() {
  18. logx.Disable()
  19. }
  20. func dialer() func(context.Context, string) (net.Conn, error) {
  21. listener := bufconn.Listen(1024 * 1024)
  22. server := grpc.NewServer()
  23. mock.RegisterDepositServiceServer(server, &mock.DepositServer{})
  24. go func() {
  25. if err := server.Serve(listener); err != nil {
  26. log.Fatal(err)
  27. }
  28. }()
  29. return func(context.Context, string) (net.Conn, error) {
  30. return listener.Dial()
  31. }
  32. }
  33. func TestDepositServer_Deposit(t *testing.T) {
  34. tests := []struct {
  35. name string
  36. amount float32
  37. res *mock.DepositResponse
  38. errCode codes.Code
  39. errMsg string
  40. }{
  41. {
  42. "invalid request with negative amount",
  43. -1.11,
  44. nil,
  45. codes.InvalidArgument,
  46. fmt.Sprintf("cannot deposit %v", -1.11),
  47. },
  48. {
  49. "valid request with non negative amount",
  50. 0.00,
  51. &mock.DepositResponse{Ok: true},
  52. codes.OK,
  53. "",
  54. },
  55. {
  56. "valid request with long handling time",
  57. 2000.00,
  58. nil,
  59. codes.DeadlineExceeded,
  60. fmt.Sprintf("context deadline exceeded"),
  61. },
  62. }
  63. directClient := MustNewClient(
  64. RpcClientConf{
  65. Endpoints: []string{"foo"},
  66. App: "foo",
  67. Token: "bar",
  68. Timeout: 1000,
  69. },
  70. WithDialOption(grpc.WithInsecure()),
  71. WithDialOption(grpc.WithContextDialer(dialer())),
  72. WithUnaryClientInterceptor(func(ctx context.Context, method string, req, reply interface{},
  73. cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  74. return invoker(ctx, method, req, reply, cc, opts...)
  75. }),
  76. )
  77. targetClient, err := NewClientWithTarget("foo", WithDialOption(grpc.WithInsecure()),
  78. WithDialOption(grpc.WithContextDialer(dialer())), WithUnaryClientInterceptor(
  79. func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn,
  80. invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  81. return invoker(ctx, method, req, reply, cc, opts...)
  82. }), WithTimeout(1000*time.Millisecond))
  83. assert.Nil(t, err)
  84. clients := []Client{
  85. directClient,
  86. targetClient,
  87. }
  88. for _, tt := range tests {
  89. for _, client := range clients {
  90. t.Run(tt.name, func(t *testing.T) {
  91. cli := mock.NewDepositServiceClient(client.Conn())
  92. request := &mock.DepositRequest{Amount: tt.amount}
  93. response, err := cli.Deposit(context.Background(), request)
  94. if response != nil {
  95. assert.True(t, len(response.String()) > 0)
  96. if response.GetOk() != tt.res.GetOk() {
  97. t.Error("response: expected", tt.res.GetOk(), "received", response.GetOk())
  98. }
  99. }
  100. if err != nil {
  101. if e, ok := status.FromError(err); ok {
  102. if e.Code() != tt.errCode {
  103. t.Error("error code: expected", codes.InvalidArgument, "received", e.Code())
  104. }
  105. if e.Message() != tt.errMsg {
  106. t.Error("error message: expected", tt.errMsg, "received", e.Message())
  107. }
  108. }
  109. }
  110. })
  111. }
  112. }
  113. }