automation-tests/common/pkg/ssh/ssh_test.go

120 lines
3.7 KiB
Go

package ssh
import (
"net/url"
"os"
"testing"
"github.com/stretchr/testify/require"
)
// these tests cannot check for "true" functionality
// in order to do that, you need two machines and a place to connect to/from
// these will error but we can check the error message to make sure it is an ssh error message
// not one for a segfault or parsing error
func TestCreate(t *testing.T) {
options := ConnectionCreateOptions{
Port: 22,
Path: "localhost",
Name: "testing",
Socket: "/run/user/foo/podman/podman.sock",
Default: false,
}
err := Create(&options, NativeMode)
// exit status 255 is what you get when ssh is not enabled or the connection failed
// this means up to that point, everything worked
require.Error(t, err, "exit status 255")
err = Create(&options, GolangMode)
// the error with golang should be nil, we want this to work if we are given a socket path
// that is the current podman behavior
require.Nil(t, err)
}
func TestExec(t *testing.T) {
options := ConnectionExecOptions{
Port: 22,
Host: "localhost",
Args: []string{"ls", "/"},
}
_, err := Exec(&options, NativeMode)
// exit status 255 is what you get when ssh is not enabled or the connection failed
// this means up to that point, everything worked
require.Error(t, err, "exit status 255")
_, err = Exec(&options, GolangMode)
require.Error(t, err, "failed to connect: ssh: handshake failed: ssh: disconnect, reason 2: Too many authentication failures")
}
func TestExecWithInput(t *testing.T) {
options := ConnectionExecOptions{
Port: 22,
Host: "localhost",
Args: []string{"md5sum"},
}
input, err := os.Open("/etc/fstab")
require.NoError(t, err)
defer input.Close()
_, err = ExecWithInput(&options, NativeMode, input)
// exit status 255 is what you get when ssh is not enabled or the connection failed
// this means up to that point, everything worked
require.Error(t, err, "exit status 255")
_, err = ExecWithInput(&options, GolangMode, input)
require.Error(t, err, "failed to connect: ssh: handshake failed: ssh: disconnect, reason 2: Too many authentication failures")
}
func TestDial(t *testing.T) {
options := ConnectionDialOptions{
Port: 22,
Host: "localhost",
}
_, err := Dial(&options, NativeMode)
// exit status 255 is what you get when ssh is not enabled or the connection failed
// this means up to that point, everything worked
require.Error(t, err, "exit status 255")
_, err = Dial(&options, GolangMode)
require.Error(t, err, "failed to connect: ssh: handshake failed: ssh: disconnect, reason 2: Too many authentication failures")
// Test again without specifying sshd port, and code should default to port 22
options = ConnectionDialOptions{
Host: "localhost",
}
_, err = Dial(&options, NativeMode)
// exit status 255 is what you get when ssh is not enabled or the connection failed
// this means up to that point, everything worked
require.Error(t, err, "exit status 255")
_, err = Dial(&options, GolangMode)
require.Error(t, err, "failed to connect: ssh: handshake failed: ssh: disconnect, reason 2: Too many authentication failures")
}
func TestScp(t *testing.T) {
f, err := os.CreateTemp("", "")
require.Nil(t, err)
defer os.Remove(f.Name())
options := ConnectionScpOptions{
User: &url.Userinfo{},
Source: f.Name(),
Destination: "localhost:/does/not/exist",
Port: 22,
}
_, err = Scp(&options, NativeMode)
// exit status 255 is what you get when ssh is not enabled or the connection failed
// this means up to that point, everything worked
require.Error(t, err, "exit status 255")
_, err = Scp(&options, GolangMode)
require.Error(t, err, "failed to connect: ssh: handshake failed: ssh: disconnect, reason 2: Too many authentication failures")
}