1 // Copyright 2018 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
16 func TestRawConnReadWrite(t
*testing
.T
) {
19 t
.Skipf("not supported on %s", runtime
.GOOS
)
22 t
.Run("TCP", func(t
*testing
.T
) {
23 handler
:= func(ls
*localServer
, ln Listener
) {
31 cc
, err
:= ln
.(*TCPListener
).SyscallConn()
36 op
:= func(uintptr) bool {
42 t
.Error("Write should return an error")
45 t
.Error("Write shouldn't call op")
50 t
.Error("Read should return an error")
53 t
.Error("Read shouldn't call op")
57 n
, err
:= c
.Read(b
[:])
62 if _
, err
:= c
.Write(b
[:n
]); err
!= nil {
67 ls
:= newLocalServer(t
, "tcp")
69 if err
:= ls
.buildup(handler
); err
!= nil {
73 c
, err
:= Dial(ls
.Listener
.Addr().Network(), ls
.Listener
.Addr().String())
79 cc
, err
:= c
.(*TCPConn
).SyscallConn()
83 data
:= []byte("HELLO-R-U-THERE")
84 if err
:= writeRawConn(cc
, data
); err
!= nil {
88 n
, err
:= readRawConn(cc
, b
[:])
92 if bytes
.Compare(b
[:n
], data
) != 0 {
93 t
.Fatalf("got %q; want %q", b
[:n
], data
)
96 t
.Run("Deadline", func(t
*testing
.T
) {
99 t
.Skipf("not supported on %s", runtime
.GOOS
)
102 ln
:= newLocalListener(t
, "tcp")
105 c
, err
:= Dial(ln
.Addr().Network(), ln
.Addr().String())
111 cc
, err
:= c
.(*TCPConn
).SyscallConn()
117 c
.SetDeadline(noDeadline
)
118 if err
:= c
.SetDeadline(time
.Now().Add(-1)); err
!= nil {
121 if err
= writeRawConn(cc
, b
[:]); err
== nil {
122 t
.Fatal("Write should fail")
124 if perr
:= parseWriteError(err
); perr
!= nil {
127 if !isDeadlineExceeded(err
) {
128 t
.Errorf("got %v; want timeout", err
)
130 if _
, err
= readRawConn(cc
, b
[:]); err
== nil {
131 t
.Fatal("Read should fail")
133 if perr
:= parseReadError(err
); perr
!= nil {
136 if !isDeadlineExceeded(err
) {
137 t
.Errorf("got %v; want timeout", err
)
140 c
.SetReadDeadline(noDeadline
)
141 if err
:= c
.SetReadDeadline(time
.Now().Add(-1)); err
!= nil {
144 if _
, err
= readRawConn(cc
, b
[:]); err
== nil {
145 t
.Fatal("Read should fail")
147 if perr
:= parseReadError(err
); perr
!= nil {
150 if !isDeadlineExceeded(err
) {
151 t
.Errorf("got %v; want timeout", err
)
154 c
.SetWriteDeadline(noDeadline
)
155 if err
:= c
.SetWriteDeadline(time
.Now().Add(-1)); err
!= nil {
158 if err
= writeRawConn(cc
, b
[:]); err
== nil {
159 t
.Fatal("Write should fail")
161 if perr
:= parseWriteError(err
); perr
!= nil {
164 if !isDeadlineExceeded(err
) {
165 t
.Errorf("got %v; want timeout", err
)
170 func TestRawConnControl(t
*testing
.T
) {
171 switch runtime
.GOOS
{
173 t
.Skipf("not supported on %s", runtime
.GOOS
)
176 t
.Run("TCP", func(t
*testing
.T
) {
177 ln
:= newLocalListener(t
, "tcp")
180 cc1
, err
:= ln
.(*TCPListener
).SyscallConn()
184 if err
:= controlRawConn(cc1
, ln
.Addr()); err
!= nil {
188 c
, err
:= Dial(ln
.Addr().Network(), ln
.Addr().String())
194 cc2
, err
:= c
.(*TCPConn
).SyscallConn()
198 if err
:= controlRawConn(cc2
, c
.LocalAddr()); err
!= nil {
203 if err
:= controlRawConn(cc1
, ln
.Addr()); err
== nil {
204 t
.Fatal("Control after Close should fail")
207 if err
:= controlRawConn(cc2
, c
.LocalAddr()); err
== nil {
208 t
.Fatal("Control after Close should fail")