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
, err
:= newLocalServer("tcp")
72 if err
:= ls
.buildup(handler
); err
!= nil {
76 c
, err
:= Dial(ls
.Listener
.Addr().Network(), ls
.Listener
.Addr().String())
82 cc
, err
:= c
.(*TCPConn
).SyscallConn()
86 data
:= []byte("HELLO-R-U-THERE")
87 if err
:= writeRawConn(cc
, data
); err
!= nil {
91 n
, err
:= readRawConn(cc
, b
[:])
95 if bytes
.Compare(b
[:n
], data
) != 0 {
96 t
.Fatalf("got %q; want %q", b
[:n
], data
)
99 t
.Run("Deadline", func(t
*testing
.T
) {
100 switch runtime
.GOOS
{
102 t
.Skipf("not supported on %s", runtime
.GOOS
)
105 ln
, err
:= newLocalListener("tcp")
111 c
, err
:= Dial(ln
.Addr().Network(), ln
.Addr().String())
117 cc
, err
:= c
.(*TCPConn
).SyscallConn()
123 c
.SetDeadline(noDeadline
)
124 if err
:= c
.SetDeadline(time
.Now().Add(-1)); err
!= nil {
127 if err
= writeRawConn(cc
, b
[:]); err
== nil {
128 t
.Fatal("Write should fail")
130 if perr
:= parseWriteError(err
); perr
!= nil {
133 if nerr
, ok
:= err
.(Error
); !ok ||
!nerr
.Timeout() {
134 t
.Errorf("got %v; want timeout", err
)
136 if _
, err
= readRawConn(cc
, b
[:]); err
== nil {
137 t
.Fatal("Read should fail")
139 if perr
:= parseReadError(err
); perr
!= nil {
142 if nerr
, ok
:= err
.(Error
); !ok ||
!nerr
.Timeout() {
143 t
.Errorf("got %v; want timeout", err
)
146 c
.SetReadDeadline(noDeadline
)
147 if err
:= c
.SetReadDeadline(time
.Now().Add(-1)); err
!= nil {
150 if _
, err
= readRawConn(cc
, b
[:]); err
== nil {
151 t
.Fatal("Read should fail")
153 if perr
:= parseReadError(err
); perr
!= nil {
156 if nerr
, ok
:= err
.(Error
); !ok ||
!nerr
.Timeout() {
157 t
.Errorf("got %v; want timeout", err
)
160 c
.SetWriteDeadline(noDeadline
)
161 if err
:= c
.SetWriteDeadline(time
.Now().Add(-1)); err
!= nil {
164 if err
= writeRawConn(cc
, b
[:]); err
== nil {
165 t
.Fatal("Write should fail")
167 if perr
:= parseWriteError(err
); perr
!= nil {
170 if nerr
, ok
:= err
.(Error
); !ok ||
!nerr
.Timeout() {
171 t
.Errorf("got %v; want timeout", err
)
176 func TestRawConnControl(t
*testing
.T
) {
177 switch runtime
.GOOS
{
178 case "nacl", "plan9":
179 t
.Skipf("not supported on %s", runtime
.GOOS
)
182 t
.Run("TCP", func(t
*testing
.T
) {
183 ln
, err
:= newLocalListener("tcp")
189 cc1
, err
:= ln
.(*TCPListener
).SyscallConn()
193 if err
:= controlRawConn(cc1
, ln
.Addr()); err
!= nil {
197 c
, err
:= Dial(ln
.Addr().Network(), ln
.Addr().String())
203 cc2
, err
:= c
.(*TCPConn
).SyscallConn()
207 if err
:= controlRawConn(cc2
, c
.LocalAddr()); err
!= nil {
212 if err
:= controlRawConn(cc1
, ln
.Addr()); err
== nil {
213 t
.Fatal("Control after Close should fail")
216 if err
:= controlRawConn(cc2
, c
.LocalAddr()); err
== nil {
217 t
.Fatal("Control after Close should fail")