在Go语言中测试GRPC流式发送函数

huangapple go评论118阅读模式
英文:

Testing around GRPC stream Send function in Go

问题

我有一个Go GRPC服务器端流式传输函数:

  1. func (server *Server) GetClients(req *iam.GetClientsRequest, client iam.IAM_GetClientsServer) error {
  2. ctx := client.(interface{ Context() context.Context }).Context()
  3. userID, err := getUserIDStream(client)
  4. if err != nil {
  5. return err
  6. }
  7. clients, err := server.db.QueryByUserID(ctx, userID)
  8. if err != nil {
  9. return grpc.Errorf(codes.Internal, apiutils.ServerError)
  10. }
  11. for _, value := range clients {
  12. converted, err := server.fromInternalClient(value)
  13. if err != nil {
  14. return err
  15. }
  16. if err := client.Send(converted); err != nil {
  17. return err
  18. }
  19. }
  20. return nil
  21. }

我这样测试它:

  1. It("GetClients - Send fails - Error", func() {
  2. handler := createHandler(db)
  3. lis := bufconn.Listen(bufSize)
  4. server := grpc.NewServer()
  5. iam.RegisterIAMServer(server, NewServer(handler))
  6. go func() {
  7. if err := server.Serve(lis); err != nil {
  8. log.Fatalf("Server exited with error: %v", err)
  9. }
  10. }()
  11. defer lis.Close()
  12. defer server.GracefulStop()
  13. conn, err := grpc.DialContext(context.Background(), "bufnet",
  14. grpc.WithContextDialer(createBufDialier(lis)), grpc.WithInsecure())
  15. Expect(err).ShouldNot(HaveOccurred())
  16. defer conn.Close()
  17. client := iam.NewIAMClient(conn)
  18. cclient, _ := client.GetClients(addAccessToken(context.Background()), new(iam.GetClientsRequest))
  19. resp, err := cclient.Recv()
  20. Expect(resp).Should(BeNil())
  21. Expect(err).Should(HaveOccurred())
  22. Expect(err.Error()).Should(Equal(message))
  23. })

我的问题是,我不确定如何在Send上引发失败,以便我可以测试响应。由于我正在使用实际的测试服务器和客户端,我不能只是模拟对象,而且我也不想走这条路。有没有办法可以做到这一点?

英文:

I have a Go GRPC server-side streaming function:

  1. func (server *Server) GetClients(req *iam.GetClientsRequest, client iam.IAM_GetClientsServer) error {
  2. ctx := client.(interface{ Context() context.Context }).Context()
  3. userID, err := getUserIDStream(client)
  4. if err != nil {
  5. return err
  6. }
  7. clients, err := server.db.QueryByUserID(ctx, userID)
  8. if err != nil {
  9. return grpc.Errorf(codes.Internal, apiutils.ServerError)
  10. }
  11. for _, value := range clients {
  12. converted, err := server.fromInternalClient(value)
  13. if err != nil {
  14. return err
  15. }
  16. if err := client.Send(converted); err != nil {
  17. return err
  18. }
  19. }
  20. return nil
  21. }

and I'm testing it like this:

  1. It("GetClients - Send fails - Error", func() {
  2. handler := createHandler(db)
  3. lis := bufconn.Listen(bufSize)
  4. server := grpc.NewServer()
  5. iam.RegisterIAMServer(server, NewServer(handler))
  6. go func() {
  7. if err := server.Serve(lis); err != nil {
  8. log.Fatalf("Server exited with error: %v", err)
  9. }
  10. }()
  11. defer lis.Close()
  12. defer server.GracefulStop()
  13. conn, err := grpc.DialContext(context.Background(), "bufnet",
  14. grpc.WithContextDialer(createBufDialier(lis)), grpc.WithInsecure())
  15. Expect(err).ShouldNot(HaveOccurred())
  16. defer conn.Close()
  17. client := iam.NewIAMClient(conn)
  18. cclient, _ := client.GetClients(addAccessToken(context.Background()), new(iam.GetClientsRequest))
  19. resp, err := cclient.Recv()
  20. Expect(resp).Should(BeNil())
  21. Expect(err).Should(HaveOccurred())
  22. Expect(err.Error()).Should(Equal(message))
  23. })

My issue is that I'm not sure how to induce a failure on Send so I can test the response. Since I'm using an actual test server and client, I can't just mock out the object and I'd prefer not to go that route anyway. Is there a way I can do this?

答案1

得分: 0

最初,我试图通过将bufSize设置为一个人为较低的值来强制Send失败。然而,这并没有产生错误,所以我决定尝试修改服务器上的maxSendMessageSize

  1. opts := []grpc.ServerOption{}
  2. if sendFails {
  3. opts = append(opts, grpc.MaxSendMsgSize(10))
  4. }
  5. lis := bufconn.Listen(bufSize)
  6. server := grpc.NewServer(opts...)

这样做确实导致了错误的发生。

英文:

Originally, I was trying to force Send to fail by setting bufSize to an artificially low value. However, this wasn't producing an error so I decided to try modifying the maxSendMessageSize on the server:

  1. opts := []grpc.ServerOption{}
  2. if sendFails {
  3. opts = append(opts, grpc.MaxSendMsgSize(10))
  4. }
  5. lis := bufconn.Listen(bufSize)
  6. server := grpc.NewServer(opts...)

And this worked in producing the error.

huangapple
  • 本文由 发表于 2022年10月21日 17:31:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/74151616.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定