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  }