1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
15 "git.curoverse.com/arvados.git/lib/dispatchcloud/test"
16 "golang.org/x/crypto/ssh"
17 check "gopkg.in/check.v1"
20 // Gocheck boilerplate
21 func Test(t *testing.T) {
25 var _ = check.Suite(&ExecutorSuite{})
27 type testTarget struct {
31 func (*testTarget) VerifyHostKey(ssh.PublicKey, *ssh.Client) error {
35 type ExecutorSuite struct{}
37 func (s *ExecutorSuite) TestExecute(c *check.C) {
38 command := `foo 'bar' "baz"`
39 stdinData := "foobar\nbaz\n"
40 _, hostpriv := test.LoadTestKey(c, "../test/sshkey_vm")
41 clientpub, clientpriv := test.LoadTestKey(c, "../test/sshkey_dispatch")
42 for _, exitcode := range []int{0, 1, 2} {
44 SSHService: test.SSHService{
45 Exec: func(cmd string, stdin io.Reader, stdout, stderr io.Writer) uint32 {
46 c.Check(cmd, check.Equals, command)
50 io.WriteString(stdout, "stdout\n")
54 io.WriteString(stderr, "stderr\n")
57 buf, err := ioutil.ReadAll(stdin)
59 c.Check(err, check.IsNil)
63 _, err = stdout.Write(buf)
64 c.Check(err, check.IsNil)
65 return uint32(exitcode)
68 AuthorizedKeys: []ssh.PublicKey{clientpub},
72 c.Check(err, check.IsNil)
73 c.Logf("srv address %q", srv.Address())
77 exr.SetSigners(clientpriv)
79 done := make(chan bool)
81 stdout, stderr, err := exr.Execute(command, bytes.NewBufferString(stdinData))
83 c.Check(err, check.IsNil)
85 c.Check(err, check.NotNil)
86 err, ok := err.(*ssh.ExitError)
87 c.Assert(ok, check.Equals, true)
88 c.Check(err.ExitStatus(), check.Equals, exitcode)
90 c.Check(stdout, check.DeepEquals, []byte("stdout\n"+stdinData))
91 c.Check(stderr, check.DeepEquals, []byte("stderr\n"))
95 timeout := time.NewTimer(time.Second)