uquic/sys_conn_helper_linux_test.go

79 lines
2.1 KiB
Go

//go:build linux
package quic
import (
"errors"
"net"
"os"
"testing"
"golang.org/x/sys/unix"
"github.com/stretchr/testify/require"
)
var (
errGSO = &os.SyscallError{Err: unix.EIO}
errNotPermitted = &os.SyscallError{Syscall: "sendmsg", Err: unix.EPERM}
)
func TestForcingReceiveBufferSize(t *testing.T) {
if os.Getuid() != 0 {
t.Skip("Must be root to force change the receive buffer size")
}
c, err := net.ListenPacket("udp", "127.0.0.1:0")
require.NoError(t, err)
defer c.Close()
syscallConn, err := c.(*net.UDPConn).SyscallConn()
require.NoError(t, err)
const small = 256 << 10 // 256 KB
require.NoError(t, forceSetReceiveBuffer(syscallConn, small))
size, err := inspectReadBuffer(syscallConn)
require.NoError(t, err)
// the kernel doubles this value (to allow space for bookkeeping overhead)
require.Equal(t, 2*small, size)
const large = 32 << 20 // 32 MB
require.NoError(t, forceSetReceiveBuffer(syscallConn, large))
size, err = inspectReadBuffer(syscallConn)
require.NoError(t, err)
// the kernel doubles this value (to allow space for bookkeeping overhead)
require.Equal(t, 2*large, size)
}
func TestForcingSendBufferSize(t *testing.T) {
if os.Getuid() != 0 {
t.Skip("Must be root to force change the send buffer size")
}
c, err := net.ListenPacket("udp", "127.0.0.1:0")
require.NoError(t, err)
defer c.Close()
syscallConn, err := c.(*net.UDPConn).SyscallConn()
require.NoError(t, err)
const small = 256 << 10 // 256 KB
require.NoError(t, forceSetSendBuffer(syscallConn, small))
size, err := inspectWriteBuffer(syscallConn)
require.NoError(t, err)
// the kernel doubles this value (to allow space for bookkeeping overhead)
require.Equal(t, 2*small, size)
const large = 32 << 20 // 32 MB
require.NoError(t, forceSetSendBuffer(syscallConn, large))
size, err = inspectWriteBuffer(syscallConn)
require.NoError(t, err)
// the kernel doubles this value (to allow space for bookkeeping overhead)
require.Equal(t, 2*large, size)
}
func TestGSOError(t *testing.T) {
require.True(t, isGSOError(errGSO))
require.False(t, isGSOError(nil))
require.False(t, isGSOError(errors.New("test")))
}