63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package agent
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// A terminal opened with a folder starts its shell there; a folder that is
|
|
// not there leaves it at home.
|
|
func TestStartPTYDir(t *testing.T) {
|
|
dir, err := filepath.EvalSymlinks(t.TempDir())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
sub := filepath.Join(dir, "sub dir")
|
|
if err := os.Mkdir(sub, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got := ptyPwd(t, sub); got != sub {
|
|
t.Fatalf("pwd = %q, want %q", got, sub)
|
|
}
|
|
home, _ := filepath.EvalSymlinks(homeDir(""))
|
|
if got := ptyPwd(t, filepath.Join(dir, "missing")); got != home {
|
|
t.Fatalf("pwd for a missing folder = %q, want home %q", got, home)
|
|
}
|
|
}
|
|
|
|
// ptyPwd opens a terminal at dir and returns where its shell is.
|
|
func ptyPwd(t *testing.T, dir string) string {
|
|
t.Helper()
|
|
t.Setenv("SHELL", "/bin/sh")
|
|
p, err := StartPTY("", dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer p.Close()
|
|
if _, err := p.Write([]byte("echo \"@@$(pwd -P)@@\"\n")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var out strings.Builder
|
|
buf := make([]byte, 4096)
|
|
deadline := time.Now().Add(5 * time.Second)
|
|
for time.Now().Before(deadline) {
|
|
n, err := p.Read(buf)
|
|
out.Write(buf[:n])
|
|
s := out.String()
|
|
// The echoed command line has "@@$(pwd" in it; the answer does not.
|
|
for _, part := range strings.Split(s, "@@") {
|
|
if strings.HasPrefix(part, "/") && strings.Contains(s, part+"@@") {
|
|
return part
|
|
}
|
|
}
|
|
if err != nil {
|
|
break
|
|
}
|
|
}
|
|
t.Fatalf("no pwd in %q", out.String())
|
|
return ""
|
|
}
|