57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
|
//go:build linux || freebsd || openbsd || darwin
|
||
|
|
||
|
package server
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
"github.com/traefik/traefik/v3/pkg/config/static"
|
||
|
)
|
||
|
|
||
|
func TestNewListenConfig(t *testing.T) {
|
||
|
ep := static.EntryPoint{Address: ":0"}
|
||
|
listenConfig := newListenConfig(&ep)
|
||
|
require.Nil(t, listenConfig.Control)
|
||
|
require.Zero(t, listenConfig.KeepAlive)
|
||
|
|
||
|
l1, err := listenConfig.Listen(context.Background(), "tcp", ep.Address)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, l1)
|
||
|
defer l1.Close()
|
||
|
|
||
|
l2, err := listenConfig.Listen(context.Background(), "tcp", l1.Addr().String())
|
||
|
require.Error(t, err)
|
||
|
require.ErrorContains(t, err, "address already in use")
|
||
|
require.Nil(t, l2)
|
||
|
|
||
|
ep = static.EntryPoint{Address: ":0", ReusePort: true}
|
||
|
listenConfig = newListenConfig(&ep)
|
||
|
require.NotNil(t, listenConfig.Control)
|
||
|
require.Zero(t, listenConfig.KeepAlive)
|
||
|
|
||
|
l3, err := listenConfig.Listen(context.Background(), "tcp", ep.Address)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, l3)
|
||
|
defer l3.Close()
|
||
|
|
||
|
l4, err := listenConfig.Listen(context.Background(), "tcp", l3.Addr().String())
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, l4)
|
||
|
defer l4.Close()
|
||
|
|
||
|
_, l3Port, err := net.SplitHostPort(l3.Addr().String())
|
||
|
require.NoError(t, err)
|
||
|
l5, err := listenConfig.Listen(context.Background(), "tcp", "127.0.0.1:"+l3Port)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, l5)
|
||
|
defer l5.Close()
|
||
|
|
||
|
l6, err := listenConfig.Listen(context.Background(), "tcp", l1.Addr().String())
|
||
|
require.Error(t, err)
|
||
|
require.ErrorContains(t, err, "address already in use")
|
||
|
require.Nil(t, l6)
|
||
|
}
|