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 }