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 }