1
2
3
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