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 }