120 lines
3.7 KiB
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")
|
|
}
|