go.uber.org/yarpc@v1.72.1/api/transport/stream_test.go (about) 1 // Copyright (c) 2022 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package transport_test 22 23 import ( 24 "testing" 25 26 "github.com/golang/mock/gomock" 27 "github.com/stretchr/testify/assert" 28 "github.com/stretchr/testify/require" 29 "go.uber.org/yarpc/api/transport" 30 "go.uber.org/yarpc/api/transport/transporttest" 31 ) 32 33 func TestServerStreamHeaders(t *testing.T) { 34 items := map[string]string{"header-key": "header-value"} 35 headers := transport.HeadersFromMap(items) 36 37 mockCtrl := gomock.NewController(t) 38 defer mockCtrl.Finish() 39 mockStream := transporttest.NewMockStream(mockCtrl) 40 41 t.Run("unimplemented", func(t *testing.T) { 42 serverStream, err := transport.NewServerStream(mockStream) 43 require.NoError(t, err) 44 45 err = serverStream.SendHeaders(headers) 46 assert.Error(t, err) 47 }) 48 49 t.Run("send-headers", func(t *testing.T) { 50 fakeWriter := &fakeWriter{ 51 Stream: mockStream, 52 } 53 serverStream, err := transport.NewServerStream(fakeWriter) 54 require.NoError(t, err) 55 56 err = serverStream.SendHeaders(headers) 57 assert.NoError(t, err) 58 assert.Equal(t, items, fakeWriter.headers.Items()) 59 }) 60 } 61 62 var _ transport.StreamHeadersSender = (*fakeWriter)(nil) 63 64 type fakeWriter struct { 65 transport.Stream 66 67 headers transport.Headers 68 } 69 70 func (fw *fakeWriter) SendHeaders(headers transport.Headers) error { 71 fw.headers = headers 72 return nil 73 } 74 75 func TestClientStreamHeaders(t *testing.T) { 76 items := map[string]string{"header-key": "header-value"} 77 headers := transport.HeadersFromMap(items) 78 79 mockCtrl := gomock.NewController(t) 80 defer mockCtrl.Finish() 81 mockStream := transporttest.NewMockStreamCloser(mockCtrl) 82 83 t.Run("unimplemented", func(t *testing.T) { 84 clientStream, err := transport.NewClientStream(mockStream) 85 require.NoError(t, err) 86 87 _, err = clientStream.Headers() 88 assert.Error(t, err) 89 }) 90 91 t.Run("send-headers", func(t *testing.T) { 92 fakeReader := &fakeReader{ 93 StreamCloser: mockStream, 94 headers: headers, 95 } 96 clientStream, err := transport.NewClientStream(fakeReader) 97 require.NoError(t, err) 98 99 headers, err = clientStream.Headers() 100 assert.NoError(t, err) 101 assert.Equal(t, items, fakeReader.headers.Items()) 102 }) 103 } 104 105 var _ transport.StreamHeadersReader = (*fakeReader)(nil) 106 107 type fakeReader struct { 108 transport.StreamCloser 109 110 headers transport.Headers 111 } 112 113 func (fr *fakeReader) Headers() (transport.Headers, error) { 114 return fr.headers, nil 115 }