github.com/cloudwego/kitex@v0.9.0/pkg/remote/trans/netpoll/server_handler_test.go (about) 1 /* 2 * Copyright 2021 CloudWeGo Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package netpoll 18 19 import ( 20 "context" 21 "errors" 22 "net" 23 "testing" 24 25 "github.com/cloudwego/netpoll" 26 27 "github.com/cloudwego/kitex/internal/mocks" 28 "github.com/cloudwego/kitex/internal/test" 29 "github.com/cloudwego/kitex/pkg/remote" 30 ) 31 32 // TestOnActive test server_handler OnActive success 33 func TestOnActive(t *testing.T) { 34 // 1. prepare mock data 35 conn := &MockNetpollConn{ 36 Conn: mocks.Conn{ 37 RemoteAddrFunc: func() (r net.Addr) { 38 return addr 39 }, 40 }, 41 ReaderFunc: func() (r netpoll.Reader) { 42 reader := &MockNetpollReader{ 43 ReleaseFunc: func() (err error) { 44 return nil 45 }, 46 } 47 return reader 48 }, 49 WriterFunc: func() (r netpoll.Writer) { 50 writer := &MockNetpollWriter{ 51 FlushFunc: func() (err error) { 52 return nil 53 }, 54 } 55 return writer 56 }, 57 } 58 ctx := context.Background() 59 remote.NewTransPipeline(svrTransHdlr) 60 _, err := svrTransHdlr.OnActive(ctx, conn) 61 test.Assert(t, err == nil, err) 62 } 63 64 // TestOnRead test server_handler OnRead success 65 func TestOnRead(t *testing.T) { 66 // 1. prepare mock data 67 var isWriteBufFlushed bool 68 var isReaderBufReleased bool 69 var isInvoked bool 70 conn := &MockNetpollConn{ 71 Conn: mocks.Conn{ 72 RemoteAddrFunc: func() (r net.Addr) { 73 return addr 74 }, 75 }, 76 ReaderFunc: func() (r netpoll.Reader) { 77 reader := &MockNetpollReader{ 78 ReleaseFunc: func() (err error) { 79 isReaderBufReleased = true 80 return nil 81 }, 82 } 83 return reader 84 }, 85 WriterFunc: func() (r netpoll.Writer) { 86 writer := &MockNetpollWriter{ 87 FlushFunc: func() (err error) { 88 isWriteBufFlushed = true 89 return nil 90 }, 91 } 92 return writer 93 }, 94 } 95 96 if setter, ok := svrTransHdlr.(remote.InvokeHandleFuncSetter); ok { 97 setter.SetInvokeHandleFunc(func(ctx context.Context, req, resp interface{}) (err error) { 98 isInvoked = true 99 return nil 100 }) 101 } 102 remote.NewTransPipeline(svrTransHdlr) 103 104 // 2. test 105 ctx := context.Background() 106 ctx, err := svrTransHdlr.OnActive(ctx, conn) 107 test.Assert(t, err == nil, err) 108 109 err = svrTransHdlr.OnRead(ctx, conn) 110 test.Assert(t, err == nil, err) 111 test.Assert(t, isReaderBufReleased) 112 test.Assert(t, isWriteBufFlushed) 113 test.Assert(t, isInvoked) 114 } 115 116 // TestInvokeErr test server_handler invoke err 117 func TestInvokeErr(t *testing.T) { 118 // 1. prepare mock data 119 var isWriteBufFlushed bool 120 var isReaderBufReleased bool 121 var isInvoked bool 122 conn := &MockNetpollConn{ 123 Conn: mocks.Conn{ 124 RemoteAddrFunc: func() (r net.Addr) { 125 return addr 126 }, 127 CloseFunc: func() (e error) { 128 return nil 129 }, 130 }, 131 ReaderFunc: func() (r netpoll.Reader) { 132 reader := &MockNetpollReader{ 133 ReleaseFunc: func() (err error) { 134 isReaderBufReleased = true 135 return nil 136 }, 137 } 138 return reader 139 }, 140 WriterFunc: func() (r netpoll.Writer) { 141 writer := &MockNetpollWriter{ 142 FlushFunc: func() (err error) { 143 isWriteBufFlushed = true 144 return nil 145 }, 146 } 147 return writer 148 }, 149 IsActiveFunc: func() (r bool) { 150 return true 151 }, 152 } 153 remote.NewTransPipeline(svrTransHdlr) 154 155 // mock invoke err 156 if setter, ok := svrTransHdlr.(remote.InvokeHandleFuncSetter); ok { 157 setter.SetInvokeHandleFunc(func(ctx context.Context, req, resp interface{}) (err error) { 158 isInvoked = true 159 return errors.New("mock invoke test") 160 }) 161 } 162 163 // 2. test 164 ctx := context.Background() 165 ctx, err := svrTransHdlr.OnActive(ctx, conn) 166 test.Assert(t, err == nil, err) 167 168 err = svrTransHdlr.OnRead(ctx, conn) 169 test.Assert(t, err == nil, err) 170 test.Assert(t, isReaderBufReleased) 171 test.Assert(t, isWriteBufFlushed) 172 test.Assert(t, isInvoked) 173 } 174 175 // TestPanicAfterRead test server_handler not panic after read 176 func TestPanicAfterRead(t *testing.T) { 177 // 1. prepare mock data 178 var isWriteBufFlushed bool 179 var isReaderBufReleased bool 180 var isInvoked bool 181 var isClosed bool 182 conn := &MockNetpollConn{ 183 Conn: mocks.Conn{ 184 RemoteAddrFunc: func() (r net.Addr) { 185 return addr 186 }, 187 CloseFunc: func() (e error) { 188 isClosed = true 189 return nil 190 }, 191 }, 192 ReaderFunc: func() (r netpoll.Reader) { 193 reader := &MockNetpollReader{ 194 ReleaseFunc: func() (err error) { 195 isReaderBufReleased = true 196 return nil 197 }, 198 } 199 return reader 200 }, 201 WriterFunc: func() (r netpoll.Writer) { 202 writer := &MockNetpollWriter{ 203 FlushFunc: func() (err error) { 204 isWriteBufFlushed = true 205 return nil 206 }, 207 } 208 return writer 209 }, 210 IsActiveFunc: func() (r bool) { 211 return true 212 }, 213 } 214 // pipeline nil panic 215 svrTransHdlr.SetPipeline(nil) 216 217 // 2. test 218 ctx := context.Background() 219 ctx, err := svrTransHdlr.OnActive(ctx, conn) 220 test.Assert(t, err == nil, err) 221 222 err = svrTransHdlr.OnRead(ctx, conn) 223 test.Assert(t, err != nil, err) 224 test.Assert(t, !isReaderBufReleased) 225 test.Assert(t, !isWriteBufFlushed) 226 test.Assert(t, !isInvoked) 227 test.Assert(t, !isClosed) 228 } 229 230 // TestNoMethodInfo test server_handler without method info success 231 func TestNoMethodInfo(t *testing.T) { 232 // 1. prepare mock data 233 var isWriteBufFlushed bool 234 var isReaderBufReleased bool 235 var isClosed bool 236 conn := &MockNetpollConn{ 237 Conn: mocks.Conn{ 238 RemoteAddrFunc: func() (r net.Addr) { 239 return addr 240 }, 241 CloseFunc: func() (e error) { 242 isClosed = true 243 return nil 244 }, 245 }, 246 ReaderFunc: func() (r netpoll.Reader) { 247 reader := &MockNetpollReader{ 248 ReleaseFunc: func() (err error) { 249 isReaderBufReleased = true 250 return nil 251 }, 252 } 253 return reader 254 }, 255 WriterFunc: func() (r netpoll.Writer) { 256 writer := &MockNetpollWriter{ 257 FlushFunc: func() (err error) { 258 isWriteBufFlushed = true 259 return nil 260 }, 261 } 262 return writer 263 }, 264 IsActiveFunc: func() (r bool) { 265 return true 266 }, 267 } 268 remote.NewTransPipeline(svrTransHdlr) 269 svcInfo := svrOpt.TargetSvcInfo 270 delete(svcInfo.Methods, method) 271 272 // 2. test 273 ctx := context.Background() 274 ctx, err := svrTransHdlr.OnActive(ctx, conn) 275 test.Assert(t, err == nil, err) 276 277 err = svrTransHdlr.OnRead(ctx, conn) 278 test.Assert(t, err != nil, err) 279 test.Assert(t, isReaderBufReleased) 280 test.Assert(t, isWriteBufFlushed) 281 test.Assert(t, !isClosed) 282 }