/* * * Copyright 2022 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package testutils import ( "net" "testing" ) // ConnWrapper wraps a net.Conn and pushes on a channel when closed. type ConnWrapper struct { net.Conn CloseCh *Channel } // Close closes the connection and sends a value on the close channel. func (cw *ConnWrapper) Close() error { err := cw.Conn.Close() cw.CloseCh.Replace(nil) return err } // ListenerWrapper wraps a net.Listener and the returned net.Conn. // // It pushes on a channel whenever it accepts a new connection. type ListenerWrapper struct { net.Listener NewConnCh *Channel } // Accept wraps the Listener Accept and sends the accepted connection on a // channel. func (l *ListenerWrapper) Accept() (net.Conn, error) { c, err := l.Listener.Accept() if err != nil { return nil, err } closeCh := NewChannel() conn := &ConnWrapper{Conn: c, CloseCh: closeCh} l.NewConnCh.Send(conn) return conn, nil } // NewListenerWrapper returns a ListenerWrapper. func NewListenerWrapper(t *testing.T, lis net.Listener) *ListenerWrapper { if lis == nil { var err error lis, err = LocalTCPListener() if err != nil { t.Fatal(err) } } return &ListenerWrapper{ Listener: lis, NewConnCh: NewChannel(), } }