google.golang.org/grpc@v1.72.2/internal/channelz/syscall_test.go (about) 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 }