github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/socket/sockets_test.go (about)

     1  package socket_test
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  	"google.golang.org/grpc"
    13  
    14  	"github.com/datawire/dlib/dgroup"
    15  	"github.com/datawire/dlib/dhttp"
    16  	"github.com/datawire/dlib/dlog"
    17  	"github.com/telepresenceio/telepresence/v2/pkg/client/socket"
    18  )
    19  
    20  func TestDialSocket(t *testing.T) {
    21  	t.Run("OK", func(t *testing.T) {
    22  		sockname := filepath.Join(t.TempDir(), "ok.sock")
    23  		listener, err := net.Listen("unix", sockname)
    24  		if !assert.NoError(t, err) {
    25  			return
    26  		}
    27  		defer listener.Close()
    28  
    29  		ctx := dlog.NewTestContext(t, false)
    30  		grp := dgroup.NewGroup(ctx, dgroup.GroupConfig{
    31  			EnableWithSoftness: true,
    32  			ShutdownOnNonError: true,
    33  			DisableLogging:     true,
    34  		})
    35  
    36  		grp.Go("server", func(ctx context.Context) error {
    37  			sc := &dhttp.ServerConfig{
    38  				Handler: grpc.NewServer(),
    39  			}
    40  			return sc.Serve(ctx, listener)
    41  		})
    42  
    43  		grp.Go("client", func(ctx context.Context) error {
    44  			conn, err := socket.Dial(ctx, sockname)
    45  			assert.NoError(t, err)
    46  			if assert.NotNil(t, conn) {
    47  				assert.NoError(t, conn.Close())
    48  			}
    49  			return nil
    50  		})
    51  
    52  		assert.NoError(t, grp.Wait())
    53  	})
    54  	t.Run("Hang", func(t *testing.T) {
    55  		sockname := filepath.Join(t.TempDir(), "hang.sock")
    56  		listener, err := net.Listen("unix", sockname)
    57  		if !assert.NoError(t, err) {
    58  			return
    59  		}
    60  		defer listener.Close()
    61  
    62  		ctx := dlog.NewTestContext(t, false)
    63  		conn, err := socket.Dial(ctx, sockname)
    64  		assert.Nil(t, conn)
    65  		assert.Error(t, err)
    66  		t.Log(err)
    67  		assert.ErrorIs(t, err, context.DeadlineExceeded)
    68  		assert.Contains(t, err.Error(), "dial unix "+sockname)
    69  		assert.Contains(t, err.Error(), "this usually means that the process has locked up")
    70  	})
    71  	t.Run("Orphan", func(t *testing.T) {
    72  		sockname := filepath.Join(t.TempDir(), "orphan.sock")
    73  		listener, err := net.Listen("unix", sockname)
    74  		if !assert.NoError(t, err) {
    75  			return
    76  		}
    77  		listener.(*net.UnixListener).SetUnlinkOnClose(false)
    78  		listener.Close()
    79  
    80  		ctx := dlog.NewTestContext(t, false)
    81  		conn, err := socket.Dial(ctx, sockname)
    82  		assert.Nil(t, conn)
    83  		require.Error(t, err)
    84  		t.Log(err)
    85  		assert.ErrorIs(t, err, os.ErrNotExist)
    86  		assert.Contains(t, err.Error(), "dial unix "+sockname)
    87  		assert.Contains(t, err.Error(), "this usually means that the process is not running")
    88  	})
    89  	t.Run("NotExist", func(t *testing.T) {
    90  		ctx := dlog.NewTestContext(t, false)
    91  		sockname := filepath.Join(t.TempDir(), "not-exist.sock")
    92  		conn, err := socket.Dial(ctx, sockname)
    93  		assert.Nil(t, conn)
    94  		assert.Error(t, err)
    95  		t.Log(err)
    96  		assert.ErrorIs(t, err, os.ErrNotExist)
    97  		assert.Contains(t, err.Error(), "dial unix "+sockname)
    98  		assert.Contains(t, err.Error(), "this usually means that the process is not running")
    99  	})
   100  }