gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/server/rpc_codec_test.go (about)

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"testing"
     7  
     8  	"gitee.com/liuxuezhan/go-micro-v1.18.0/codec"
     9  	"gitee.com/liuxuezhan/go-micro-v1.18.0/transport"
    10  )
    11  
    12  // testCodec is a dummy codec that only knows how to encode nil bodies
    13  type testCodec struct {
    14  	buf *bytes.Buffer
    15  }
    16  
    17  type testSocket struct {
    18  	local  string
    19  	remote string
    20  }
    21  
    22  // TestCodecWriteError simulates what happens when a codec is unable
    23  // to encode a message (e.g. a missing branch of an "oneof" message in
    24  // protobufs)
    25  //
    26  // We expect an error to be sent to the socket. Previously the socket
    27  // would remain open with no bytes sent, leading to client-side
    28  // timeouts.
    29  func TestCodecWriteError(t *testing.T) {
    30  	socket := testSocket{}
    31  	message := transport.Message{
    32  		Header: map[string]string{},
    33  		Body:   []byte{},
    34  	}
    35  
    36  	rwc := readWriteCloser{
    37  		rbuf: new(bytes.Buffer),
    38  		wbuf: new(bytes.Buffer),
    39  	}
    40  
    41  	c := rpcCodec{
    42  		buf: &rwc,
    43  		codec: &testCodec{
    44  			buf: rwc.wbuf,
    45  		},
    46  		req:    &message,
    47  		socket: socket,
    48  	}
    49  
    50  	err := c.Write(&codec.Message{
    51  		Endpoint: "Service.Endpoint",
    52  		Id:       "0",
    53  		Error:    "",
    54  	}, "body")
    55  
    56  	if err != nil {
    57  		t.Fatalf(`Expected Write to fail; got "%+v" instead`, err)
    58  	}
    59  
    60  	const expectedError = "Unable to encode body: simulating a codec write failure"
    61  	actualError := rwc.wbuf.String()
    62  	if actualError != expectedError {
    63  		t.Fatalf(`Expected error "%+v" in the write buffer, got "%+v" instead`, expectedError, actualError)
    64  	}
    65  }
    66  
    67  func (c *testCodec) ReadHeader(message *codec.Message, typ codec.MessageType) error {
    68  	return nil
    69  }
    70  
    71  func (c *testCodec) ReadBody(dest interface{}) error {
    72  	return nil
    73  }
    74  
    75  func (c *testCodec) Write(message *codec.Message, dest interface{}) error {
    76  	if dest != nil {
    77  		return errors.New("simulating a codec write failure")
    78  	}
    79  	c.buf.Write([]byte(message.Error))
    80  	return nil
    81  }
    82  
    83  func (c *testCodec) Close() error {
    84  	return nil
    85  }
    86  
    87  func (c *testCodec) String() string {
    88  	return "string"
    89  }
    90  
    91  func (s testSocket) Local() string {
    92  	return s.local
    93  }
    94  
    95  func (s testSocket) Remote() string {
    96  	return s.remote
    97  }
    98  
    99  func (s testSocket) Recv(message *transport.Message) error {
   100  	return nil
   101  }
   102  
   103  func (s testSocket) Send(message *transport.Message) error {
   104  	return nil
   105  }
   106  
   107  func (s testSocket) Close() error {
   108  	return nil
   109  }