google.golang.org/grpc@v1.62.1/internal/channelz/util_test.go (about)

     1  //go:build linux
     2  // +build linux
     3  
     4  /*
     5   *
     6   * Copyright 2018 gRPC authors.
     7   *
     8   * Licensed under the Apache License, Version 2.0 (the "License");
     9   * you may not use this file except in compliance with the License.
    10   * You may obtain a copy of the License at
    11   *
    12   *     http://www.apache.org/licenses/LICENSE-2.0
    13   *
    14   * Unless required by applicable law or agreed to in writing, software
    15   * distributed under the License is distributed on an "AS IS" BASIS,
    16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    17   * See the License for the specific language governing permissions and
    18   * limitations under the License.
    19   *
    20   */
    21  
    22  package channelz_test
    23  
    24  import (
    25  	"net"
    26  	"reflect"
    27  	"syscall"
    28  	"testing"
    29  
    30  	"golang.org/x/sys/unix"
    31  	"google.golang.org/grpc/internal/channelz"
    32  	"google.golang.org/grpc/internal/grpctest"
    33  )
    34  
    35  type s struct {
    36  	grpctest.Tester
    37  }
    38  
    39  func Test(t *testing.T) {
    40  	grpctest.RunSubTests(t, s{})
    41  }
    42  
    43  func (s) TestGetSocketOpt(t *testing.T) {
    44  	network, addr := "tcp", ":0"
    45  	ln, err := net.Listen(network, addr)
    46  	if err != nil {
    47  		t.Fatalf("net.Listen(%s,%s) failed with err: %v", network, addr, err)
    48  	}
    49  	defer ln.Close()
    50  	go func() {
    51  		ln.Accept()
    52  	}()
    53  	conn, _ := net.Dial(network, ln.Addr().String())
    54  	defer conn.Close()
    55  	tcpc := conn.(*net.TCPConn)
    56  	raw, err := tcpc.SyscallConn()
    57  	if err != nil {
    58  		t.Fatalf("SyscallConn() failed due to %v", err)
    59  	}
    60  
    61  	l := &unix.Linger{Onoff: 1, Linger: 5}
    62  	recvTimout := &unix.Timeval{Sec: 100}
    63  	sendTimeout := &unix.Timeval{Sec: 8888}
    64  	raw.Control(func(fd uintptr) {
    65  		err := unix.SetsockoptLinger(int(fd), syscall.SOL_SOCKET, syscall.SO_LINGER, l)
    66  		if err != nil {
    67  			t.Fatalf("failed to SetsockoptLinger(%v,%v,%v,%v) due to %v", int(fd), syscall.SOL_SOCKET, syscall.SO_LINGER, l, err)
    68  		}
    69  		err = unix.SetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVTIMEO, recvTimout)
    70  		if err != nil {
    71  			t.Fatalf("failed to SetsockoptTimeval(%v,%v,%v,%v) due to %v", int(fd), syscall.SOL_SOCKET, syscall.SO_RCVTIMEO, recvTimout, err)
    72  		}
    73  		err = unix.SetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_SNDTIMEO, sendTimeout)
    74  		if err != nil {
    75  			t.Fatalf("failed to SetsockoptTimeval(%v,%v,%v,%v) due to %v", int(fd), syscall.SOL_SOCKET, syscall.SO_SNDTIMEO, sendTimeout, err)
    76  		}
    77  	})
    78  	sktopt := channelz.GetSocketOption(conn)
    79  	if !reflect.DeepEqual(sktopt.Linger, l) {
    80  		t.Fatalf("get socket option linger, want: %v, got %v", l, sktopt.Linger)
    81  	}
    82  	if !reflect.DeepEqual(sktopt.RecvTimeout, recvTimout) {
    83  		t.Logf("get socket option recv timeout, want: %v, got %v, may be caused by system allowing non or partial setting of this value", recvTimout, sktopt.RecvTimeout)
    84  	}
    85  	if !reflect.DeepEqual(sktopt.SendTimeout, sendTimeout) {
    86  		t.Logf("get socket option send timeout, want: %v, got %v, may be caused by system allowing non or partial setting of this value", sendTimeout, sktopt.SendTimeout)
    87  	}
    88  	if sktopt == nil || sktopt.TCPInfo != nil && sktopt.TCPInfo.State != 1 {
    89  		t.Fatalf("TCPInfo.State want 1 (TCP_ESTABLISHED), got %v", sktopt)
    90  	}
    91  
    92  	sktopt = channelz.GetSocketOption(ln)
    93  	if sktopt == nil || sktopt.TCPInfo == nil || sktopt.TCPInfo.State != 10 {
    94  		t.Fatalf("TCPInfo.State want 10 (TCP_LISTEN), got %v", sktopt)
    95  	}
    96  }