Files
buildx/commands/dial_stdio_test.go

57 lines
1011 B
Go

package commands
import (
"bytes"
"context"
"io"
"net"
"sync"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestProxyConnRemoteClose(t *testing.T) {
clientConn, serverConn := net.Pipe()
defer serverConn.Close()
stdin := &blockingReader{waitCh: make(chan struct{})}
defer stdin.Close()
var stdout bytes.Buffer
errCh := make(chan error, 1)
go func() {
errCh <- proxyConn(context.Background(), clientConn, stdin, &stdout)
}()
go func() {
_, _ = serverConn.Write([]byte("hello"))
_ = serverConn.Close()
}()
select {
case err := <-errCh:
require.NoError(t, err)
require.Equal(t, "hello", stdout.String())
case <-time.After(2 * time.Second):
t.Fatal("proxyConn did not return after the remote side closed")
}
}
type blockingReader struct {
waitCh chan struct{}
closeOnce sync.Once
}
func (r *blockingReader) Read([]byte) (int, error) {
<-r.waitCh
return 0, io.EOF
}
func (r *blockingReader) Close() {
r.closeOnce.Do(func() {
close(r.waitCh)
})
}