...

Source file src/github.com/cybertec-postgresql/pgwatch/v6/internal/testutil/blackhole_test.go

Documentation: github.com/cybertec-postgresql/pgwatch/v6/internal/testutil

     1  package testutil_test
     2  
     3  import (
     4  	"net"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/cybertec-postgresql/pgwatch/v6/internal/testutil"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  // TestBlackholeListener asserts the half-open peer contract:
    14  // - the listener accepts TCP connections,
    15  // - it never writes or reads from them, so a client Read times out,
    16  // - the returned close func is safe to call while a connection is held,
    17  // - calling the close func twice is a documented no-op.
    18  func TestBlackholeListener(t *testing.T) {
    19  	addr, closeFn := testutil.BlackholeListener(t)
    20  	require.NotEmpty(t, addr)
    21  
    22  	conn, err := net.DialTimeout("tcp", addr, time.Second)
    23  	require.NoError(t, err)
    24  	defer func() { _ = conn.Close() }()
    25  
    26  	// Exercise the accept loop and the per-connection holder goroutine
    27  	// by reading; the peer never responds, so the deadline must fire.
    28  	require.NoError(t, conn.SetReadDeadline(time.Now().Add(100*time.Millisecond)))
    29  	_, err = conn.Read(make([]byte, 1))
    30  	var netErr net.Error
    31  	require.ErrorAs(t, err, &netErr)
    32  	assert.True(t, netErr.Timeout())
    33  
    34  	// Early close while a holder goroutine is still parked on <-ctx.Done();
    35  	// second call is idempotent.
    36  	closeFn()
    37  	closeFn()
    38  }
    39