...

Source file src/google.golang.org/grpc/internal/channelz/syscall_test.go

Documentation: google.golang.org/grpc/internal/channelz

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

View as plain text