diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ad93c14a --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,5 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + } +} diff --git a/client.go b/client.go index a6a9ffa2..620cc7ba 100644 --- a/client.go +++ b/client.go @@ -557,7 +557,9 @@ func (c *Client) Start() (addr net.Addr, err error) { cmd := c.config.Cmd cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, env...) - cmd.Stdin = os.Stdin + if cmd.Stdin == nil { + cmd.Stdin = os.Stdin + } cmdStdout, err := cmd.StdoutPipe() if err != nil { diff --git a/client_test.go b/client_test.go index 38dadfe3..f58dc016 100644 --- a/client_test.go +++ b/client_test.go @@ -819,7 +819,34 @@ func TestClient_Stdin(t *testing.T) { t.Fatal("process didn't exit cleanly") } } +func TestClient_StdinBuffer(t *testing.T) { + process := helperProcess("stdin") + process.Stdin = bytes.NewBufferString("hello") + c := NewClient(&ClientConfig{ + Cmd: process, + HandshakeConfig: testHandshake, + Plugins: testPluginMap, + }) + defer c.Kill() + + _, err := c.Start() + if err != nil { + t.Fatalf("error: %s", err) + } + + for { + if c.Exited() { + break + } + + time.Sleep(50 * time.Millisecond) + } + + if !process.ProcessState.Success() { + t.Fatal("process didn't exit cleanly") + } +} func TestClient_SecureConfig(t *testing.T) { // Test failure case secureConfig := &SecureConfig{