1 // Copyright 2017 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.
5 // +build darwin dragonfly freebsd linux netbsd openbsd solaris
15 func TestRawConn(t
*testing
.T
) {
16 handler
:= func(ls
*localServer
, ln Listener
) {
24 n
, err
:= c
.Read(b
[:])
29 if _
, err
:= c
.Write(b
[:n
]); err
!= nil {
34 ls
, err
:= newLocalServer("tcp")
39 if err
:= ls
.buildup(handler
); err
!= nil {
43 c
, err
:= Dial(ls
.Listener
.Addr().Network(), ls
.Listener
.Addr().String())
48 cc
, err
:= c
.(*TCPConn
).SyscallConn()
54 data
:= []byte("HELLO-R-U-THERE")
55 err
= cc
.Write(func(s
uintptr) bool {
56 _
, operr
= syscall
.Write(int(s
), data
)
57 if operr
== syscall
.EAGAIN
{
62 if err
!= nil || operr
!= nil {
68 err
= cc
.Read(func(s
uintptr) bool {
69 nr
, operr
= syscall
.Read(int(s
), b
[:])
70 if operr
== syscall
.EAGAIN
{
75 if err
!= nil || operr
!= nil {
78 if bytes
.Compare(b
[:nr
], data
) != 0 {
79 t
.Fatalf("got %#v; want %#v", b
[:nr
], data
)
82 fn
:= func(s
uintptr) {
83 operr
= syscall
.SetsockoptInt(int(s
), syscall
.SOL_SOCKET
, syscall
.SO_REUSEADDR
, 1)
86 if err
!= nil || operr
!= nil {
92 t
.Fatal("should fail")