2022-02-17 16:44:49 +00:00
|
|
|
//go:build !windows
|
|
|
|
|
|
|
|
package pty_test
|
|
|
|
|
|
|
|
import (
|
2023-11-23 17:55:36 +00:00
|
|
|
"os"
|
2022-02-17 16:44:49 +00:00
|
|
|
"os/exec"
|
|
|
|
"testing"
|
|
|
|
|
2022-09-12 16:27:51 +00:00
|
|
|
"github.com/gliderlabs/ssh"
|
2022-07-27 19:23:28 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
2022-02-17 16:44:49 +00:00
|
|
|
"go.uber.org/goleak"
|
2022-09-12 16:27:51 +00:00
|
|
|
"golang.org/x/xerrors"
|
2022-02-19 05:13:32 +00:00
|
|
|
|
2023-08-18 18:55:43 +00:00
|
|
|
"github.com/coder/coder/v2/pty"
|
|
|
|
"github.com/coder/coder/v2/pty/ptytest"
|
2022-02-17 16:44:49 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestMain(m *testing.M) {
|
|
|
|
goleak.VerifyTestMain(m)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestStart(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
t.Run("Echo", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
2023-05-03 07:43:05 +00:00
|
|
|
pty, ps := ptytest.Start(t, pty.Command("echo", "test"))
|
2023-04-24 10:53:57 +00:00
|
|
|
|
2022-02-17 16:44:49 +00:00
|
|
|
pty.ExpectMatch("test")
|
2022-07-27 19:23:28 +00:00
|
|
|
err := ps.Wait()
|
|
|
|
require.NoError(t, err)
|
2023-04-24 10:53:57 +00:00
|
|
|
err = pty.Close()
|
|
|
|
require.NoError(t, err)
|
2022-07-27 19:23:28 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Kill", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
2023-05-03 07:43:05 +00:00
|
|
|
pty, ps := ptytest.Start(t, pty.Command("sleep", "30"))
|
2022-07-27 19:23:28 +00:00
|
|
|
err := ps.Kill()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = ps.Wait()
|
2023-11-23 17:55:36 +00:00
|
|
|
var exitErr *exec.ExitError
|
|
|
|
require.True(t, xerrors.As(err, &exitErr))
|
|
|
|
assert.NotEqual(t, 0, exitErr.ExitCode())
|
|
|
|
err = pty.Close()
|
|
|
|
require.NoError(t, err)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Interrupt", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
pty, ps := ptytest.Start(t, pty.Command("sleep", "30"))
|
|
|
|
err := ps.Signal(os.Interrupt)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = ps.Wait()
|
2022-07-27 19:23:28 +00:00
|
|
|
var exitErr *exec.ExitError
|
|
|
|
require.True(t, xerrors.As(err, &exitErr))
|
|
|
|
assert.NotEqual(t, 0, exitErr.ExitCode())
|
2023-04-24 10:53:57 +00:00
|
|
|
err = pty.Close()
|
|
|
|
require.NoError(t, err)
|
2022-02-17 16:44:49 +00:00
|
|
|
})
|
2022-08-23 18:19:57 +00:00
|
|
|
|
2022-09-12 16:27:51 +00:00
|
|
|
t.Run("SSH_TTY", func(t *testing.T) {
|
2022-08-23 18:19:57 +00:00
|
|
|
t.Parallel()
|
2022-09-12 16:27:51 +00:00
|
|
|
opts := pty.WithPTYOption(pty.WithSSHRequest(ssh.Pty{
|
|
|
|
Window: ssh.Window{
|
|
|
|
Width: 80,
|
|
|
|
Height: 24,
|
|
|
|
},
|
|
|
|
}))
|
2023-09-27 12:34:40 +00:00
|
|
|
pty, ps := ptytest.Start(t, pty.Command(`/bin/sh`, `-c`, `env | grep SSH_TTY`), opts)
|
2022-09-12 16:27:51 +00:00
|
|
|
pty.ExpectMatch("SSH_TTY=/dev/")
|
2022-08-23 18:19:57 +00:00
|
|
|
err := ps.Wait()
|
|
|
|
require.NoError(t, err)
|
2023-04-24 10:53:57 +00:00
|
|
|
err = pty.Close()
|
|
|
|
require.NoError(t, err)
|
2022-08-23 18:19:57 +00:00
|
|
|
})
|
2022-02-17 16:44:49 +00:00
|
|
|
}
|
2023-04-24 10:53:57 +00:00
|
|
|
|
|
|
|
// these constants/vars are used by Test_Start_copy
|
|
|
|
|
|
|
|
const cmdEcho = "echo"
|
|
|
|
|
|
|
|
var argEcho = []string{"test"}
|
|
|
|
|
|
|
|
// these constants/vars are used by Test_Start_truncate
|
|
|
|
|
|
|
|
const (
|
|
|
|
countEnd = 1000
|
|
|
|
cmdCount = "sh"
|
|
|
|
)
|
|
|
|
|
|
|
|
var argCount = []string{"-c", `
|
|
|
|
i=0
|
|
|
|
while [ $i -ne 1000 ]
|
|
|
|
do
|
|
|
|
i=$(($i+1))
|
|
|
|
echo "$i"
|
|
|
|
done
|
|
|
|
`}
|
2023-05-03 07:43:05 +00:00
|
|
|
|
|
|
|
// these constants/vars are used by Test_Start_cancel_context
|
|
|
|
|
|
|
|
const cmdSleep = "sleep"
|
|
|
|
|
|
|
|
var argSleep = []string{"30"}
|